<?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
}
}
}