<?php /* @package: File Manager Advanced @Class: class_fma_blocks */ if ( !defined('ABSPATH') ) { exit; } if ( class_exists('class_fma_blocks') ) { return; } class class_fma_blocks { /** * Constructor */ public function __construct() { // Register block post type add_action( 'init', array( $this, 'register_blocks_post_type' ) ); // Add meta boxes add_action( 'add_meta_boxes', array( $this, 'add_blocks_meta_boxes' ) ); // Save meta boxes add_action( 'save_post', array( $this, 'save_blocks_meta_boxes' ) ); // Change submenu to point to blocks post type // Use priority 100 to run after admin_menus class (which runs at default priority 10) add_action( 'admin_menu', array( $this, 'change_blocks_submenu' ), 100 ); // Enqueue admin scripts for popup add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ), 999 ); // Add blur overlay to blocks list page // Use admin_footer to ensure scripts are loaded add_action( 'admin_footer', array( $this, 'add_blocks_list_blur_overlay' ) ); add_filter('manage_fma_blocks_posts_columns', array( $this, 'set_custom_columns' ) ); add_action('manage_fma_blocks_posts_custom_column', array($this, 'custom_column_content'), 10, 2); } public function set_custom_columns($columns) { // Remove and re-add columns in desired order $new_columns = []; // Keep the checkbox column first if (isset($columns['cb'])) { $new_columns['cb'] = $columns['cb']; } // 1️⃣ Title column $new_columns['title'] = __('Title'); // 2️⃣ Custom columns (Shortcode, Status, Block Type) $new_columns['shortcode'] = __('Shortcode'); $new_columns['status_col'] = __('Status'); $new_columns['block_type'] = __('Block Type'); $new_columns['updated'] = __('Updated'); // 3️⃣ Bring back updated and date columns at the end if exist if (isset($columns['date'])) { $new_columns['date'] = $columns['date']; } return $new_columns; } public function custom_column_content($column, $post_id) { if ($column === 'shortcode') { $shortcode_id = get_post_meta($post_id, 'shortcode_id', true); $title = get_the_title($post_id); $shortcode = '[advanced_file_manager_front id="' . esc_attr($shortcode_id) . '" title="' . esc_attr($title) . '"]'; echo ' <div style="display:flex; align-items:center; gap:5px;"> <!-- smaller gap --> <input type="text" readonly value="' . esc_attr($shortcode) . '" style=" width: 460px; /* ⬅️ wider input field */ background: #f9f9f9; border: 1px solid #ddd; padding: 5px 8px; font-family: monospace; font-size: 13px; color: #333; border-radius: 4px; line-height: 1.4; " /> <button class="copy-shortcode button button-small" data-shortcode="' . esc_attr($shortcode) . '" style=" display: flex; align-items: center; justify-content: center; height: 28px; cursor: pointer; padding: 0 8px; " title="Copy Shortcode" > 📋 </button> </div>'; } if ($column === 'status_col') { $status = get_post_meta($post_id, 'status_label', true); if ($status === 'Active') { echo '<span style="color:green;font-weight:600;">● Active</span>'; } else { echo '<span style="color:red;font-weight:600;">● Inactive</span>'; } } if ($column === 'block_type') { $block_type = get_post_meta($post_id, 'block_type', true); if ( $block_type === 'Logged In' ) { echo '<span style="color:green;font-weight:600;">Logged In</span>'; } else { echo '<span style="font-weight:600;">Non Logged In</span>'; } } if ($column === 'updated') { $modified = get_post_modified_time('M j, Y g:i A', false, $post_id); echo esc_html($modified); } } /** * Enqueue admin scripts */ public function enqueue_admin_scripts( $hook ) { // Only load on blocks post type pages $screen = get_current_screen(); if ( $screen && $screen->post_type === 'fma_blocks' ) { // Enqueue jQuery if not already loaded wp_enqueue_script( 'jquery' ); // Use the same select2 handle that's registered in class_fma_main // This ensures select2 is available before afm-scripts.js loads wp_enqueue_style( 'afm-jquery.select2', FMA_PLUGIN_URL . 'application/assets/css/select2/jquery.select2.min.css', array(), FMA_VERSION, 'all' ); wp_enqueue_script( 'afm-jquery.select2', FMA_PLUGIN_URL . 'application/assets/js/select2/jquery.select2.min.js', array( 'jquery' ), FMA_VERSION, false ); // Enqueue admin scripts that contain popup function // Use same handle as class_fma_main for consistency wp_enqueue_style( 'afm-admin', FMA_PLUGIN_URL . 'application/assets/css/afm-styles.css', array( 'afm-jquery.select2' ), FMA_VERSION, 'all' ); wp_enqueue_script( 'afm-admin', FMA_PLUGIN_URL . 'application/assets/js/afm-scripts.js', array( 'afm-jquery.select2' ), FMA_VERSION, false ); // Localize script with admin URL (same as class_fma_main) wp_localize_script( 'afm-admin', 'afmAdmin', array( 'assetsURL' => FMA_PLUGIN_URL . 'application/assets/', 'jsonURL' => rest_url(), ) ); } } /** * Register Blocks Post Type */ public function register_blocks_post_type() { // Only register if pro plugin is not active if ( class_exists('file_manager_advanced_shortcode') ) { return; } $labels = array( 'name' => _x( 'Blocks', 'Post type general name', 'file-manager-advanced' ), 'singular_name' => _x( 'Block', 'Post type singular name', 'file-manager-advanced' ), 'menu_name' => _x( 'File Managers', 'Admin Menu text', 'file-manager-advanced' ), 'add_new' => __( 'Add New', 'file-manager-advanced' ), 'add_new_item' => __( 'Add New Block', 'file-manager-advanced' ), 'new_item' => __( 'New Block', 'file-manager-advanced' ), 'edit_item' => __( 'Edit Block', 'file-manager-advanced' ), 'view_item' => __( 'View Block', 'file-manager-advanced' ), 'all_items' => __( 'All Blocks', 'file-manager-advanced' ), 'search_items' => __( 'Search Blocks', 'file-manager-advanced' ), 'not_found' => __( 'No blocks found.', 'file-manager-advanced' ), 'not_found_in_trash' => __( 'No blocks found in Trash.', 'file-manager-advanced' ), ); $args = array( 'labels' => $labels, 'public' => false, 'publicly_queryable' => false, 'show_ui' => true, 'show_in_menu' => false, // We'll add it manually via submenu 'query_var' => true, 'rewrite' => false, 'capability_type' => 'post', 'has_archive' => false, 'hierarchical' => false, 'menu_position' => null, 'menu_icon' => 'dashicons-media-archive', 'supports' => array( 'title' ), 'show_in_rest' => false, // Disable Gutenberg ); register_post_type( 'fma_blocks', $args ); $this->register_blocks_dummy_data(); } /** * Register dummy data for blocks post type */ private function register_blocks_dummy_data() { // Run only once to prevent duplicates if (get_option('fma_blocks_dummy_data_created')) return; $dummy_blocks = [ [ 'title' => 'Test Block 1', 'block_type' => 'Logged In', 'shortcode_id' => 'abc123xyz', 'status' => 'Active', ], [ 'title' => 'Test Block 2', 'block_type' => 'Non Logged In', 'shortcode_id' => 'xyz456abc', 'status' => 'Inactive', ], [ 'title' => 'Sample Block 3', 'block_type' => 'Logged In', 'shortcode_id' => 'pqr789lmn', 'status' => 'Active', ], ]; foreach ($dummy_blocks as $block) { $post_id = wp_insert_post([ 'post_type' => 'fma_blocks', 'post_title' => $block['title'], 'post_status' => 'publish', ]); if (!is_wp_error($post_id)) { update_post_meta($post_id, 'block_type', $block['block_type']); update_post_meta($post_id, 'shortcode_id', $block['shortcode_id']); update_post_meta($post_id, 'status_label', $block['status']); } } update_option('fma_blocks_dummy_data_created', true); } /** * Add meta boxes for blocks post type */ public function add_blocks_meta_boxes() { // Only add if pro plugin is not active if ( class_exists('file_manager_advanced_shortcode') ) { return; } add_meta_box( 'fma_blocks_pro_overlay', __( 'Block Configuration', 'file-manager-advanced' ), array( $this, 'blocks_pro_overlay_meta_box_callback' ), 'fma_blocks', 'normal', 'high' ); } /** * Blocks Pro Overlay Meta Box Callback */ public function blocks_pro_overlay_meta_box_callback( $post ) { ?> <div class="fma__blocks-wrapper" style="position: relative;"> <!-- Blur Overlay --> <div class="fma__blocks-blur-overlay" style=" position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); z-index: 10; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-direction: column; "> <div style="text-align: center; padding: 20px;"> <img src="<?php echo esc_url( FMA_PLUGIN_URL . 'application/assets/images/crown.svg' ); ?>" alt="Pro Feature" style="width: 60px; margin-bottom: 15px;"> <h3 style="margin: 10px 0; color: #333;"><?php _e( 'This is a Pro Feature', 'file-manager-advanced' ); ?></h3> <p style="color: #666; margin: 10px 0;"><?php _e( 'Upgrade to Advanced File Manager Pro to unlock this feature.', 'file-manager-advanced' ); ?></p> <a href="https://advancedfilemanager.com/pricing/?utm_source=plugin&utm_medium=blocks_feature&utm_campaign=plugin" target="_blank" class="button button-primary" style="margin-top: 10px;"> <?php _e( 'Get Pro Now', 'file-manager-advanced' ); ?> </a> </div> </div> <!-- Actual Content (Blurred) --> <div style="filter: blur(3px); pointer-events: none; opacity: 0.5; min-height: 400px;"> <table class="form-table"> <tbody> <tr> <th><label><?php _e( 'Block Type', 'file-manager-advanced' ); ?></label></th> <td> <select disabled> <option><?php _e( 'Logged In Users', 'file-manager-advanced' ); ?></option> <option><?php _e( 'Non Logged In Users', 'file-manager-advanced' ); ?></option> </select> <p class="description"><?php _e( 'Select to generate block for logged in or non logged in users.', 'file-manager-advanced' ); ?></p> </td> </tr> <tr> <th><label><?php _e( 'Select User Roles', 'file-manager-advanced' ); ?></label></th> <td> <div style="border: 1px solid #ddd; padding: 10px; border-radius: 4px; max-height: 200px; overflow-y: auto;"> <label style="display: block; margin: 5px 0;"><input type="checkbox" disabled /> <?php _e( 'Administrator', 'file-manager-advanced' ); ?></label> <label style="display: block; margin: 5px 0;"><input type="checkbox" disabled /> <?php _e( 'Editor', 'file-manager-advanced' ); ?></label> <label style="display: block; margin: 5px 0;"><input type="checkbox" disabled /> <?php _e( 'Author', 'file-manager-advanced' ); ?></label> <label style="display: block; margin: 5px 0;"><input type="checkbox" disabled /> <?php _e( 'Contributor', 'file-manager-advanced' ); ?></label> <label style="display: block; margin: 5px 0;"><input type="checkbox" disabled /> <?php _e( 'Subscriber', 'file-manager-advanced' ); ?></label> </div> <p class="description"><?php _e( 'Select user roles that can access this block.', 'file-manager-advanced' ); ?></p> </td> </tr> <tr> <th><label><?php _e( 'Path', 'file-manager-advanced' ); ?></label></th> <td> <input type="text" disabled class="regular-text" placeholder="<?php _e( 'File manager root path', 'file-manager-advanced' ); ?>" /> <p class="description"><?php _e( 'File manager root path. Use "/" for root directory.', 'file-manager-advanced' ); ?></p> </td> </tr> <tr> <th><label><?php _e( 'Path Type', 'file-manager-advanced' ); ?></label></th> <td> <select disabled> <option><?php _e( 'Inside WordPress', 'file-manager-advanced' ); ?></option> <option><?php _e( 'Outside WordPress', 'file-manager-advanced' ); ?></option> </select> <p class="description"><?php _e( 'Whether the path is inside or outside WordPress directory.', 'file-manager-advanced' ); ?></p> </td> </tr> <tr> <th><label><?php _e( 'Operations', 'file-manager-advanced' ); ?></label></th> <td> <div style="border: 1px solid #ddd; padding: 10px; border-radius: 4px; max-height: 200px; overflow-y: auto;"> <label style="display: block; margin: 5px 0;"><input type="checkbox" disabled /> <?php _e( 'Upload', 'file-manager-advanced' ); ?></label> <label style="display: block; margin: 5px 0;"><input type="checkbox" disabled /> <?php _e( 'Download', 'file-manager-advanced' ); ?></label> <label style="display: block; margin: 5px 0;"><input type="checkbox" disabled /> <?php _e( 'Delete', 'file-manager-advanced' ); ?></label> <label style="display: block; margin: 5px 0;"><input type="checkbox" disabled /> <?php _e( 'Create Folder', 'file-manager-advanced' ); ?></label> <label style="display: block; margin: 5px 0;"><input type="checkbox" disabled /> <?php _e( 'Rename', 'file-manager-advanced' ); ?></label> </div> <p class="description"><?php _e( 'Select allowed operations for this block.', 'file-manager-advanced' ); ?></p> </td> </tr> <tr> <th><label><?php _e( 'View Type', 'file-manager-advanced' ); ?></label></th> <td> <select disabled> <option><?php _e( 'Grid', 'file-manager-advanced' ); ?></option> <option><?php _e( 'List', 'file-manager-advanced' ); ?></option> </select> <p class="description"><?php _e( 'Default view type for the file manager.', 'file-manager-advanced' ); ?></p> </td> </tr> <tr> <th><label><?php _e( 'Theme', 'file-manager-advanced' ); ?></label></th> <td> <select disabled> <option><?php _e( 'Light', 'file-manager-advanced' ); ?></option> <option><?php _e( 'Dark', 'file-manager-advanced' ); ?></option> <option><?php _e( 'Grey', 'file-manager-advanced' ); ?></option> </select> <p class="description"><?php _e( 'Choose your preferred theme for the file manager interface.', 'file-manager-advanced' ); ?></p> </td> </tr> <tr> <th><label><?php _e( 'Language', 'file-manager-advanced' ); ?></label></th> <td> <select disabled> <option><?php _e( 'English', 'file-manager-advanced' ); ?></option> </select> <p class="description"><?php _e( 'Select the language for the file manager interface.', 'file-manager-advanced' ); ?></p> </td> </tr> </tbody> </table> </div> </div> <script> jQuery(document).ready(function($) { $('.fma__blocks-blur-overlay').on('click', function(e) { e.preventDefault(); if (typeof file_manager_advanced_popup === 'function') { file_manager_advanced_popup( 'https://advancedfilemanager.com/pricing/?utm_source=plugin&utm_medium=blocks_feature&utm_campaign=plugin', 'Get advanced features with Advanced File Manager Pro!', 'Get Pro Now' ); } else { // Fallback if popup function not available window.open('https://advancedfilemanager.com/pricing/?utm_source=plugin&utm_medium=blocks_feature&utm_campaign=plugin', '_blank'); } }); }); </script> <?php } /** * Save meta boxes */ public function save_blocks_meta_boxes( $post_id ) { // Only save if pro plugin is not active if ( class_exists('file_manager_advanced_shortcode') ) { return; } // Check if it's a blocks post type if ( get_post_type( $post_id ) !== 'fma_blocks' ) { return; } // Don't save anything - this is just a placeholder } /** * Change blocks submenu to point to post type */ public function change_blocks_submenu() { // Only change if pro plugin is not active if ( class_exists('file_manager_advanced_shortcode') ) { return; } global $submenu; // Remove old submenu if it exists if ( isset( $submenu['file_manager_advanced_ui'] ) ) { foreach ( $submenu['file_manager_advanced_ui'] as $key => $item ) { if ( isset( $item[2] ) && $item[2] === 'file_manager_advanced_shortcodes' ) { unset( $submenu['file_manager_advanced_ui'][$key] ); } } } // Add new submenu pointing to blocks post type // This will add it at the end, we'll reorder it below add_submenu_page( 'file_manager_advanced_ui', __( 'Blocks', 'file-manager-advanced' ), __( 'Blocks', 'file-manager-advanced' ), 'manage_options', 'edit.php?post_type=fma_blocks' ); // Reorder submenu to put Blocks at the original position (after AI Code Pilot, before DB Access) if ( isset( $submenu['file_manager_advanced_ui'] ) && is_array( $submenu['file_manager_advanced_ui'] ) ) { $blocks_item = null; $menu_items = array(); // Find and extract blocks item foreach ( $submenu['file_manager_advanced_ui'] as $key => $item ) { if ( isset( $item[2] ) && $item[2] === 'edit.php?post_type=fma_blocks' ) { $blocks_item = $item; } else { $menu_items[] = $item; } } // Insert blocks at the correct position if ( $blocks_item ) { $insert_position = 2; // Default: after Settings (0) and AI Code Pilot (1), so position 2 $ai_code_pilot_found = false; // Find AI Code Pilot position foreach ( $menu_items as $index => $item ) { if ( isset( $item[2] ) && $item[2] === 'ai-code-pilot' ) { $insert_position = $index + 1; // Insert after AI Code Pilot $ai_code_pilot_found = true; break; } } // If AI Code Pilot not found, insert after Settings (position 1) if ( ! $ai_code_pilot_found ) { $insert_position = 1; } // Insert blocks at the calculated position array_splice( $menu_items, $insert_position, 0, array( $blocks_item ) ); // Update submenu $submenu['file_manager_advanced_ui'] = $menu_items; } } } /** * Add blur overlay to blocks list page (same style as OneDrive/Dropbox) */ public function add_blocks_list_blur_overlay() { // Only add if pro plugin is not active if ( class_exists('file_manager_advanced_shortcode') ) { return; } // Only on blocks post type pages $screen = get_current_screen(); if ( ! $screen || $screen->post_type !== 'fma_blocks' ) { return; } // Only on list page (edit.php), not on edit page if ( $screen->base === 'edit' && $screen->post_type === 'fma_blocks' ) { ?> <style> /* Blocks heading - same style as OneDrive/Dropbox */ .fma__blocks__heading { color: #000; font-size: 18px; font-style: normal; font-weight: 600; line-height: normal; } .fma__blocks__heading-pro-tag { display: inline-block; padding: 2px 8px; background: linear-gradient(270deg, #011D33 0%, #3F6972 100%); border-radius: 4px; color: #fff; font-size: 12px; margin-left: 15px; vertical-align: middle; margin-bottom: 2px; } /* Blocks wrap - same style as OneDrive/Dropbox */ .fma__blocks__wrap { opacity: 0.5; position: relative; } .fma__blocks__wrap::before { content: ""; display: block; width: 100%; height: 100%; position: absolute; top: 0; left: 0; z-index: 1; background: transparent; } </style> <script> jQuery(document).ready(function($) { // Add PRO tag heading (same as OneDrive/Dropbox) if ($('.wp-heading-inline').length && !$('.wp-heading-inline').hasClass('fma__blocks__heading-added')) { $('.wp-heading-inline').addClass('fma__blocks__heading-added'); $('.wp-heading-inline').addClass('fma__blocks__heading'); if ($('.wp-heading-inline').find('.fma__blocks__heading-pro-tag').length === 0) { $('.wp-heading-inline').append('<span class="fma__blocks__heading-pro-tag">PRO</span>'); } } // Wrap only the table/content area (same as OneDrive/Dropbox) // WordPress post type list page structure: .wrap > heading + #posts-filter + .wp-list-table // We need to wrap everything after the heading, just like OneDrive/Dropbox var $wrap = $('.wrap'); if ($wrap.length && !$wrap.find('.fma__blocks__wrap').length) { // Find the heading element var $heading = $wrap.find('.wp-heading-inline').closest('h1, h2'); if ($heading.length) { // Get all siblings after heading (everything after heading) var $contentToWrap = $heading.nextAll(); if ($contentToWrap.length > 0) { // Wrap all content after heading (same as OneDrive/Dropbox) $contentToWrap.wrapAll('<div class="fma__blocks__wrap" afmp-href=""></div>'); } else { // Fallback: wrap #posts-filter and .wp-list-table together var $postsFilter = $('#posts-filter'); var $listTable = $('.wp-list-table'); if ($postsFilter.length || $listTable.length) { if ($postsFilter.length && $listTable.length) { $postsFilter.add($listTable).wrapAll('<div class="fma__blocks__wrap" afmp-href=""></div>'); } else if ($postsFilter.length) { $postsFilter.wrap('<div class="fma__blocks__wrap" afmp-href=""></div>'); } else if ($listTable.length) { $listTable.wrap('<div class="fma__blocks__wrap" afmp-href=""></div>'); } } } } else { // No heading found, wrap #posts-filter and .wp-list-table var $postsFilter = $('#posts-filter'); var $listTable = $('.wp-list-table'); if ($postsFilter.length || $listTable.length) { if ($postsFilter.length && $listTable.length) { $postsFilter.add($listTable).wrapAll('<div class="fma__blocks__wrap" afmp-href=""></div>'); } else if ($postsFilter.length) { $postsFilter.wrap('<div class="fma__blocks__wrap" afmp-href=""></div>'); } else if ($listTable.length) { $listTable.wrap('<div class="fma__blocks__wrap" afmp-href=""></div>'); } } } } }); </script> <?php } } }