HEX
Server: LiteSpeed
System: Linux server902.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: deshuvsd (2181)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: /home/deshuvsd/www/wp-content/plugins/file-manager-advanced/application/class_fma_blocks.php
<?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
		}
	}
}