# adminify/4.3.2/assets/admin/js/wp-adminify--popup-folder.js

Adminify – White Label, Admin Menu Editor, Login Customizer, version 4.3.2. 32 lines.

- Page: https://pluginprobe.com/plugins/adminify/4.3.2/code/assets/admin/js/wp-adminify--popup-folder.js
- Raw: https://pluginprobe.com/plugins/adminify/4.3.2/raw/assets/admin/js/wp-adminify--popup-folder.js
- Modified: 2026-05-20T13:22:08+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/adminify/4.3.2/code/assets/admin/js/wp-adminify--popup-folder.js#L10-L20`.

```javascript
/*
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/ 	var __webpack_modules__ = ({

/***/ "./dev/admin/modules/folder/modal-popup-folder.js":
/*!********************************************************!*\
  !*** ./dev/admin/modules/folder/modal-popup-folder.js ***!
  \********************************************************/
/***/ (() => {

eval("var $ = window.jQuery;\n\n// Track React roots for cleanup - exposed globally for cross-module access\nwindow.wpAdminifyModalRoots = window.wpAdminifyModalRoots || new Map();\n\n// Initialize when DOM is ready\n$(function () {\n  initMediaModalSidebar();\n});\n\n/**\n * Get the currently visible/active .media-modal element.\n * Elementor can leave old hidden modals in the DOM while creating new ones,\n * so we must always target the visible one.\n */\nfunction getActiveMediaModal() {\n  var modals = document.querySelectorAll('.media-modal');\n  for (var i = modals.length - 1; i >= 0; i--) {\n    var style = window.getComputedStyle(modals[i]);\n    if (style.display !== 'none' && style.visibility !== 'hidden') {\n      return modals[i];\n    }\n  }\n  return null;\n}\n\n/**\n * Clean up folder containers and React roots from stale/hidden modals.\n * This prevents old containers in hidden modals from blocking injection\n * into the current visible modal.\n */\nfunction cleanupStaleModalContainers() {\n  var activeModal = getActiveMediaModal();\n  var roots = window.wpAdminifyModalRoots;\n\n  // Remove folder containers from ALL modals that are NOT the active one\n  $('.media-modal').each(function () {\n    if (this !== activeModal) {\n      var staleContainer = $(this).find('.wp-adminify--modal-folder-container');\n      var staleNotice = $(this).find('.wp-adminify--modal-pro-notice');\n      if (staleContainer.length || staleNotice.length) {\n        // Unmount any React roots in stale containers\n        if (roots && roots.size > 0) {\n          roots.forEach(function (root, id) {\n            var el = document.getElementById(id);\n            if (el && !(activeModal !== null && activeModal !== void 0 && activeModal.contains(el))) {\n              try {\n                root.unmount();\n              } catch (e) {}\n              roots[\"delete\"](id);\n            }\n          });\n        }\n        staleContainer.remove();\n        staleNotice.remove();\n      }\n      $(this).closest('.wp-core-ui').removeClass('wp-adminify-has-folders');\n    }\n  });\n}\n\n/**\n * Add pro upsell notice to media modal menu (when license is inactive)\n */\nfunction addProUpsellNotice() {\n  var activeModal = getActiveMediaModal();\n  if (!activeModal) return;\n  if ($(activeModal).find('.wp-adminify--modal-pro-notice').length) {\n    return;\n  }\n  var initialData = window.PXLBSADMINIFY_FOLDER_DATA;\n  if (!initialData) return;\n  var proNotice = $('<div>', {\n    \"class\": 'wp-adminify--modal-pro-notice'\n  });\n  proNotice.html('<button class=\"wp-adminify--modal-pro-notice-close\" type=\"button\">' + '<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"><path d=\"M1 1l12 12M13 1L1 13\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/></svg>' + '</button>' + '<div class=\"wp-adminify--modal-pro-notice-icon\">' + '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-crown-icon lucide-crown\"><path d=\"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z\"/><path d=\"M5 21h14\"/></svg>' + '</div>' + '<h4>Unlock Pro Features</h4>' + '<p>Use WP Adminify folders with page builders by upgrading to PRO.</p>' + '<div class=\"wp-adminify--modal-pro-notice-actions\">' + '<a href=\"https://wpadminify.com/pricing\" class=\"wp-adminify--modal-pro-btn\" target=\"_blank\">Upgrade to Pro</a>' + '</div>');\n  proNotice.on('click', '.wp-adminify--modal-pro-notice-close', function () {\n    proNotice.slideUp(200);\n  });\n  var mediaMenu = $(activeModal).find('.media-frame-menu .media-menu');\n  if (!mediaMenu.length) return;\n  $(activeModal).closest('.wp-core-ui').addClass('wp-adminify-has-folders');\n  var isElementor = document.body.classList.contains('elementor-editor-active');\n  var menuItemEmbed = mediaMenu.find('#menu-item-embed');\n  if (isElementor && menuItemEmbed.length) {\n    menuItemEmbed.after(proNotice);\n  } else {\n    mediaMenu.append(proNotice);\n  }\n}\n\n/**\n * Add folder container to the active/visible media modal menu\n */\nfunction addCustomDivToMediaModal() {\n  // Clean up containers stuck in old/hidden modals first\n  cleanupStaleModalContainers();\n  var activeModal = getActiveMediaModal();\n  if (!activeModal) return;\n\n  // Skip if already injected in the ACTIVE modal\n  if ($(activeModal).find('.wp-adminify--modal-folder-container').length) {\n    return;\n  }\n  var initialData = window.PXLBSADMINIFY_FOLDER_DATA;\n  var isPro = initialData && initialData.is_pro;\n  var isGutenberg = document.body.classList.contains('block-editor-page');\n\n  // Gutenberg editor: always show folder module (free feature)\n  // Other editors (Elementor, Customizer, etc.): show upsell notice if not pro\n  if (!isPro && !isGutenberg) {\n    addProUpsellNotice();\n    return;\n  }\n  var uniqueId = 'wp-adminify--modal-folder-container';\n  var appId = 'wp-adminify--folder-app-modal';\n\n  // Remove any leftover elements with these IDs (from destroyed modals)\n  $('#' + uniqueId).remove();\n  $('#' + appId).remove();\n  var newDiv = $('<div>', {\n    id: uniqueId,\n    \"class\": 'wp-adminify--modal-folder-container'\n  });\n  var appDivEle = $('<div>', {\n    id: appId\n  });\n  newDiv.append(appDivEle);\n  var mediaMenu = $(activeModal).find('.media-frame-menu .media-menu');\n  if (!mediaMenu.length) {\n    return;\n  }\n\n  // Mark modal as having folder widget so CSS only targets this modal\n  $(activeModal).closest('.wp-core-ui').addClass('wp-adminify-has-folders');\n\n  // In Elementor: insert after \"Insert from URL\" (#menu-item-embed)\n  var isElementor = document.body.classList.contains('elementor-editor-active');\n  var menuItemEmbed = mediaMenu.find('#menu-item-embed');\n  if (isElementor && menuItemEmbed.length) {\n    menuItemEmbed.after(newDiv);\n  } else {\n    // Gutenberg / Customizer / other: append to end of menu\n    mediaMenu.append(newDiv);\n  }\n\n  // Initialize React folder module after DOM is added\n  setTimeout(function () {\n    if (typeof window.wpAdminifyInitFolderModule === 'function') {\n      window.wpAdminifyInitFolderModule(true, appId);\n    }\n    // Adjust folder list height to fit within modal\n    setTimeout(adjustModalFolderListHeight, 200);\n  }, 50);\n}\n\n/**\n * Attempt to inject the folder container with retries.\n */\nfunction addCustomDivToMediaModalWithRetry(maxAttempts) {\n  maxAttempts = maxAttempts || 6;\n  var attempt = 0;\n  function tryInject() {\n    var activeModal = getActiveMediaModal();\n    if (activeModal) {\n      var hasContainer = $(activeModal).find('.wp-adminify--modal-folder-container').length > 0;\n      var hasNotice = $(activeModal).find('.wp-adminify--modal-pro-notice').length > 0;\n      if (hasContainer || hasNotice) return;\n    }\n    attempt++;\n    addCustomDivToMediaModal();\n\n    // Check again on the active modal after injection attempt\n    activeModal = getActiveMediaModal();\n    var injected = activeModal && ($(activeModal).find('.wp-adminify--modal-folder-container').length > 0 || $(activeModal).find('.wp-adminify--modal-pro-notice').length > 0);\n    if (!injected && attempt < maxAttempts) {\n      setTimeout(tryInject, 300);\n    }\n  }\n  tryInject();\n}\n\n/**\n * Calculate and set dynamic max-height for folder list inside media modal\n */\nfunction adjustModalFolderListHeight() {\n  var modal = getActiveMediaModal();\n  if (!modal) return;\n  var container = modal.querySelector('.wp-adminify--modal-folder-container');\n  if (!container) return;\n  var folderList = container.querySelector('ul.folder--lists');\n  if (!folderList) return;\n  var menuFrame = modal.querySelector('.media-frame-menu');\n  if (!menuFrame) return;\n  var menuHeight = menuFrame.getBoundingClientRect().height;\n  var folderWidget = container.querySelector('.wp-adminify--folder-widget');\n  if (!folderWidget) return;\n  var menuTop = menuFrame.getBoundingClientRect().top;\n  var listTop = folderList.getBoundingClientRect().top;\n  var usedAbove = listTop - menuTop;\n  var bottomPadding = 44;\n  var availableHeight = menuHeight - usedAbove - bottomPadding;\n  if (availableHeight > 100) {\n    folderList.style.maxHeight = availableHeight + 'px';\n  }\n}\n\n/**\n * Initialize media modal folder sidebar\n * Extends wp.media.view.AttachmentsBrowser and Modal to inject folder sidebar\n */\nvar initMediaModalSidebar = function initMediaModalSidebar() {\n  if (typeof wp === 'undefined' || !wp.media || !wp.media.view) {\n    return;\n  }\n  var initialData = window.PXLBSADMINIFY_FOLDER_DATA;\n  if (!initialData || !initialData.folders) {\n    return;\n  }\n\n  // Store reference to original AttachmentsBrowser\n  var AttachmentsBrowser = wp.media.view.AttachmentsBrowser;\n\n  // Extend AttachmentsBrowser to add folder sidebar\n  wp.media.view.AttachmentsBrowser = AttachmentsBrowser.extend({\n    createSidebar: function createSidebar() {\n      AttachmentsBrowser.prototype.createSidebar.apply(this, arguments);\n      var isInModal = this.controller && this.controller.$el && this.controller.$el.hasClass('wp-core-ui');\n      if (!isInModal) return;\n      setTimeout(function () {\n        addCustomDivToMediaModal();\n      }, 300);\n    }\n  });\n\n  // Patch Modal.prototype.open to detect every modal open (including reopens)\n  var originalModalOpen = wp.media.view.Modal.prototype.open;\n  wp.media.view.Modal.prototype.open = function () {\n    var result = originalModalOpen.apply(this, arguments);\n\n    // Use retry logic — DOM may not be fully ready on reopen (especially in Elementor)\n    setTimeout(function () {\n      addCustomDivToMediaModalWithRetry(6);\n    }, 200);\n    return result;\n  };\n\n  // Fallback: periodically check for visible modals missing the folder container\n  setInterval(function () {\n    var activeModal = getActiveMediaModal();\n    if (activeModal && !activeModal.querySelector('.wp-adminify--modal-folder-container') && !activeModal.querySelector('.wp-adminify--modal-pro-notice')) {\n      addCustomDivToMediaModal();\n    }\n  }, 1000);\n\n  // Recalculate folder list height on window resize\n  $(window).on('resize', adjustModalFolderListHeight);\n};\n\n//# sourceURL=webpack://adminify/./dev/admin/modules/folder/modal-popup-folder.js?");

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module can't be inlined because the eval devtool is used.
/******/ 	var __webpack_exports__ = {};
/******/ 	__webpack_modules__["./dev/admin/modules/folder/modal-popup-folder.js"]();
/******/ 	
/******/ })()
;
```
