HEX
Server: Apache
System: Linux host17.registrar-servers.com 4.18.0-513.18.1.lve.2.el8.x86_64 #1 SMP Sat Mar 30 15:36:11 UTC 2024 x86_64
User: shrsglobal (7178)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: //home/shrsglobal/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
		}
	}
}