PluginProbe ʕ •ᴥ•ʔ
Responsive Lightbox & Gallery / 2.5.3
Responsive Lightbox & Gallery v2.5.3
2.7.8 trunk 1.0.0 1.0.1 1.0.1.1 1.0.2 1.0.3 1.0.4 1.1.0 1.1.1 1.1.2 1.2.0 1.2.1 1.2.2 1.2.3 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.4.0 1.4.0.1 1.4.1 1.4.11 1.4.12 1.4.13 1.4.14 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.6.0 1.6.1 1.6.10 1.6.11 1.6.12 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 2.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.1 2.2.0 2.2.1 2.2.2 2.2.3 2.2.3.1 2.3.0 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.4.9 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.6.0 2.6.1 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7
responsive-lightbox / js / admin-folders.js
responsive-lightbox / js Last commit date
admin-folders.js 9 months ago admin-galleries.js 3 years ago admin-gallery.js 4 years ago admin-media.js 1 year ago admin-plugins.js 3 years ago admin-widgets.js 3 years ago admin.js 3 years ago front-basicmasonry.js 3 years ago front-basicslider.js 1 year ago front.js 9 months ago gutenberg.min.js 4 years ago
admin-folders.js
1274 lines
1 ( function( $ ) {
2
3 var rl_folder_id = 0;
4 var rl_ps = null;
5 var grid_frame = null;
6 var active_mode = '';
7 var move_node_failed = false;
8 var disable_redirect = false;
9 var attachments_browser = null;
10 var last_priority = 2;
11 var event_data = {};
12
13 function initFolders() {
14 var RLWPMediaViewMediaFramePost = wp.media.view.MediaFrame.Post;
15
16 // extend media frame
17 wp.media.view.MediaFrame.Post = RLWPMediaViewMediaFramePost.extend( {
18 initialize: function() {
19 // calling the initalize method from the current frame before adding new functionality
20 RLWPMediaViewMediaFramePost.prototype.initialize.apply( this, arguments );
21
22 // events
23 this.on( 'content:render', this.contentRender, this );
24 },
25 contentRender: function( view ) {
26 // valid view?
27 if ( view !== null ) {
28 // get all selects
29 var selects = view.toolbar.secondary.$el.find( 'select.attachment-filters' );
30
31 // fix it only for more then 2 selects (default wp)
32 if ( selects.length > 2 ) {
33 // calculate new width
34 var number = parseInt( 100 / selects.length ) - 2;
35
36 $( selects ).each( function( i, el ) {
37 $( el ).css( 'width', 'calc(' + number + '% - 12px)' );
38 } );
39 }
40 }
41 }
42 } );
43
44 // add new media folder filter
45 var RLWPMediaViewAttachmentFilters = wp.media.view.AttachmentFilters.extend( {
46 id: 'media-attachment-rl-folders-filters',
47 className: 'attachment-filters attachment-rl-folders-filter',
48 change: function() {
49 wp.media.view.AttachmentFilters.prototype.change.apply( this, arguments );
50
51 if ( grid_frame !== null )
52 grid_frame.controller.states.get( 'library' ).get( 'library' ).observe( wp.Uploader.queue );
53 },
54 createFilters: function() {
55 var filters = {};
56 var term_id = 0;
57
58 // root
59 var root = {
60 text: rlFoldersArgs.root,
61 priority: 1,
62 props: {
63 [rlFoldersArgs.taxonomy]: 0,
64 'force_update': 0,
65 'include_children': false
66 }
67 };
68
69 // media folder
70 if ( rlFoldersArgs.terms !== '' ) {
71 var terms = $( $.parseHTML( rlFoldersArgs.terms ) ).find( 'option' );
72
73 if ( terms.length > 0 ) {
74 filters[0] = root;
75
76 terms.each( function( i, option ) {
77 term_id = parseInt( $( option ).val() || 0 );
78 term_id = ( term_id === 0 ? 'all' : term_id );
79 last_priority = i + 2;
80
81 // get html value
82 var text = $( option ).html();
83
84 // set new html as text
85 $( option ).text( text );
86
87 filters[term_id] = {
88 text: $( option ).text(),
89 priority: last_priority,
90 props: {
91 [rlFoldersArgs.taxonomy]: term_id,
92 'force_update': 0,
93 'include_children': false
94 }
95 };
96 } );
97 }
98 // all files
99 } else {
100 filters['all'] = {
101 text: rlFoldersArgs.all_terms,
102 priority: 1,
103 props: {
104 [rlFoldersArgs.taxonomy]: 'all',
105 'force_update': 0,
106 'include_children': true
107 }
108 };
109
110 filters[0] = root;
111 }
112
113 this.filters = filters;
114 }
115 } );
116
117 var RLFoldersAttachmentsBrowser = wp.media.view.AttachmentsBrowser;
118
119 // extend AttachmentsBrowser
120 wp.media.view.AttachmentsBrowser = wp.media.view.AttachmentsBrowser.extend( {
121 createToolbar: function() {
122 // load the original toolbar
123 RLFoldersAttachmentsBrowser.prototype.createToolbar.call( this );
124
125 attachments_browser = this;
126
127 // skip remote library
128 if ( this.model.get( 'id' ) !== 'rl-remote-library' ) {
129 this.toolbar.set( 'RLfoldersFilterLabel', new wp.media.view.Label( {
130 value: 'Filter by folder',
131 attributes: {
132 'for': 'media-attachment-rl-folders-filters'
133 },
134 priority: -75
135 } ).render() );
136
137 this.toolbar.set( 'RLfoldersAttachmentFilters', new RLWPMediaViewAttachmentFilters( {
138 controller: this.controller,
139 model: this.collection.props,
140 priority: -75
141 } ).render() );
142 }
143 }
144 } );
145
146 // extend AttachmentCompat
147 var RLAttachmentCompat = wp.media.view.AttachmentCompat;
148
149 wp.media.view.AttachmentCompat = wp.media.view.AttachmentCompat.extend( {
150 initialize: function() {
151 // call original function
152 RLAttachmentCompat.prototype.initialize.call( this );
153
154 var oldSaveCompat = this.model.saveCompat;
155
156 // update saveCompat to save additional data
157 this.model.saveCompat = function( data, options ) {
158 var select = $( '.rl-media-tag-select2' );
159 var selected = select.select2( 'data' );
160 var tags = [];
161
162 for ( i = 0; i < selected.length; i++ ) {
163 tags.push( selected[i].id );
164 }
165
166 // update tags
167 data[select.attr( 'name' )] = tags.join( ',' );
168
169 // call original function
170 return oldSaveCompat.call( this, data, options );
171 };
172 },
173 render: function() {
174 // call original function
175 RLAttachmentCompat.prototype.render.call( this );
176
177 // remove select2-dropdown--below
178 $( '.select2-container--open' ).remove();
179
180 // refresh select2
181 setTimeout( initSelect2, 5 );
182 },
183 save: function( event ) {
184 // skip select2 textarea
185 if ( $( event.target ).hasClass( 'select2-search__field' ) )
186 return;
187
188 // call original function
189 RLAttachmentCompat.prototype.save.call( this, event );
190 }
191 } );
192 }
193
194 // ready event
195 $( function() {
196 // wpuploader
197 if ( typeof wp.Uploader !== 'undefined' ) {
198 // extend uploader to apply dynamic folder ID
199 $.extend( wp.Uploader.prototype, {
200 init: function() {
201 this.uploader.bind( 'BeforeUpload', function( file ) {
202 file.settings.multipart_params.rl_folders_upload_files_term_id = rl_folder_id;
203 } );
204 }
205 } );
206 // plupload
207 } else if ( typeof uploader !== 'undefined' ) {
208 uploader.bind( 'BeforeUpload', function( file ) {
209 uploader.settings.multipart_params.rl_folders_upload_files_term_id = rl_folder_id;
210 } );
211 }
212
213 // do nothing for wp_enqueue_media
214 if ( rlFoldersArgs.page === 'media' ) {
215 initFolders();
216
217 // folder change
218 $( document ).on( 'change', '#media-attachment-rl-folders-filters', function() {
219 $( '#rl_folders_upload_files' ).val( $( this ).val() );
220 } );
221 } else {
222 var active_nodes = [];
223 var plugins = ['sort', 'dnd'];
224
225 // detect active library mode
226 active_mode = ( $( 'body' ).hasClass( 'rl-folders-upload-grid-mode' ) ? 'grid' : 'list' );
227
228 // add media folders container
229 if ( active_mode === 'list' ) {
230 // add tree
231 $( '#posts-filter' ).before( rlFoldersArgs.template );
232
233 // add spinner
234 $( '.filter-items .actions' ).append( '<span class="spinner"></span>' );
235
236 // initialize draggable
237 draggable( 'list' );
238 // grid
239 } else {
240 // add tree
241 $( '#wp-media-grid' ).append( rlFoldersArgs.template );
242
243 initFolders();
244 }
245
246 // activate wholerow plugin if needed
247 if ( rlFoldersArgs.wholerow )
248 plugins.push( 'wholerow' );
249
250 // initialize jstree
251 $( '#rl-folders-tree' ).jstree( {
252 'core': {
253 'check_callback': function( operation, node, node_parent, node_position, more ) {
254 // prevent moving folders to 'all files' folder
255 return ! ( operation === 'move_node' && node_parent.parent === '#' && node_parent.a_attr['data-term_id'] === 'all' );
256 },
257 'multiple': false,
258 'expand_selected_onload': false,
259 'worker': false,
260 'animation': 150
261 },
262 'dnd': {
263 'is_draggable': function( object ) {
264 // prevent moving main folders
265 return ( object[0].parent !== '#' );
266 }
267 },
268 'sort': function( a, b ) {
269 // do not sort main and root nodes
270 if ( a === 'j1_1' )
271 return -1;
272 else
273 return this.get_text( a ).toLowerCase() > this.get_text( b ).toLowerCase() ? 1 : -1;
274 },
275 'plugins': plugins
276 } );
277
278 // apply theme
279 $( '#rl-folders-tree' ).jstree( 'set_theme', rlFoldersArgs.theme );
280
281 // handle folder click
282 $( document ).on( 'click', '.jstree-anchor', click_node );
283
284 // add new folder
285 $( document ).on( 'click', '.rl-folders-add-new-folder', function() {
286 // get current node
287 var parent_node = $( '#rl-folders-tree' ).jstree().get_selected().toString();
288
289 // create new node
290 var new_node = $( '#rl-folders-tree' ).jstree( 'create_node', parent_node, rlFoldersArgs.new_folder, 'inside', function() {}, true );
291
292 // deselect old node
293 $( '#rl-folders-tree' ).jstree( 'deselect_node', parent_node );
294
295 if ( active_mode === 'list' ) {
296 // disable redirect in select_node
297 disable_redirect = true;
298 }
299
300 // select new node
301 $( '#rl-folders-tree' ).jstree( 'select_node', new_node, true, true );
302
303 // open old node
304 $( '#rl-folders-tree' ).jstree( 'open_node', parent_node, function() {
305 var link = $( '#' + new_node + '_anchor' );
306 var content = link.html().match( '<i(?:.+)?/i>' )[0];
307 var tree = $( '#rl-folders-tree' ).jstree( true ).get_json( '#', { 'flat': true } );
308
309 // unbind event
310 $( document ).off( 'click', '.jstree-anchor' );
311
312 // disable all nodes
313 $.each( tree, function( key, value ) {
314 if ( value.state.selected == false ) {
315 $( '#rl-folders-tree' ).jstree( 'disable_node', value.id );
316 }
317 } );
318
319 // hide icons
320 $( '.rl-folders-add-new-folder' ).hide();
321
322 // show icons
323 $( '.rl-folders-save-new-folder, .rl-folders-cancel-new-folder' ).show();
324
325 // disable icons
326 $( '.rl-folders-rename-folder, .rl-folders-delete-folder, .rl-folders-expand-folder, .rl-folders-collapse-folder' ).addClass( 'disabled-link' );
327
328 // hide node, show input
329 link.hide().after( '<span id="' + parent_node + '_span">' + content + '<input id="rl-folders-enter-new-folder" type="text" value="' + rlFoldersArgs.new_folder + '" placeholder="" data-term_id="' + parseInt( link.data( 'term_id' ) ) + '" data-nof="0" /></span>' );
330
331 // select text inside input
332 $( '#rl-folders-enter-new-folder' ).trigger( 'select' );
333
334 $( '#rl-folders-enter-new-folder' ).on( 'keyup', function( e ) {
335 // enter button
336 if ( e.which === 13 ) {
337 save_node( true, parseInt( $( '#' + parent_node + '_anchor' ).data( 'term_id' ) ) );
338 // escape button
339 } else if ( e.which === 27 ) {
340 restore_node( true, true );
341 }
342 } );
343 }, $( '#rl-folders-tree' ).jstree().settings.core.animation );
344
345 return false;
346 } );
347
348 // rename folder
349 $( document ).on( 'click', '.rl-folders-rename-folder', function() {
350 var node_id = $( '#rl-folders-tree' ).jstree().get_selected().toString();
351 var link = $( '#' + node_id + '_anchor' );
352 var term_id = link.data( 'term_id' );
353
354 // prevent renaming main folders ('root' and 'all files')
355 if ( term_id === 'all' || term_id === 0 )
356 return false;
357
358 var content = link.html().match( '(<i(?:.+)?/i>)(.+)' );
359 var split = content[2].split( ' ' );
360 var nof = split.pop().match( /\d+/ )[0];
361 var name = split.join( ' ' );
362 var tree = $( '#rl-folders-tree' ).jstree( true ).get_json( '#', { 'flat': true } );
363
364 // unbind event
365 $( document ).off( 'click', '.jstree-anchor' );
366
367 // disable all nodes
368 $.each( tree, function( key, value ) {
369 if ( value.state.selected == false ) {
370 $( '#rl-folders-tree' ).jstree( 'disable_node', value.id );
371 }
372 } );
373
374 // hide icons
375 $( '.rl-folders-rename-folder' ).hide();
376
377 // show icons
378 $( '.rl-folders-save-folder, .rl-folders-cancel-folder' ).show();
379
380 // disable icons
381 $( '.rl-folders-add-new-folder, .rl-folders-delete-folder, .rl-folders-expand-folder, .rl-folders-collapse-folder' ).addClass( 'disabled-link' );
382
383 // hide node, show input
384 link.hide().after( '<span id="' + node_id + '_span">' + content[1] + '<input id="rl-folders-enter-folder" type="text" value="" placeholder="" data-term_id="' + parseInt( term_id ) + '" data-nof="' + nof + '" /></span>' );
385
386 var input = $( 'span#' + node_id + '_span input' );
387
388 // set value
389 input.val( name );
390
391 // set placeholder
392 input[0].placeholder = name;
393
394 // select text inside input
395 $( '#rl-folders-enter-folder' ).trigger( 'select' );
396
397 $( '#rl-folders-enter-folder' ).on( 'keyup', function( e ) {
398 // enter button
399 if ( e.which === 13 ) {
400 save_node( false, 0 );
401 // escape button
402 } else if ( e.which === 27 )
403 restore_node( false, false );
404 } );
405
406 return false;
407 } );
408
409 // save folder
410 $( document ).on( 'click', '.rl-folders-save-folder', function() {
411 save_node( false, 0 );
412
413 return false;
414 } );
415
416 // save new folder
417 $( document ).on( 'click', '.rl-folders-save-new-folder', function() {
418 save_node( true, parseInt( $( '#' + $( '#rl-folders-tree' ).jstree().get_selected().toString() + '_anchor' ).data( 'term_id' ) ) );
419
420 return false;
421 } );
422
423 // cancel renaming folder
424 $( document ).on( 'click', '.rl-folders-cancel-folder', function() {
425 restore_node( false, false );
426
427 return false;
428 } );
429
430 // cancel adding new folder
431 $( document ).on( 'click', '.rl-folders-cancel-new-folder', function() {
432 restore_node( true, true );
433
434 return false;
435 } );
436
437 // delete folder
438 $( document ).on( 'click', '.rl-folders-delete-folder', function() {
439 if ( ! $( this ).hasClass( 'disabled-link' ) && confirm( rlFoldersArgs.remove_children ? rlFoldersArgs.delete_terms : rlFoldersArgs.delete_term ) ) {
440 // show spinner
441 toggle_spinner( true );
442
443 var node_id = $( '#rl-folders-tree' ).jstree().get_selected().toString();
444 var term_id = parseInt( $( '#' + node_id + '_anchor' ).data( 'term_id' ) );
445
446 // delete term with children using ajax
447 $.post( ajaxurl, {
448 action: 'rl-folders-delete-term',
449 term_id: term_id,
450 children: rlFoldersArgs.remove_children ? 1 : 0,
451 nonce: rlFoldersArgs.nonce
452 } ).done( function( response ) {
453 try {
454 if ( response.success ) {
455 // get parent node
456 var parent = $( '#rl-folders-tree' ).jstree( 'get_parent', node_id );
457
458 // update upload select
459 update_upload_select( $( response.data ).find( 'option' ), '' );
460
461 // remove children?
462 if ( ! rlFoldersArgs.remove_children && ! $( '#rl-folders-tree' ).jstree( 'is_leaf', node_id ) ) {
463 // open removing node
464 $( '#rl-folders-tree' ).jstree( 'open_node', node_id, function() {
465 // move every child to a new parent
466 $( '#rl-folders-tree' ).jstree( 'get_children_dom', node_id ).each( function( i, el ) {
467 move_node( $( el ).attr( 'id' ), parent );
468 } );
469 }, $( '#rl-folders-tree' ).jstree().settings.core.animation );
470 }
471
472 // delete node
473 $( '#rl-folders-tree' ).jstree( 'delete_node', node_id );
474
475 // select parent node
476 $( '#rl-folders-tree' ).jstree( 'select_node', parent );
477
478 // force to update view
479 $( '#media-attachment-rl-folders-filters' ).val( $( '#' + parent + '_anchor' ).data( 'term_id' ) ).trigger( 'change' );
480
481 refresh_scrollbars();
482 } else {
483 //@TODO
484 }
485 } catch( e ) {
486 //@TODO
487 }
488
489 // hide spinner
490 toggle_spinner( false );
491 } ).fail( function() {
492 // hide spinner
493 toggle_spinner( false );
494 } );
495 }
496
497 return false;
498 } );
499
500 // expand folder
501 $( document ).on( 'click', '.rl-folders-expand-folder', function() {
502 if ( ! $( this ).hasClass( 'disabled-link' ) ) {
503 $( '#rl-folders-tree' ).jstree( 'open_all', $( '#rl-folders-tree' ).jstree().get_selected(), $( '#rl-folders-tree' ).jstree().settings.core.animation );
504 }
505
506 return false;
507 } );
508
509 // collapse folder
510 $( document ).on( 'click', '.rl-folders-collapse-folder', function() {
511 if ( ! $( this ).hasClass( 'disabled-link' ) ) {
512 $( '#rl-folders-tree' ).jstree( 'close_all', $( '#rl-folders-tree' ).jstree().get_selected(), $( '#rl-folders-tree' ).jstree().settings.core.animation );
513 }
514
515 return false;
516 } );
517
518 // select folder event handler
519 $( '#rl-folders-tree' ).on( 'select_node.jstree', function() {
520 // get node id
521 var node_id = $( '#rl-folders-tree' ).jstree().get_selected().toString();
522
523 // list mode?
524 if ( active_mode === 'list' ) {
525 if ( disable_redirect ) {
526 disable_redirect = false;
527 } else {
528 window.location.replace( $( '#' + node_id + '_anchor' ).attr( 'href' ) );
529 }
530
531 return;
532 } else {
533 // update mode links
534 update_mode_link( 'grid' );
535 update_mode_link( 'list' );
536 }
537
538 // get term id of selected node
539 var term_id = $( '#' + node_id + '_anchor' ).data( 'term_id' );
540
541 // select term id in dropdown
542 $( '#rl_folders_upload_files' ).val( term_id === 'all' ? 0 : term_id );
543
544 // update term_id in uploader parameters
545 rl_folder_id = parseInt( term_id );
546
547 if ( isNaN( rl_folder_id ) )
548 rl_folder_id = 0;
549
550 // enable/disable icons for folders
551 if ( term_id === 'all' )
552 $( '.rl-folders-add-new-folder, .rl-folders-rename-folder, .rl-folders-delete-folder' ).addClass( 'disabled-link' );
553 else if ( term_id === 0 ) {
554 $( '.rl-folders-rename-folder, .rl-folders-delete-folder' ).addClass( 'disabled-link' );
555 $( '.rl-folders-add-new-folder' ).removeClass( 'disabled-link' );
556 } else
557 $( '.rl-folders-add-new-folder, .rl-folders-rename-folder, .rl-folders-delete-folder' ).removeClass( 'disabled-link' );
558
559 // enable/disable icons for non-empty folders
560 if ( $( '#rl-folders-tree' ).jstree( 'is_leaf', node_id ) )
561 $( '.rl-folders-expand-folder, .rl-folders-collapse-folder' ).addClass( 'disabled-link' );
562 else
563 $( '.rl-folders-expand-folder, .rl-folders-collapse-folder' ).removeClass( 'disabled-link' );
564 } );
565
566 // rename node event
567 $( '#rl-folders-tree' ).on( 'rename_node.jstree', function( event, tree ) {
568 // new node?
569 if ( event_data.create ) {
570 // set term id
571 tree.node.a_attr['data-term_id'] = event_data.response.term_id;
572
573 // set url
574 tree.node.a_attr.href = event_data.response.url;
575
576 // clear event data
577 event_data = {};
578 }
579 } );
580
581 // jstree is ready
582 $( '#rl-folders-tree' ).on( 'ready.jstree', function( e, data ) {
583 if ( active_mode === 'list' )
584 droppable( 'list' );
585
586 // initialize perfect scrollbar
587 rl_ps = new PerfectScrollbar( '#rl-folders-tree', {
588 wheelSpeed: 3,
589 wheelPropagation: true,
590 minScrollbarLength: 30
591 } );
592
593 // replace edit function to prevent using F2 key natively by jstree
594 $.jstree.core.prototype.edit = function( obj, default_text, callback ) {
595 $( '.rl-folders-rename-folder' ).trigger( 'click' );
596 };
597
598 // update mode links
599 update_mode_link( 'grid' );
600 update_mode_link( 'list' );
601 } );
602
603 // close all folders event
604 $( '#rl-folders-tree' ).on( 'close_all.jstree', function() {
605 refresh_scrollbars();
606 } );
607
608 // open all folders event
609 $( '#rl-folders-tree' ).on( 'open_all.jstree', function() {
610 refresh_scrollbars();
611 } );
612
613 // open folder event handler
614 $( '#rl-folders-tree' ).on( 'close_node.jstree', function() {
615 refresh_scrollbars();
616 } );
617
618 // open folder event handler
619 $( '#rl-folders-tree' ).on( 'open_node.jstree', function() {
620 refresh_scrollbars();
621
622 if ( active_mode === 'grid' ) {
623 // refresh tree elements to make children of selected node droppable
624 droppable( 'grid' );
625 }
626 } );
627
628 // after ajax complete
629 $( document ).on( 'ajaxComplete', function( event, xhr, object ) {
630 // check ajax action
631 var action = parse_str( 'action', object.data );
632
633 // attachments were moved
634 if ( action === 'rl-folders-move-attachments' ) {
635 // refresh droppable
636 droppable( active_mode );
637 // built-in query attachments
638 } else if ( action === 'query-attachments' ) {
639 // initialize droppable
640 droppable( 'grid' );
641
642 // initialize draggable
643 draggable( 'grid' );
644
645 // empty frame?
646 if ( grid_frame === null ) {
647 // store grid frame
648 grid_frame = wp.media.frame.content.get();
649
650 // set root as main folder for uploads
651 rl_folder_id = 0;
652 }
653 }
654 } );
655
656 // folder change
657 $( document ).on( 'change', '#media-attachment-rl-folders-filters', function() {
658 if ( active_mode === 'list' )
659 return;
660
661 var node_id = $( '#rl-folders-tree' ).jstree().get_selected().toString();
662
663 // visiting node for the first time?
664 if ( typeof active_nodes[node_id] === 'undefined' )
665 active_nodes[node_id] = true;
666 else {
667 var term_id = $( this ).val();
668
669 // force ajax call
670 grid_frame.collection.props.set( 'force_update', + new Date() );
671
672 // make sure dropdown has valid term_id selected
673 $( this ).val( term_id );
674 }
675 } );
676
677 // change parent of the dragged folder
678 $( '#rl-folders-tree' ).on( 'move_node.jstree', function( e, object ) {
679 // prevent infinite loop
680 if ( move_node_failed ) {
681 move_node_failed = false;
682
683 return false;
684 }
685
686 // show spinner
687 toggle_spinner( true );
688
689 $.post( ajaxurl, {
690 action: 'rl-folders-move-term',
691 term_id: parseInt( object.node.a_attr['data-term_id'] ),
692 parent_id: parseInt( $( '#' + object.parent + '_anchor' ).data( 'term_id' ) ),
693 nonce: rlFoldersArgs.nonce
694 } ).done( function( response ) {
695 try {
696 if ( response.success ) {
697 // update upload select
698 update_upload_select( $( response.data ).find( 'option' ), '' );
699
700 // open parent node
701 $( '#rl-folders-tree' ).jstree( 'open_node', object.parent, '', $( '#rl-folders-tree' ).jstree().settings.core.animation );
702 } else {
703 move_node( object.node.id, object.old_parent, object.old_position );
704 }
705 } catch( e ) {
706 move_node( object.node.id, object.old_parent, object.old_position );
707 }
708
709 // hide spinner
710 toggle_spinner( false );
711 } ).fail( function() {
712 move_node( object.node.id, object.old_parent, object.old_position );
713
714 // hide spinner
715 toggle_spinner( false );
716 } );
717 } );
718
719 $( document ).on( 'click', '.select-mode-toggle-button', function() {
720 if ( grid_frame.controller.isModeActive( 'select' ) ) {
721 // refresh draggable
722 draggable( 'grid' );
723 } else {
724 // hide filters
725 $( '#media-attachment-rl-folders-filters' ).hide();
726 }
727 } );
728 }
729
730 // change uploading folder
731 $( document ).on( 'change', '#rl_folders_upload_files', function() {
732 // update term_id in uploader parameters
733 rl_folder_id = parseInt( $( this ).val() );
734
735 if ( isNaN( rl_folder_id ) )
736 rl_folder_id = 0;
737 } );
738
739 if ( rlFoldersArgs.page !== 'media' ) {
740 // press modal compat attachment left, right or escape key
741 $( document ).on( 'keydown', function( e ) {
742 if ( ( 'INPUT' === e.target.nodeName || 'TEXTAREA' === e.target.nodeName ) && ! ( e.target.readOnly || e.target.disabled ) )
743 return;
744
745 // escape key
746 if ( e.keyCode === 27 )
747 $( '.media-modal-close' ).trigger( 'click' );
748 } );
749 }
750 } );
751
752 // initialize select2 and it's events
753 function initSelect2() {
754 var select = $( '.rl-media-tag-select2' );
755
756 // skip initialization of select2
757 if ( select.length === 0 || select.hasClass( 'select2-hidden-accessible' ) )
758 return;
759
760 // turn off scrolling events
761 $( 'div.attachment-info' ).off( 'scroll' );
762 $( 'div.media-sidebar' ).off( 'scroll' );
763
764 // init select2
765 select.select2( {
766 closeOnSelect: true,
767 scrollAfterSelect: false,
768 allowClear: false,
769 debug: false,
770 multiple: true,
771 width: '100%',
772 minimumInputLength: 2,
773 dropdownCssClass: 'rl-media-tag-select2-dropdown',
774 ajax: {
775 delay: 200,
776 url: ajaxurl,
777 data: function( params ) {
778 return {
779 action: 'ajax-tag-search',
780 tax: 'rl_media_tag',
781 q: params.term
782 }
783 },
784 processResults: function( data ) {
785 var newdata = [];
786
787 // filter results
788 data = data.split( /[\r\n]+/ ).filter( Boolean );
789
790 // prepare select2 format
791 for ( i = 0; i < data.length; i++ ) {
792 newdata[i] = { id: data[i], text: data[i] };
793 }
794
795 return {
796 results: newdata
797 };
798 }
799 }
800 } );
801 }
802
803 // update mode link (grid or list)
804 function update_mode_link( mode ) {
805 var selector = $( '.view-switch > a.view-' + mode );
806 var link = selector.prop( 'href' );
807
808 // get query string
809 var query = link.split( 'upload.php' )[1];
810
811 // parse query string
812 var string = parse_str( rlFoldersArgs.taxonomy, query );
813
814 // get term_id
815 var term = $( '#' + $( '#rl-folders-tree' ).jstree().get_selected().toString() + '_anchor' ).data( 'term_id' );
816
817 if ( mode === 'list' ) {
818 // 'all' on grid is 0 on list
819 if ( term === 'all' )
820 term = 0;
821 // -1 on list is 0 on grid
822 else if ( term === 0 )
823 term = -1;
824 }
825
826 // no 'taxonomy=term_id' in query?
827 if ( string === '' )
828 selector.prop( 'href', link + '&' + rlFoldersArgs.taxonomy + '=' + term );
829 // found pair so replace term_id with new one just in case it's invalid
830 else
831 selector.prop( 'href', link.replace( new RegExp( rlFoldersArgs.taxonomy + '=' + '(-?[0-9]+|all)', 'g' ), rlFoldersArgs.taxonomy + '=' + term ) );
832 }
833
834 // refresh perfect scrollbar
835 function refresh_scrollbars() {
836 setTimeout( function() {
837 rl_ps.update();
838 }, 200 );
839 }
840
841 // droppable (skip 'all files')
842 function droppable( mode ) {
843 // var node_id = $( '#rl-folders-tree' ).jstree().get_selected().toString();
844 var node_id = $( '#rl-folders-tree' ).jstree( 'get_selected', false );
845
846 // is wholerow plugin active?
847 if ( rlFoldersArgs.wholerow ) {
848 var wholerow = $( 'div.jstree-wholerow.jstree-wholerow-clicked' );
849
850 // destroy only selected droppable node first if needed
851 if ( typeof wholerow.droppable( 'instance' ) !== 'undefined' )
852 wholerow.droppable( 'destroy' );
853
854 // droppable nodes selector, skip 'all files' and current folder
855 selector = $( '#rl-folders-tree .jstree-wholerow:not(:eq(0))' ).not( '#' + node_id + ' .jstree-wholerow-clicked' );
856 } else {
857 var anchor = $( '#' + node_id + '_anchor' );
858
859 // destroy only selected droppable node first if needed
860 if ( typeof anchor.droppable( 'instance' ) !== 'undefined' )
861 anchor.droppable( 'destroy' );
862
863 // droppable nodes selector, skip 'all files' and current folder
864 selector = $( '#rl-folders-tree li a.jstree-anchor:not(:eq(0),#' + node_id + '_anchor)' );
865 }
866
867 // list mode
868 if ( mode === 'list' ) {
869 selector.droppable( {
870 activeClass: 'rl-folders-state-active',
871 hoverClass: 'rl-folders-state-hover',
872 accept: '#the-list tr',
873 tolerance: 'pointer',
874 drop: function( event, ui ) {
875 var node = $( event.target ).closest( 'li' ).find( 'a.jstree-anchor' );
876 var old_node = $( '#' + $( '#rl-folders-tree' ).jstree().get_selected().toString() + '_anchor' );
877 var attachments = [];
878 var ids = $( '#the-list .check-column input[type="checkbox"]:checked' );
879 var old_term_id = parseInt( old_node.data( 'term_id' ) );
880 var new_term_id = parseInt( node.data( 'term_id' ) );
881
882 if ( isNaN( old_term_id ) )
883 old_term_id = -1;
884
885 if ( isNaN( new_term_id ) )
886 new_term_id = -1;
887
888 toggle_spinner( true );
889
890 // dropped single unchecked attachment?
891 if ( ids.length === 0 )
892 attachments.push( ui.draggable.find( '.check-column input[type="checkbox"]' ).val() );
893 else {
894 ids.each( function( i, item ) {
895 attachments.push( parseInt( $( item ).val() ) );
896 } );
897 }
898
899 $.post( ajaxurl, {
900 action: 'rl-folders-move-attachments',
901 attachment_ids: attachments,
902 old_term_id: old_term_id,
903 new_term_id: new_term_id,
904 nonce: rlFoldersArgs.nonce
905 } ).done( function( response ) {
906 try {
907 if ( response.success ) {
908 // do not update 'all files' folder or remove attachments from there
909 if ( old_term_id !== -1 ) {
910 // remove attachments
911 for ( i = 0; i < response.data.attachments.success.length; i++ ) {
912 $( '#post-' + response.data.attachments.success[i] ).fadeOut( 'fast', function() {
913 $( this ).remove();
914
915 // display 'no media' text
916 if ( $( '#the-list tr' ).length === 0 )
917 $( '#the-list' ).append( rlFoldersArgs.no_media_items );
918 } );
919 }
920
921 // update old node number
922 update_node_number( old_node, response.data, false );
923 }
924
925 // update new node number
926 update_node_number( node, response.data, true );
927 }
928 } catch( e ) {
929 }
930
931 // hide spinner
932 toggle_spinner( false );
933 } ).fail( function() {
934 // hide spinner
935 toggle_spinner( false );
936 } );
937 }
938 } );
939 // grid mode
940 } else {
941 selector.droppable( {
942 activeClass: 'rl-folders-state-active',
943 hoverClass: 'rl-folders-state-hover',
944 accept: 'li.attachment',
945 tolerance: 'pointer',
946 drop: function( event, ui ) {
947 var node = $( event.target ).closest( 'li' ).find( 'a.jstree-anchor' );
948 var old_node = $( '#' + $( '#rl-folders-tree' ).jstree().get_selected().toString() + '_anchor' );
949 var term_id = old_node.data( 'term_id' );
950 var old_term_id = term_id === 'all' ? -1 : parseInt( term_id );
951 var attachments = [];
952
953 toggle_spinner( true );
954
955 // single attachment
956 if ( $( '.media-frame' ).hasClass( 'mode-edit' ) )
957 attachments.push( parseInt( ui.draggable.data( 'id' ) ) );
958 // selection of attachments
959 else {
960 $( 'ul.attachments > li.selected' ).each( function( i, item ) {
961 attachments.push( parseInt( $( item ).data( 'id' ) ) );
962 } );
963 }
964
965 $.post( ajaxurl, {
966 action: 'rl-folders-move-attachments',
967 attachment_ids: attachments,
968 old_term_id: old_term_id,
969 new_term_id: parseInt( node.data( 'term_id' ) ),
970 nonce: rlFoldersArgs.nonce
971 } ).done( function( response ) {
972 try {
973 if ( response.success ) {
974 // do not update 'all files' folder or remove attachments from there
975 if ( old_term_id !== -1 ) {
976 // remove attachments
977 for ( i = 0; i < response.data.attachments.success.length; i++ ) {
978 $( 'ul.attachments li[data-id="' + response.data.attachments.success[i] + '"]' ).fadeOut( 'fast', function() {
979 $( this ).remove();
980
981 // display 'no media' text
982 if ( $( 'ul.attachments li' ).length === 0 )
983 $( '.no-media' ).removeClass( 'hidden' );
984 } );
985 }
986
987 // update old node number
988 update_node_number( old_node, response.data, false );
989 }
990
991 // update new node number
992 update_node_number( node, response.data, true );
993
994 // deactivate select mode and activate edit mode
995 grid_frame.controller.deactivateMode( 'select' ).activateMode( 'edit' );
996 }
997 } catch( e ) {
998 }
999
1000 // hide spinner
1001 toggle_spinner( false );
1002 } ).fail( function() {
1003 // hide spinner
1004 toggle_spinner( false );
1005 } );
1006 }
1007 } );
1008 }
1009 }
1010
1011 // draggable
1012 function draggable( mode ) {
1013 // grid mode
1014 if ( mode === 'grid' ) {
1015 var nof = 0;
1016
1017 $( '.media-frame-content ul.attachments li' ).draggable( {
1018 helper: function() {
1019 var attachments = 1;
1020
1021 // grid mode
1022 if ( active_mode === 'grid' ) {
1023 // single attachment
1024 if ( $( '.media-frame' ).hasClass( 'mode-edit' ) )
1025 attachments = 1;
1026 // selection of attachments
1027 else
1028 attachments = $( 'ul.attachments li.selected' ).length;
1029 // list mode
1030 } else
1031 attachments = $( '#the-list .check-column input[type="checkbox"]:checked' ).length;
1032
1033 // pass number of attachments to drag event
1034 nof = attachments;
1035
1036 return '<div class="rl-folders-dragged-item"><div class="dashicons dashicons-media-default"></div><span>' + attachments + '</span></div>';
1037 },
1038 drag: function() {
1039 if ( nof === 0 )
1040 return false;
1041 },
1042 appendTo: 'body',
1043 distance: 3,
1044 cursor: 'move',
1045 cursorAt: { top: 20, left: 20 },
1046 containment: '#wpwrap',
1047 revert: 'invalid',
1048 zIndex: 999
1049 } );
1050 // list mode
1051 } else {
1052 $( '#the-list tr' ).draggable( {
1053 helper: function() {
1054 var attachments = $( '#the-list .check-column input[type="checkbox"]:checked' ).length;
1055
1056 // dragging unchecked single attachment?
1057 if ( attachments === 0 )
1058 attachments = 1;
1059
1060 return '<div class="rl-folders-dragged-item"><div class="dashicons dashicons-media-default"></div><span>' + attachments + '</span></div>';
1061 },
1062 appendTo: 'body',
1063 distance: 3,
1064 cursor: 'move',
1065 cursorAt: { top: 20, left: 20 },
1066 containment: '#wpwrap',
1067 revert: 'invalid',
1068 zIndex: 999
1069 } );
1070 }
1071 }
1072
1073 // update number of attachments of specified node
1074 function update_node_number( node, data, add ) {
1075 var html = node.html().split( /(?:<i(?:.+)?\/i>)(.+)\s\((\d+)\)/ );
1076
1077 // rename node
1078 $( '#rl-folders-tree' ).jstree( 'rename_node', node.parent().attr( 'id' ), html[1] + ' (' + ( parseInt( html[2] ) + ( add ? data.attachments.success.length - data.attachments.duplicated.length : - data.attachments.success.length ) ) + ')' );
1079 }
1080
1081 // toggle spinner
1082 function toggle_spinner( show ) {
1083 if ( show ) {
1084 if ( active_mode === 'list' )
1085 $( '.filter-items .actions' ).find( '.spinner' ).addClass( 'is-active' );
1086 else
1087 $( '.media-toolbar-secondary' ).find( '.spinner' ).addClass( 'is-active' );
1088 } else {
1089 if ( active_mode === 'list' )
1090 $( '.filter-items .actions' ).find( '.spinner' ).removeClass( 'is-active' );
1091 else
1092 $( '.media-toolbar-secondary' ).find( '.spinner' ).removeClass( 'is-active' );
1093 }
1094 }
1095
1096 // move back node to old parent and position
1097 function move_node( node, parent, position ) {
1098 // set this to prevent infinite loop
1099 move_node_failed = true;
1100
1101 // move back node
1102 $( '#rl-folders-tree' ).jstree( 'move_node', node, parent, position );
1103 }
1104
1105 // cancel renaming/adding node
1106 function restore_node( new_node, cancel ) {
1107 var node_id = '#' + $( '#rl-folders-tree' ).jstree().get_selected().toString();
1108 var tree = $( '#rl-folders-tree' ).jstree( true ).get_json( '#', { 'flat': true } );
1109
1110 // show icon
1111 $( new_node ? '.rl-folders-add-new-folder' : '.rl-folders-rename-folder' ).show();
1112
1113 // hide icons
1114 $( new_node ? '.rl-folders-save-new-folder, .rl-folders-cancel-new-folder' : '.rl-folders-save-folder, .rl-folders-cancel-folder' ).hide();
1115
1116 // enable icons
1117 $( new_node ? '.rl-folders-rename-folder, .rl-folders-delete-folder' : '.rl-folders-add-new-folder, .rl-folders-delete-folder' ).removeClass( 'disabled-link' );
1118
1119 if ( new_node && cancel ) {
1120 // get parent node
1121 var parent = $( '#rl-folders-tree' ).jstree( 'get_parent', node_id );
1122
1123 // delete node
1124 $( '#rl-folders-tree' ).jstree( 'delete_node', node_id );
1125
1126 // disable redirect in select_node
1127 if ( active_mode === 'list' )
1128 disable_redirect = true;
1129
1130 // select parent node
1131 $( '#rl-folders-tree' ).jstree( 'select_node', parent );
1132 } else {
1133 // enable icons for non-empty nodes
1134 if ( ! $( '#rl-folders-tree' ).jstree( 'is_leaf', node_id ) )
1135 $( '.rl-folders-expand-folder, .rl-folders-collapse-folder' ).removeClass( 'disabled-link' );
1136
1137 // restore folder
1138 $( node_id + '_span' ).remove();
1139 $( node_id + '_anchor' ).show();
1140 }
1141
1142 // enable all nodes
1143 $.each( tree, function( key, value ) {
1144 $( '#rl-folders-tree' ).jstree( 'enable_node', value.id );
1145 } );
1146
1147 // refresh droppable nodes
1148 droppable( active_mode );
1149
1150 // rebind event
1151 $( document ).on( 'click', '.jstree-anchor', click_node );
1152 }
1153
1154 // save node with new name
1155 function save_node( new_node, parent_id ) {
1156 var input = $( new_node ? '#rl-folders-enter-new-folder' : '#rl-folders-enter-folder' );
1157 var node_id = $( '#rl-folders-tree' ).jstree().get_selected().toString();
1158 var name = input.val().trim();
1159 var nof = input.data( 'nof' );
1160
1161 if ( ! new_node ) {
1162 var term_id = parseInt( input.data( 'term_id' ) );
1163
1164 if ( isNaN( term_id ) )
1165 term_id = 0;
1166 }
1167
1168 // empty or the same name?
1169 if ( name === '' || name === input.attr( 'placeholder' ) ) {
1170 restore_node( new_node, true );
1171
1172 return false;
1173 }
1174
1175 // show spinner
1176 toggle_spinner( true );
1177
1178 $.post( ajaxurl, new_node ? {
1179 action: 'rl-folders-add-term',
1180 parent_id: parent_id,
1181 name: name,
1182 nonce: rlFoldersArgs.nonce
1183 } : {
1184 action: 'rl-folders-rename-term',
1185 term_id: term_id,
1186 name: name,
1187 nonce: rlFoldersArgs.nonce
1188 } ).done( function( response ) {
1189 try {
1190 if ( response.success ) {
1191 if ( new_node ) {
1192 // add new folder to dropdown
1193 $( '#media-attachment-rl-folders-filters' ).append( '<option value="' + response.data.term_id + '">' + response.data.name + '</option>' );
1194
1195 if ( attachments_browser !== null ) {
1196 // update filters
1197 attachments_browser.toolbar.get( 'RLfoldersAttachmentFilters' ).filters[response.data.term_id] = {
1198 text: response.data.name,
1199 priority: last_priority + 1,
1200 props: {
1201 [rlFoldersArgs.taxonomy]: response.data.term_id,
1202 'force_update': 0,
1203 'include_children': false
1204 }
1205 };
1206 }
1207 } else {
1208 // rename node
1209 $( '#media-attachment-rl-folders-filters option[value="' + term_id + '"]' ).text( response.data.name );
1210 $( '#media-attachment-rl-folders-filters option[value="' + term_id + '"]' ).prop( 'selected', true );
1211 }
1212
1213 // pass data to rename_node event
1214 event_data = {
1215 response: response.data,
1216 create: new_node
1217 };
1218
1219 // rename node
1220 $( '#rl-folders-tree' ).jstree( 'rename_node', node_id, response.data.name + ' (' + nof + ')' );
1221
1222 // sort node
1223 $( '#rl-folders-tree' ).jstree( 'sort', node_id, false );
1224
1225 if ( new_node ) {
1226 // add term id and new url
1227 $( '#' + node_id + '_anchor' ).attr( 'data-term_id', response.data.term_id ).attr( 'href', response.data.url );
1228
1229 // force to update view
1230 $( '#media-attachment-rl-folders-filters' ).val( response.data.term_id ).trigger( 'change' );
1231
1232 if ( active_mode === 'list' )
1233 window.location.replace( response.data.url );
1234 }
1235
1236 // update upload select
1237 update_upload_select( $( response.data.select ).find( 'option' ), new_node ? response.data.term_id : term_id );
1238 } else
1239 restore_node( new_node, true );
1240
1241 restore_node( new_node, false );
1242 } catch( e ) {
1243 restore_node( new_node, true );
1244 }
1245
1246 // hide spinner
1247 toggle_spinner( false );
1248 } ).fail( function() {
1249 // hide spinner
1250 toggle_spinner( false );
1251
1252 restore_node( new_node, true );
1253 } );
1254 }
1255
1256 // update upload select
1257 function update_upload_select( options, selected ) {
1258 $( '#rl_folders_upload_files' ).empty().append( options ).val( selected );
1259 }
1260
1261 // click node handler
1262 function click_node() {
1263 $( '#media-attachment-rl-folders-filters' ).val( $( this ).data( 'term_id' ) ).trigger( 'change' );
1264 }
1265
1266 // parse query string
1267 function parse_str( name, str ) {
1268 var regex = new RegExp( '[?&]' + name.replace( /[\[\]]/g, '\\$&' ) + '(=([^&#]*)|&|#|$)' );
1269 var results = regex.exec( '&' + str );
1270
1271 return ( ! results || ! results[2] ? '' : decodeURIComponent( results[2].replace( /\+/g, ' ' ) ) );
1272 }
1273
1274 } )( jQuery );