'use strict'; /** * Folder tree for WP Media Folder */ var wpmfFoldersTreeModule = void 0; (function ($) { wpmfFoldersTreeModule = { categories: [], // categories folders_states: [], // Contains open or closed status of folders cloudInterval: false, /** * Retrieve the Jquery tree view element * of the current frame * @return jQuery */ getTreeElement: function getTreeElement() { if (wpmfFoldersModule.page_type === 'upload-grid' || wpmfFoldersModule.page_type === 'upload-list') { return $('.upload-php .wpmf-main-tree'); } else { return wpmfFoldersModule.getFrame().find('.wpmf-main-tree').first(); } }, /** * Initialize module related things */ initModule: function initModule($current_frame) { // Check if this frame has already the tree view var is_initialized = void 0; if (wpmfFoldersModule.page_type === 'upload-list' || wpmfFoldersModule.page_type === 'upload-grid') { is_initialized = $('.upload-php .wpmf-main-tree').length > 0; } else { // not show tree on 900px of screen if ($(window).width() <= 900) { return; } if ($current_frame.hasClass('hide-menu')) { // add placeholder for search media input $current_frame.find('#media-search-input').attr('placeholder', $current_frame.find('.media-search-input-label').text()); if ($(window).width() > 768) { $current_frame.addClass("wpmf-treeview").removeClass("hide-menu"); } } is_initialized = $current_frame.find('.media-frame-menu .wpmf-main-tree').length > 0; } if (is_initialized) { // Show folder tree in case it has been hidden previously wpmfFoldersTreeModule.getTreeElement().show(); return; } // Import categories from wpmf main module wpmfFoldersTreeModule.importCategories(); if (typeof wpmf.vars.hide_tree !== "undefined" && parseInt(wpmf.vars.hide_tree) === 1) { if (wpmfFoldersModule.page_type === 'upload-list' || wpmfFoldersModule.page_type === 'upload-grid') { if (!$('.wpmf-main-tree').length) { if ($(window).width() < 600) { $('
').insertBefore($('ul.attachments')); } else { $('
').insertBefore($('#wpbody-content')); } } } else { var $menu = $current_frame.find('.media-frame-menu .media-menu'); if (!$menu.length) { $menu = $current_frame.find('.media-frame-menu'); $current_frame.find('.media-frame-menu-heading').hide(); } if (!$menu.find('.wpmf-main-tree').length) { $('
').appendTo($menu); } } // Render the tree view wpmfFoldersTreeModule.loadTreeView(); } // Subscribe to the change folder event in main wpmf module wpmfFoldersModule.on('changeFolder', function (folder_id) { wpmfFoldersTreeModule.changeFolder(folder_id); }); // Subscribe to the add folder event in main wpmf module wpmfFoldersModule.on(['addFolder', 'deleteFolder', 'updateFolder', 'moveFolder', 'foldersSelection', 'loadmoreFolder'], function (folder) { wpmfFoldersTreeModule.importCategories(); wpmfFoldersTreeModule.loadTreeView(); // Initialize folder tree resizing wpmfFoldersTreeModule.initContainerResizing($current_frame); }); // Subscribe to the move file event in main wpmf module wpmfFoldersModule.on('moveFile', function (files_ids, folder_to_id, folder_from_id) { // Import categories with updated count wpmfFoldersTreeModule.importCategories(); // Reload tree view wpmfFoldersTreeModule.loadTreeView(); wpmfFoldersTreeModule.initContainerResizing($current_frame); }); wpmfFoldersModule.on('deleteFile', function (folder_id) { // Update file count in main wpmf Module wpmfFoldersModule.categories[folder_id].files_count -= 1; // Import categories with updated count wpmfFoldersTreeModule.importCategories(); // Reload tree view wpmfFoldersTreeModule.loadTreeView(); wpmfFoldersTreeModule.initContainerResizing($current_frame); }); wpmfFoldersModule.on('duplicateFile', function (folder_id) { // Update file count in main wpmf Module wpmfFoldersModule.categories[folder_id].files_count += 1; // Import categories with updated count wpmfFoldersTreeModule.importCategories(); // Reload tree view wpmfFoldersTreeModule.loadTreeView(); wpmfFoldersTreeModule.initContainerResizing($current_frame); }); wpmfFoldersModule.on('addRemoteVideo', function (folder_id) { // Update file count in main wpmf Module wpmfFoldersModule.categories[folder_id].files_count += 1; console.log(wpmfFoldersModule.categories[folder_id].files_count); // Import categories with updated count wpmfFoldersTreeModule.importCategories(); // Reload tree view wpmfFoldersTreeModule.loadTreeView(); wpmfFoldersTreeModule.initContainerResizing($current_frame); }); // Initialize the fixed tree view position on scrolling if (wpmf.vars.wpmf_pagenow === 'upload.php') { wpmfFoldersTreeModule.initFixedScrolling($current_frame); } // Subscribe to ordering folder filter wpmfFoldersFiltersModule.on('foldersOrderChanged', function () { wpmfFoldersTreeModule.importCategories(); wpmfFoldersTreeModule.loadTreeView(); wpmfFoldersTreeModule.initContainerResizing($current_frame); }); wpmfFoldersModule.on('foldersOrderChanged', function () { wpmfFoldersTreeModule.importCategories(); wpmfFoldersTreeModule.loadTreeView(); wpmfFoldersTreeModule.initContainerResizing($current_frame); }); wpmfFoldersModule.on('foldersCountChanged', function () { wpmfFoldersTreeModule.loadTreeView(); wpmfFoldersTreeModule.initContainerResizing($current_frame); }); // Subscribe to gallery editing to hide folder tree wpmfFoldersModule.on('wpGalleryEdition', function () { wpmfFoldersTreeModule.getTreeElement().hide(); }); }, /** * Import categories from wpmf main module */ importCategories: function importCategories() { var folders_ordered = []; // Add each category $(wpmfFoldersModule.categories_order).each(function () { folders_ordered.push(wpmfFoldersModule.categories[this]); }); var folder_order = wpmfFoldersModule.getCookie('media-order-folder' + wpmf.vars.host); if (typeof folder_order !== "undefined") { wpmfFoldersModule.folder_ordering = folder_order; } // Order the array depending on main ordering switch (wpmfFoldersModule.folder_ordering) { default: case 'name-ASC': folders_ordered = Object.values(folders_ordered).sort(function (a, b) { if (a.id === 0) return -1; // Root folder is always first if (b.id === 0) return 1; // Root folder is always first return a.label.localeCompare(b.label); }); break; case 'name-DESC': folders_ordered = Object.values(folders_ordered).sort(function (a, b) { if (a.id === 0) return -1; // Root folder is always first if (b.id === 0) return 1; // Root folder is always first return b.label.localeCompare(a.label); }); break; case 'id-ASC': folders_ordered = Object.values(folders_ordered).sort(function (a, b) { if (a.id === 0) return -1; // Root folder is always first if (b.id === 0) return 1; // Root folder is always first return a.id - b.id; }); break; case 'id-DESC': folders_ordered = Object.values(folders_ordered).sort(function (a, b) { if (a.id === 0) return -1; // Root folder is always first if (b.id === 0) return 1; // Root folder is always first return b.id - a.id; }); break; case 'custom': folders_ordered = Object.values(folders_ordered).sort(function (a, b) { if (a.id === 0) return -1; // Root folder is always first if (b.id === 0) return 1; // Root folder is always first return a.order - b.order; }); break; } // Reorder array based on children var folders_ordered_deep = []; var processed_ids = []; var loadChildren = function loadChildren(id) { if (processed_ids.indexOf(id) < 0) { processed_ids.push(id); for (var ij = 0; ij < folders_ordered.length; ij++) { if (folders_ordered[ij].parent_id === id) { folders_ordered_deep.push(folders_ordered[ij]); loadChildren(folders_ordered[ij].id); } } } }; loadChildren(0); // Finally save it to the global var wpmfFoldersTreeModule.categories = folders_ordered_deep; }, /** * Render tree view inside content */ loadTreeView: function loadTreeView() { if (typeof wpmf.vars.hide_tree !== "undefined" && parseInt(wpmf.vars.hide_tree) === 0) { return; } // update height for folder tree when toggle menu if (wpmf.vars.wpmf_pagenow !== 'upload.php') { var $current_frame = wpmfFoldersTreeModule.getTreeElement().closest('.media-frame'); var $menu = $current_frame.find('.media-frame-menu'); if (!$current_frame.find('.wpmf-toggle-media-menu').length) { $current_frame.addClass('wpmf_hide_media_menu'); $current_frame.find('.media-frame-menu-heading').append(' arrow_drop_down arrow_drop_up '); $current_frame.find('.wpmf-toggle-media-menu').off('click').bind('click', function () { var h = 220; if ($menu.find('.wpmf-all-tree').hasClass('wpmf-tree-loadmore')) { h += 70; } if ($current_frame.hasClass('wpmf_hide_media_menu')) { $current_frame.removeClass('wpmf_hide_media_menu').addClass('wpmf_show_media_menu'); var a = $menu.find(".media-menu-item").length; $menu.find('.wpmf-all-tree').height($menu.height() - 34 * a - h); } else { $current_frame.removeClass('wpmf_show_media_menu').addClass('wpmf_hide_media_menu'); $menu.find('.wpmf-all-tree').height($menu.height() - h); } }); } } // render folder tree wpmfFoldersTreeModule.getTreeElement().html(wpmfFoldersTreeModule.getRendering()); wpmfFoldersTreeModule.initContainerResizing(wpmfFoldersModule.getFrame()); $('.wpmf-loadmore-folder').unbind('click').bind('click', function () { var count = $(this).data('count'); count += parseInt(wpmfFoldersModule.limit_folders); if (parseInt(count) < wpmfFoldersModule.categories_order_full.length) { wpmfFoldersModule.categories_order = wpmfFoldersModule.categories_order_full.slice(0, count); wpmfFoldersModule.trigger('loadmoreFolder'); } }); $('.wpmf-cancel-remove-folders-btn').unbind('click').bind('click', function (e) { e.preventDefault(); $('.wpmf-folder-actions').toggleClass('wpmf-deactivate'); $('.wpmf-tree-actions').find('.wpmf-new-folder').removeClass('hide'); $('.wpmf-tree-checkbox').addClass('hide'); }); $('.wpmf-remove-folders-btn').unbind('click').bind('click', function (e) { e.preventDefault(); if (!$(this).hasClass('disabled')) { var ids = []; $('.wpmf-tree-checkbox:checked').each(function (i, checkbox) { var folder_id = $(checkbox).val(); ids.push(folder_id); }); showDialog({ title: wpmf.l18n.delete_multiple_folder.replace('%d', ids.length), negative: { title: wpmf.l18n.cancel }, positive: { title: wpmf.l18n.delete, onClick: function onClick() { wpmfFoldersModule.deleteMultipleFolders(ids); } } }); } }); $('.wpmf-tree-checkbox').unbind('click').bind('click', function () { if ($(this).is(':checked')) { $(this).closest('li').find('ul .wpmf-tree-checkbox').prop('checked', true); } else { $(this).closest('li').find('ul .wpmf-tree-checkbox').prop('checked', false); } if ($('.wpmf-tree-checkbox:checked').length) { $('.wpmf-remove-folders-btn').removeClass('disabled'); } else { $('.wpmf-remove-folders-btn').addClass('disabled'); } }); // load count by subfolders if (wpmfFoldersModule.show_files_count) { if (wpmfFoldersTreeModule.categories.length < 1000) { wpmfFoldersTreeModule.loadCountAll(); } else { wpmfFoldersTreeModule.getTreeElement().addClass('wpmf-many-folders'); } } wpmfFoldersModule.openContextMenuFolder(); var append_element = void 0; if (wpmfFoldersModule.page_type === 'upload-list') { append_element = '#posts-filter'; } else { append_element = '.media-frame'; } var folder_order = wpmfFoldersModule.getCookie('media-order-folder' + wpmf.vars.host); var sortable = false; if (typeof folder_order !== "undefined" && folder_order === 'custom') { sortable = true; } if (sortable) { if ($().sortable) { wpmfFoldersTreeModule.getTreeElement().find('ul').sortable({ placeholder: 'wpmf_tree_drop_sort', delay: 100, // Prevent dragging when only trying to click distance: 10, cursorAt: { top: 10, left: 10 }, revert: true, revertDuration: 1000, /*tolerance: "intersect",*/ helper: function helper(ui) { var helper = '
'; helper += 'folder'; helper += ' ' + wpmf.l18n.folder_moving_text + ' '; helper += '
'; return helper; }, /** Prevent firefox bug positionnement **/ start: function start(event, ui) { wpmfFoldersTreeModule.getTreeElement().addClass('wpmf_tree_sorting'); var userAgent = navigator.userAgent.toLowerCase(); if (ui.helper !== "undefined" && userAgent.match(/firefox/)) { ui.helper.css('position', 'absolute'); } }, stop: function stop(event, ui) { wpmfFoldersTreeModule.getTreeElement().removeClass('wpmf_tree_sorting'); }, beforeStop: function beforeStop(event, ui) {}, update: function update(event, ui) { var order = ''; $(event.target).find('li').each(function (i, val) { var id = $(val).data('id'); if (id !== 0) { if (order !== '') { order += ','; } order += '"' + i + '":' + id; wpmfFoldersModule.categories[id].order = i; } }); order = '{' + order + '}'; $.ajax({ type: "POST", url: ajaxurl, data: { action: "wpmf", task: "reorderfolder", order: order, wpmf_nonce: wpmf.vars.wpmf_nonce }, success: function success(res) { wpmfFoldersModule.renderFolders(); } }); } }).disableSelection(); } } else { if ($().draggable) { // Initialize dragping folder on tree view wpmfFoldersTreeModule.getTreeElement().find('ul li .wpmf-item[data-id!="0"]').draggable({ revert: true, revertDuration: 1000, helper: function helper(ui) { var helper = '
'; helper += 'folder'; helper += ' ' + wpmf.l18n.folder_moving_text + ' '; helper += '
'; return helper; }, appendTo: append_element, delay: 100, // Prevent dragging when only trying to click distance: 10, cursorAt: { top: 0, left: 0 }, drag: function drag() {}, start: function start(event, ui) { // Add the original size of element $(ui.helper).css('width', $(ui.helper.context).outerWidth() + 'px'); $(ui.helper).css('height', $(ui.helper.context).outerWidth() + 'px'); // Add some style to original elements $(this).addClass('wpmf-dragging'); }, stop: function stop(event, ui) { // Revert style $(this).removeClass('wpmf-dragging'); } }); } } if ($().droppable) { // Initialize dropping folder on tree view wpmfFoldersTreeModule.getTreeElement().find('ul li .wpmf-item-inside').droppable({ hoverClass: "wpmf-hover-folder", tolerance: 'pointer', over: function over(event, ui) { $('.wpmf_tree_drop_sort').hide(); }, out: function out(event, ui) { $('.wpmf_tree_drop_sort').show(); }, drop: function drop(event, ui) { event.stopPropagation(); $(ui.helper).addClass('wpmf_dragout'); if ($(ui.draggable).hasClass('wpmf-folder') || $(ui.draggable).hasClass('wpmf-item')) { // move folder with folder tree wpmfFoldersModule.moveFolder($(ui.draggable).data('id'), $(this).data('id')); } else { // Transfer the event to the wpmf main module wpmfFoldersModule.droppedAttachment($(this).data('id')); } } }); } // Initialize change keyword to search folder wpmfFoldersTreeModule.getTreeElement().find('.searchfolder').on('click', function (e) { wpmfFoldersTreeModule.doSearch(); }); // search with enter key $('.wpmf_search_folder').on('keypress', function (e) { if (e.which === 13) { wpmfFoldersTreeModule.doSearch(); return false; } }); $(".wpmf_search_folder").wpmfHandleKeyboardChange(1000).change(function () { wpmfFoldersTreeModule.doSearch(); }); // Initialize double click to folder title on tree view wpmfFoldersTreeModule.getTreeElement().find('ul .wpmf-item[data-id]').wpmfSingleDoubleClick(function (e) { if ($(e.target).hasClass('wpmf-arrow') || $(e.target).hasClass('wpmf-tree-checkbox')) { return; } // Set cookie filter tag var this_url = new URL(location.href); var get_taxonomy = this_url.searchParams.get("taxonomy"); var get_term = this_url.searchParams.get("term"); var get_wpmf_tag = this_url.searchParams.get("wpmf_tag"); var wpmf_tag = 0; if ((get_taxonomy && get_term && get_taxonomy == 'wpmf_tag') || get_wpmf_tag) { if (get_term) { wpmf_tag = get_term; } if (get_wpmf_tag) { wpmf_tag = get_wpmf_tag; } wpmfFoldersModule.setCookie('wpmf_tag', wpmf_tag, 365); } // single click var id = $(this).data('id'); if (parseInt(id) !== parseInt(wpmfFoldersModule.last_selected_folder)) { if (!wpmfFoldersModule.getFrame().find('#wpmf-media-category').length) { var bread = ''; wpmfFoldersTreeModule.changeFolder(id); if (parseInt(id) === 0) { bread = wpmfFoldersModule.getBreadcrumb(0); } else { bread = wpmfFoldersModule.getBreadcrumb(id); } $('.wpmf_msg_upload_folder span').html(bread); } else { wpmfFoldersModule.changeFolder(id); } } }, function (e) { // double click var id = $(this).data('id'); wpmfFoldersModule.clickEditFolder(e, id); wpmfFoldersModule.houtside(); }); wpmfFoldersTreeModule.getTreeElement().append('
'); wpmfFoldersTreeModule.getTreeElement().find('.wpmf_media_library').appendTo(wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree')); if (parseInt(wpmf.vars.wpmf_addon_active) === 1) { if (!wpmfFoldersTreeModule.getTreeElement().find('.wpmf-dropbox').length && wpmfFoldersTreeModule.getTreeElement().find('.dropbox_list').length) { wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree').append(''); wpmfFoldersTreeModule.getTreeElement().find('.dropbox_list').appendTo(wpmfFoldersTreeModule.getTreeElement().find('.wpmf-dropbox')); } if (!wpmfFoldersTreeModule.getTreeElement().find('.wpmf-google').length && wpmfFoldersTreeModule.getTreeElement().find('.google_drive_list').length) { wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree').append(''); wpmfFoldersTreeModule.getTreeElement().find('.google_drive_list').appendTo(wpmfFoldersTreeModule.getTreeElement().find('.wpmf-google')); } if (!wpmfFoldersTreeModule.getTreeElement().find('.wpmf-onedrive').length && wpmfFoldersTreeModule.getTreeElement().find('.onedrive_list').length) { wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree').append(''); wpmfFoldersTreeModule.getTreeElement().find('.onedrive_list').appendTo(wpmfFoldersTreeModule.getTreeElement().find('.wpmf-onedrive')); } if (!wpmfFoldersTreeModule.getTreeElement().find('.wpmf-onedrive-business').length && wpmfFoldersTreeModule.getTreeElement().find('.onedrive_business_list').length) { wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree').append(''); wpmfFoldersTreeModule.getTreeElement().find('.onedrive_business_list').appendTo(wpmfFoldersTreeModule.getTreeElement().find('.wpmf-onedrive-business')); } if (!wpmfFoldersTreeModule.getTreeElement().find('.wpmf-nextcloud').length && wpmfFoldersTreeModule.getTreeElement().find('.nextcloud_list').length) { wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree').append(''); wpmfFoldersTreeModule.getTreeElement().find('.nextcloud_list').appendTo(wpmfFoldersTreeModule.getTreeElement().find('.wpmf-nextcloud')); } } // load scroll bar if (wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree').is(':visible')) { wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree').scrollbar(); if (wpmf.vars.wpmf_pagenow !== 'upload.php') { var $menu1 = wpmfFoldersTreeModule.getTreeElement().closest('.media-frame').find('.media-frame-menu'); var h = 220; if ($menu1.find('.wpmf-all-tree').hasClass('wpmf-tree-loadmore')) { h += 70; } $menu1.find('.wpmf-all-tree').height($menu1.height() - h); } } if (wpmfFoldersModule.categories_order_full.length > wpmfFoldersModule.limit_folders) { $('.wpmf-all-tree').addClass('wpmf-tree-loadmore'); } }, loadCountAll: function loadCountAll() { wpmfFoldersTreeModule.getTreeElement().find('li').each(function (i, element) { var id = $(element).data('id'); if (parseInt(id) !== 0) { var countElements = $(element).find('.wpmf-item-count'); var count = 0; $(countElements).each(function (index, countElement) { count += parseInt($(countElement).html()); }); $(element).find('> .wpmf-item .wpmf-item-count-all').html(count); } }); }, /** * Do search folder */ doSearch: function doSearch() { // search on folder tree var keyword = $('.wpmf_search_folder').val().trim().toLowerCase(); var search_folders = []; // get folder when disable folders on right bar var folder_search = []; for (var folder_id in wpmfFoldersModule.categories) { if (keyword !== '') { keyword = keyword.trim().toLowerCase(); var folder_name = wpmfFoldersModule.categories[folder_id].lower_label; if (folder_name.indexOf(keyword) !== -1) { folder_search.push(folder_id); } } } search_folders = folder_search; if (keyword !== '') { $('.wpmf-main-tree li').addClass('folderhide').removeClass('foldershow'); $.each(search_folders, function (i, v) { $('.wpmf-main-tree li[data-id="' + v + '"]').addClass('foldershow').removeClass('folderhide closed'); $('.wpmf-main-tree li[data-id="' + v + '"]').parents('.wpmf-main-tree li').addClass('foldershow').removeClass('folderhide closed'); }); if ($('.foldershow').length) { $('.search_no_result_wrap').hide(); wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree').show(); } else { $('.search_no_result_wrap').show(); wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree').hide(); } } else { $('.wpmf-main-tree li').removeClass('foldershow folderhide'); $('.search_no_result_wrap').hide(); wpmfFoldersTreeModule.getTreeElement().find('.wpmf-all-tree').show(); } }, /** * Get the html resulting tree view * @return {string} */ getRendering: function getRendering() { var ij = 0; var content = ''; // Final tree view cwpmf-main-tree-resizeontent // render search folder box var search_folder = '\n \n '; var remove_folder = '
\n ' + wpmf.l18n.delete + '\n \n ' + wpmf.l18n.cancel + '\n
'; var search_no_result = '
\n\n\n\n

' + wpmf.l18n.search_no_result + '

\n
'; // get last status folder tree var lastStatusTree = wpmfFoldersModule.getCookie('lastStatusTree_' + wpmf.vars.host); if (lastStatusTree !== '') { lastStatusTree = JSON.parse(lastStatusTree); } /** * Recursively print list of folders * @return {boolean} */ var generateList = function generateList() { var tree_class = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; content += ''; } // We are at the end don't continue to process array return false; } if (wpmfFoldersTreeModule.categories[ij + 1].depth > wpmfFoldersTreeModule.categories[ij].depth) { // The next element is a sub folder // Recursively list it ij++; if (generateList() === false) { // We have reached the end, let's recursively end return false; } } else if (wpmfFoldersTreeModule.categories[ij + 1].depth < wpmfFoldersTreeModule.categories[ij].depth) { // The next element don't have the same parent // Let's close opened tags for (var _ik = wpmfFoldersTreeModule.categories[ij].depth; _ik > wpmfFoldersTreeModule.categories[ij + 1].depth; _ik--) { content += ''; content += ''; } // We're not at the end of the array let's continue processing it return true; } // Close the current element content += ''; ij++; } }; // Start generation generateList('wpmf_media_library'); var loadmore = ''; if (wpmfFoldersModule.categories_order_full.length > wpmfFoldersModule.limit_folders) { loadmore = ' expand_more ' + wpmf.l18n.load_more + ''; } // Add the new folder button content = '
add' + wpmf.l18n.create_folder + '' + remove_folder + '
' + search_folder + content + loadmore + search_no_result; return content; }, /** * Change the selected folder in tree view * @param folder_id */ changeFolder: function changeFolder(folder_id) { // Remove previous selection wpmfFoldersTreeModule.getTreeElement().find('li').removeClass('selected'); // Select the folder wpmfFoldersTreeModule.getTreeElement().find('li[data-id="' + folder_id + '"]').addClass('selected'). // Open parent folders parents('.wpmf-main-tree li.closed').removeClass('closed'); }, /** * Toggle the open / closed state of a folder * @param folder_id */ toggle: function toggle(folder_id) { // get last status folder tree var lastStatusTree = []; // Check is folder has closed class if (wpmfFoldersTreeModule.getTreeElement().find('li[data-id="' + folder_id + '"]').hasClass('closed')) { // Open the folder wpmfFoldersTreeModule.openFolder(folder_id); } else { // Close the folder wpmfFoldersTreeModule.closeFolder(folder_id); // close all sub folder $('li[data-id="' + folder_id + '"]').find('li').addClass('closed'); } wpmfFoldersTreeModule.getTreeElement().find('li:not(.closed)').each(function (i, v) { var id = $(v).data('id'); lastStatusTree.push(id); }); // set last status folder tree wpmfFoldersModule.setCookie("lastStatusTree_" + wpmf.vars.host, JSON.stringify(lastStatusTree), 365); }, /** * Open a folder to show children */ openFolder: function openFolder(folder_id) { wpmfFoldersTreeModule.getTreeElement().find('li[data-id="' + folder_id + '"]').removeClass('closed'); wpmfFoldersTreeModule.folders_states[folder_id] = 'open'; }, /** * Close a folder and hide children */ closeFolder: function closeFolder(folder_id) { wpmfFoldersTreeModule.getTreeElement().find('li[data-id="' + folder_id + '"]').addClass('closed'); wpmfFoldersTreeModule.folders_states[folder_id] = 'close'; }, /** * Initialize the fixed position when user is scrolling * to keep the folder tree always visible */ initFixedScrolling: function initFixedScrolling() { if (typeof wpmf.vars.hide_tree !== "undefined" && parseInt(wpmf.vars.hide_tree) === 0) { return; } setTimeout(function () { // Fix initial left margin in list view if (wpmfFoldersModule.page_type === 'upload-list' || wpmfFoldersModule.page_type === 'upload-grid') { var $tree = $('.wpmf-main-tree'); var tree_width = $tree.outerWidth() + 'px'; var $admin_bar_height = $('#wpadminbar').height(); if ($admin_bar_height > 32) { $tree.css('top', $admin_bar_height + 'px'); } $('#wpbody-content').css({ 'width': 'calc(100% - ' + tree_width + ')', 'margin-left': tree_width, 'opacity': 1, 'padding-left': '20px', 'box-sizing': 'border-box' }); // trigger window resize to set attachments columns if (wpmfFoldersModule.page_type === 'upload-grid') { $(window).trigger('resize'); } $('.rtl #wpbody-content').css({ 'margin-right': wpmfFoldersTreeModule.getTreeElement().outerWidth() + 'px', 'margin-left': 0, 'opacity': 1, 'padding-right': '20px', 'box-sizing': 'border-box' }); $tree.css({ 'opacity': 1 }); // Remove the loader on list page if (!$('.upload-php #posts-filter').hasClass('listview-loaded')) { setTimeout(function () { $('.upload-php #posts-filter').addClass('listview-loaded'); }, 200); } } }, 200); }, /** * Initialize folder tree resizing * @param $current_frame */ initContainerResizing: function initContainerResizing($current_frame) { if (typeof wpmf.vars.hide_tree !== "undefined" && parseInt(wpmf.vars.hide_tree) === 0) { return; } var is_resizing = false; var $body = $('body'); $(window).on('resize', function () { $('.wpmf-all-tree.scrollbar-inner').scrollbar(); }); if (wpmf.vars.wpmf_pagenow === 'upload.php' && wpmfFoldersModule.page_type) { // Main upload.php page var $main = $('#wpbody'); var $tree = $('.wpmf-main-tree'); var $right_min_width = 500; var $tree_min_width = 250; var $handle = $('
').appendTo($tree); $handle.on('mousedown', function (e) { is_resizing = true; $('body').css('user-select', 'none'); // prevent content selection while moving }); var uploadPageTreeSize = wpmfFoldersModule.getCookie('upload-page-tree-size'); if (uploadPageTreeSize < $tree_min_width) uploadPageTreeSize = $tree_min_width; if (typeof uploadPageTreeSize !== "undefined" && parseFloat(uploadPageTreeSize) > 0) { $tree.css({ 'width': parseFloat(uploadPageTreeSize) + 'px' }); } $(document).on('mousemove', function (e) { // we don't want to do anything if we aren't resizing. if (!is_resizing) return; // Calculate tree width var tree_width = e.clientX - $tree.offset().left; if (tree_width < $tree_min_width) tree_width = $tree_min_width; var right_width = $main.width() - tree_width; if (right_width < $right_min_width) { right_width = $right_min_width; tree_width = $main.width() - $right_min_width; } $tree.css('width', tree_width + 'px'); // We have to set margin if we are in a fixed tree position or in list page if ($('body').hasClass('rtl')) { $('#wpbody-content').css({ 'width': right_width + 'px', 'margin-right': tree_width + 'px', 'padding-right': '20px', 'box-sizing': 'border-box' }); } else { $('#wpbody-content').css({ 'width': right_width + 'px', 'margin-left': tree_width + 'px', 'padding-left': '20px', 'box-sizing': 'border-box' }); } wpmfFoldersModule.setCookie('upload-page-tree-size', tree_width, 365); }).on('mouseup', function (e) { if (is_resizing) { // stop resizing is_resizing = false; $body.css('user-select', ''); $(window).trigger('resize'); } }); } else { // Modal window with left menu var _$right_min_width = 800; var _$tree_min_width = 250; var _$main = $('.media-modal-content:visible'); var $menu = $current_frame.find('.media-frame-menu'); var _$tree = $current_frame.find('.wpmf-main-tree'); var _$handle = $('
').appendTo(_$tree); var $right_cols = $current_frame.find('.media-frame-content, .media-frame-router, .media-frame-title, .media-frame-toolbar'); if ($menu) { var h = 180; if ($menu.find('.wpmf-all-tree').hasClass('wpmf-tree-loadmore')) { h += 70; } if ($current_frame.hasClass('wpmf_hide_media_menu')) { $menu.find('.wpmf-all-tree').height($menu.height() - h); } else { var a = $menu.find(".media-menu-item").length; $menu.find('.wpmf-all-tree').height($menu.height() - 34 * a - h); } } _$tree.css({ 'min-width': 0, 'border-right': 0 }); _$handle.on('mousedown', function (e) { is_resizing = true; $body.css('user-select', 'none'); // prevent content selection while moving }); var tree_width = wpmfFoldersModule.getCookie('menu-tree-size'); if (tree_width < _$tree_min_width) tree_width = _$tree_min_width; if (typeof tree_width !== "undefined" && parseFloat(tree_width) > 0) { $menu.css('width', parseFloat(tree_width) + 'px'); if ($('body').hasClass('rtl')) { $right_cols.css('right', parseFloat(tree_width) + 14 + 'px'); } else { $right_cols.css('left', parseFloat(tree_width) + 14 + 'px'); } } $(document).on('mousemove', function (e) { // we don't want to do anything if we aren't resizing. if (!is_resizing) return; var menu_width = e.clientX - $menu.offset().left; if (menu_width < _$tree_min_width) menu_width = _$tree_min_width; var right_width = _$main.width() - menu_width; if (right_width < _$right_min_width) { menu_width = _$main.width() - _$right_min_width; } $menu.css('width', menu_width + 'px'); if ($('body').hasClass('rtl')) { $right_cols.css('right', parseFloat(menu_width) + 14 + 'px'); } else { $right_cols.css('left', parseFloat(menu_width) + 14 + 'px'); } wpmfFoldersModule.setCookie('menu-tree-size', menu_width, 365); }).on('mouseup', function (e) { if (is_resizing) { // stop resizing is_resizing = false; $body.css('user-select', ''); $(window).trigger('resize'); } }); } } }; // Let's initialize WPMF folder tree features $(document).ready(function () { if (typeof wpmfFoldersModule !== "undefined") { if (wpmfFoldersModule.page_type === 'upload-list') { // Don't need to wait on list page wpmfFoldersTreeModule.initModule(wpmfFoldersModule.getFrame()); } else { // Wait for the main wpmf module to be ready wpmfFoldersModule.on('ready', function ($current_frame) { setTimeout(function () { wpmfFoldersTreeModule.initModule($current_frame); }, 200); }); } } }); })(jQuery); // call single click or double click on folder tree jQuery.fn.wpmfSingleDoubleClick = function (single_click_callback, double_click_callback, timeout) { return this.each(function () { var clicks = 0, self = this; jQuery(this).on('click', function (event) { clicks++; if (clicks === 1) { setTimeout(function () { if (clicks === 1) { single_click_callback.call(self, event); } else { double_click_callback.call(self, event); } clicks = 0; }, timeout || 300); } }); }); }; jQuery.fn.wpmfHandleKeyboardChange = function (nDelay) { // Utility function to test if a keyboard event should be ignored function shouldIgnore(event) { var mapIgnoredKeys = { 9: true, // Tab 16: true, 17: true, 18: true, // Shift, Alt, Ctrl 37: true, 38: true, 39: true, 40: true, // Arrows 91: true, 92: true, 93: true // Windows keys }; return mapIgnoredKeys[event.which]; } // Utility function to fire OUR change event if the value was actually changed function fireChange($element) { if ($element.val() != jQuery.data($element[0], "valueLast")) { jQuery.data($element[0], "valueLast", $element.val()); $element.trigger("change"); } } // The currently running timeout, // will be accessed with closures var timeout = 0; // Utility function to cancel a previously set timeout function clearPreviousTimeout() { if (timeout) { clearTimeout(timeout); } } return this.keydown(function (event) { if (shouldIgnore(event)) return; // User pressed a key, stop the timeout for now clearPreviousTimeout(); return null; }).keyup(function (event) { if (shouldIgnore(event)) return; // Start a timeout to fire our event after some time of inactivity // Eventually cancel a previously running timeout clearPreviousTimeout(); var $self = jQuery(this); timeout = setTimeout(function () { fireChange($self); }, nDelay); }).change(function () { // Fire a change // Use our function instead of just firing the event // Because we want to check if value really changed since // our previous event. // This is for when the browser fires the change event // though we already fired the event because of the timeout fireChange(jQuery(this)); }); };