/** * Media Folder Pro — Modal Integration * Adds folder dropdown filter to wp.media modal and auto-assigns uploads. */ ( function () { 'use strict'; if ( ! window.wp || ! wp.media || ! wp.media.view ) return; const { ajaxUrl, nonce, i18n } = window.mfpData || {}; if ( ! ajaxUrl ) return; let activeFolderId = 0; let foldersCache = null; // ─── AJAX helper ────────────────────────────────────────── function ajax( action, data ) { data = data || {}; const body = new URLSearchParams(); body.append( 'action', action ); body.append( 'nonce', nonce ); for ( const [ k, v ] of Object.entries( data ) ) { body.append( k, v ); } return fetch( ajaxUrl, { method: 'POST', credentials: 'same-origin', body: body, } ).then( function ( r ) { return r.json(); } ); } // ─── Load folders ───────────────────────────────────────── function loadFolders() { if ( foldersCache ) { return Promise.resolve( foldersCache ); } return ajax( 'mfp_get_folders' ).then( function ( res ) { if ( res.success ) { foldersCache = res.data.folders; return foldersCache; } return []; } ); } function flattenFolders( folders, depth ) { depth = depth || 0; var result = []; for ( var i = 0; i < folders.length; i++ ) { var folder = folders[ i ]; var prefix = depth > 0 ? '\u2003'.repeat( depth ) + '\u2014 ' : ''; result.push( { value: folder.id, label: prefix + folder.name, count: folder.count, } ); if ( folder.children && folder.children.length > 0 ) { result = result.concat( flattenFolders( folder.children, depth + 1 ) ); } } return result; } // ─── Build a folder