Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Bower components Debian packages RPM packages NuGet packages

jsarnowski / jsarnowski/cartflows   php

Repository URL to install this package:

Version: 1.6.11 

/ inc / admin-menu.php

<?php
/**
 * CartFlows Admin Menu.
 *
 * @package CartFlows
 */

namespace CartflowsAdmin\AdminCore\Inc;

use CartflowsAdmin\AdminCore\Inc\AdminHelper;

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class Admin_Menu.
 */
class AdminMenu {

	/**
	 * Instance
	 *
	 * @access private
	 * @var object Class object.
	 * @since 1.0.0
	 */
	private static $instance;

	/**
	 * For Gutenberg
	 *
	 * @var $is_gutenberg_editor_active
	 */
	private $is_gutenberg_editor_active = false;

	/**
	 * Initiator
	 *
	 * @since 1.0.0
	 * @return object initialized object of class.
	 */
	public static function get_instance() {
		if ( ! isset( self::$instance ) ) {
			self::$instance = new self();
		}
		return self::$instance;
	}

	/**
	 * Instance
	 *
	 * @access private
	 * @var string Class object.
	 * @since 1.0.0
	 */
	private $menu_slug;

	/**
	 * Constructor
	 *
	 * @since 1.0.0
	 */
	public function __construct() {
		$this->menu_slug = 'cartflows';

		$this->initialize_hooks();
	}

	/**
	 * Init Hooks.
	 *
	 * @since 1.0.0
	 * @return void
	 */
	public function initialize_hooks() {
		add_action( 'admin_menu', array( $this, 'setup_menu' ) );
		add_action( 'admin_init', array( $this, 'settings_admin_scripts' ) );

		/* Flow content view */
		add_action( 'cartflows_render_admin_page_content', array( $this, 'render_content' ), 10, 2 );

		add_action( 'edit_form_after_title', array( $this, 'new_admin_flow_setting_redirection' ), 10, 1 );

		/*
		Redirection.
			//add_action( 'edit_form_after_title', array( $this, 'new_admin_step_setting_redirection' ), 10, 1 );
		*/

		/* To check the status of gutenberg */
		add_action( 'enqueue_block_editor_assets', array( $this, 'set_block_editor_status' ) );
		add_action( 'admin_footer', array( $this, 'back_to_new_step_ui_for_gutenberg' ) );

		add_action( 'admin_notices', array( $this, 'back_to_new_step_ui_for_classic_editor' ) );
	}


		/**
		 * Display admin notices.
		 *
		 * @since 1.0.0
		 *
		 * @return void
		 */
	public function back_to_new_step_ui_for_classic_editor() {

		if ( CARTFLOWS_STEP_POST_TYPE !== get_post_type() ) {
			return;
		}

		$flow_id = get_post_meta( get_the_id(), 'wcf-flow-id', true );
		$step_id = isset( $_GET['post'] ) ? intval( $_GET['post'] ) : 0; //phpcs:ignore

		if ( $flow_id && $step_id ) {

			$step_redirect_url = esc_url( admin_url() . 'admin.php?page=' . $this->menu_slug . '&action=wcf-edit-step&step_id=' . $step_id . '&flow_id=' . $flow_id ); // phpcs:igmore Generic.Strings.UnnecessaryStringConcat.Found.
			?>
			<div class="wcf-notice-back-edit-flow">
				<p>
					<a href="<?php echo esc_url( $step_redirect_url ); ?>" class="button button-primary button-hero wcf-header-back-button" style="text-decoration: none;">
						<?php esc_html_e( 'Back to Step Editing', 'cartflows' ); ?>
					</a>
				</p>
			</div>
			<?php
		}

	}

	/**
	 * Set status true for gutenberg.
	 *
	 * @return void
	 */
	public function set_block_editor_status() {

		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}

		// Set gutenberg status here.
		$this->is_gutenberg_editor_active = true;
	}

	/**
	 * Back to flow button gutenberg template
	 *
	 * @return void
	 */
	public function back_to_new_step_ui_for_gutenberg() {

		// Exit if block editor is not enabled.
		if ( ! $this->is_gutenberg_editor_active ) {
			return;
		}

		wp_enqueue_script( 'cartflows-admin' . '-common-script', CARTFLOWS_ADMIN_CORE_URL . 'assets/js/common.js', array( 'jquery' ), CARTFLOWS_VER, false ); //phpcs:ignore

		if ( CARTFLOWS_STEP_POST_TYPE !== get_post_type() ) {
			return;
		}

		$flow_id = get_post_meta( get_the_id(), 'wcf-flow-id', true );
		$step_id = isset( $_GET['post'] ) ? intval( $_GET['post'] ) : 0; //phpcs:ignore

		if ( $flow_id && $step_id ) {
			$step_redirect_url = esc_url( admin_url() . 'admin.php?page=' . $this->menu_slug . '&action=wcf-edit-step&step_id=' . $step_id . '&flow_id=' . $flow_id ); //phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found.

			?>
		<script id="wcf-gutenberg-back-flow-button" type="text/html">
			<div class="wcf-notice-back-edit-flow gutenberg-button" >
				<a href="<?php echo $step_redirect_url; ?>" class="button button-primary button-large wcf-header-back-button" style="text-decoration: none;">
					<?php esc_html_e( 'Back to Step Editing', 'cartflows' ); ?>
				</a>
			</div>
		</script>
			<?php
		}
	}

	/**
	 * Back to flow button
	 *
	 * @param array $meta meta data.
	 *
	 * @return void
	 */
	public function new_admin_flow_setting_redirection( $meta ) {

		$flow_id = isset( $_GET['post'] ) ? intval( $_GET['post'] ) : 0; //phpcs:ignore

		$post_type = get_post_type();

		if ( CARTFLOWS_FLOW_POST_TYPE === $post_type && 0 !== $flow_id ) {

			$redirect_url = esc_url( admin_url() . 'admin.php?page=' . $this->menu_slug . '&action=wcf-edit-flow&flow_id=' . $flow_id );
			$btn_markup   = '<div class="wcf-flow-editing-action" style="padding: 50px;text-align: center;">';
			$btn_markup  .= '<a class="button button-primary button-hero" href="' . $redirect_url . '">' . __( 'Go to Flow Editing', 'cartflows' ) . '</a>';
			$btn_markup  .= '</div>';

			echo $btn_markup;
		}
	}

	/**
	 * Back to flow button
	 *
	 * @param int $flow_id id.
	 *
	 * @return void
	 */
	public function new_admin_step_setting_redirection( $flow_id ) {

		$flow_id = isset( $flow_id ) ? intval( $flow_id ) : 0;

		$step_id = isset( $_GET['post'] ) ? intval( $_GET['post'] ) : 0; //phpcs:ignore

		if ( 0 !== $flow_id && 0 !== $step_id ) {

			$redirect_url       = esc_url( admin_url() . 'admin.php?page=' . $this->menu_slug . '&action=wcf-edit-step&step_id=' . $step_id . '&flow_id=' . $flow_id );
			$add_new_btn_markup = "<a class='button button-primary button-hero' href='$redirect_url'>" . __( 'Go to Step Editing', 'cartflows' ) . ' </a>';
			echo $add_new_btn_markup;
		}

	}

	/**
	 *  Initialize after Cartflows pro get loaded.
	 */
	public function settings_admin_scripts() {
		// Enqueue admin scripts.
		if (isset($_GET['page']) && ('cartflows' === $_GET['page'] || false !== strpos($_GET['page'], 'cartflows_'))) { //phpcs:ignore

			add_action( 'admin_enqueue_scripts', array( $this, 'styles_scripts' ) );

			add_filter( 'admin_footer_text', array( $this, 'add_footer_link' ), 99 );
		}
	}

	/**
	 * Add submenu to admin menu.
	 *
	 * @since 1.0.0
	 */
	public function setup_menu() {
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}
		global $submenu;

		$parent_slug = $this->menu_slug;
		$capability  = 'manage_options';

		add_menu_page(
			'CartFlows',
			'CartFlows',
			$capability,
			$parent_slug,
			array( $this, 'render' ),
			'data:image/svg+xml;base64,' . base64_encode(file_get_contents(CARTFLOWS_DIR . 'assets/images/cartflows-icon.svg')), //phpcs:ignore
			40
		);

		// Add settings menu.
		add_submenu_page(
			$parent_slug,
			__( 'Flows', 'cartflows' ),
			__( 'Flows', 'cartflows' ),
			$capability,
			'admin.php?page=' . $this->menu_slug . '&path=flows'
		);
		add_submenu_page(
			$parent_slug,
			__( 'Settings', 'cartflows' ),
			__( 'Settings', 'cartflows' ),
			$capability,
			'admin.php?page=' . $this->menu_slug . '&path=settings'
		);
		add_submenu_page(
			$parent_slug,
			__( 'Templates', 'cartflows' ),
			__( 'Templates', 'cartflows' ),
			$capability,
			'admin.php?page=' . $this->menu_slug . '&path=library'
		);

		// Rename to Home menu.
		$submenu[$parent_slug][0][0] = __('Home', 'cartflows'); //phpcs:ignore
	}

	/**
	 * Renders the admin settings.
	 *
	 * @since 1.0.0
	 * @return void
	 */
	public function render() {
		$menu_page_slug = (isset($_GET['page'])) ? sanitize_text_field(wp_unslash($_GET['page'])) : CARTFLOWS_SETTINGS; //phpcs:ignore
		$page_action    = '';

		if ( isset( $_GET['action'] )  ) { //phpcs:ignore
			$page_action = sanitize_text_field( wp_unslash( $_GET['action'] ) ); //phpcs:ignore
			$page_action = str_replace( '_', '-', $page_action );
		}

		include_once CARTFLOWS_ADMIN_CORE_DIR . 'views/admin-base.php';
	}

	/**
	 * Renders the admin settings content.
	 *
	 * @since 1.0.0
	 * @param sting $menu_page_slug current page name.
	 * @param sting $page_action current page action.
	 *
	 * @return void
	 */
	public function render_content( $menu_page_slug, $page_action ) {

		if ( 'cartflows' === $menu_page_slug ) {
			if ( $this->is_current_page( 'cartflows' ) ) {
				include_once CARTFLOWS_ADMIN_CORE_DIR . 'views/settings-app.php';
			} elseif ( $this->is_current_page( 'cartflows', array( 'wcf-edit-flow', 'wcf-edit-step' ) ) ) {
				include_once CARTFLOWS_ADMIN_CORE_DIR . 'views/editor-app.php';
			} elseif ( $this->is_current_page( 'cartflows', array( 'wcf-log' ) ) ) {
				include_once CARTFLOWS_ADMIN_CORE_DIR . 'inc/wcf-debugger.php';
			} elseif ( $this->is_current_page( 'cartflows', array( 'wcf-license' ) ) && 'active' === $this->get_plugin_status( 'cartflows-pro/cartflows-pro.php' ) ) {
				include_once CARTFLOWS_ADMIN_CORE_DIR . 'inc/wcf-pro-license.php';
			} else {
				include_once CARTFLOWS_ADMIN_CORE_DIR . 'views/404-error.php';
			}
		}
	}

	/**
	 * Enqueues the needed CSS/JS for the builder's admin settings page.
	 *
	 * @since 1.0.0
	 */
	public function styles_scripts() {

		$admin_slug = 'cartflows-admin';

		// Styles.
		wp_enqueue_style( $admin_slug . '-common', CARTFLOWS_ADMIN_CORE_URL . 'assets/css/common.css', array(), CARTFLOWS_VER );
		wp_style_add_data( $admin_slug . '-common', 'rtl', 'replace' );

		wp_enqueue_style( $admin_slug . '-header', CARTFLOWS_ADMIN_CORE_URL . 'assets/css/header.css', array(), CARTFLOWS_VER );
		wp_style_add_data( $admin_slug . '-header', 'rtl', 'replace' );

		/*
		Enqueue.
				// wp_enqueue_style( $admin_slug . '-fixed-header', CARTFLOWS_ADMIN_CORE_URL . 'assets/css/fixed-header.css', array(), CARTFLOWS_VER );
				// wp_style_add_data( $admin_slug . '-fixed-header', 'rtl', 'replace' );
		*/

		wp_enqueue_script( $admin_slug . '-common-script', CARTFLOWS_ADMIN_CORE_URL . 'assets/js/common.js', array( 'jquery' ), CARTFLOWS_VER, false );

		$current_flow_steps = array();
		$flow_id = isset( $_GET['flow_id'] ) ? intval( $_GET['flow_id'] ) : 0; //phpcs:ignore
		if ( $flow_id ) {
			$current_flow_steps = AdminHelper::get_flow_meta_options( $flow_id );
		}

		$product_src = esc_url_raw(
			add_query_arg(
				array(
					'post_type'      => 'product',
					'wcf-woo-iframe' => 'true',
				),
				admin_url( 'post-new.php' )
			)
		);

		$page_builder = \Cartflows_Helper::get_common_setting( 'default_page_builder' );

		// Fixed bulk action.
		$active_flows_bulkactions = array(
			array(
				'value' => '-1',
				'label' => __( 'Bulk Action', 'cartflows' ),
			),
			array(
				'value' => 'draft',
				'label' => __( 'Move to Draft', 'cartflows' ),
			),
			array(
				'value' => 'trash',
				'label' => __( 'Move to Trash', 'cartflows' ),
			),
			array(
				'value' => 'export',
				'label' => __( 'Export', 'cartflows' ),
			),
			array(
				'value' => 'delete_permanently',
				'label' => __( 'Delete Permanently', 'cartflows' ),
			),
		);

		$trash_flows_bulkactions = array(
			array(
				'value' => '-1',
				'label' => __( 'Bulk Action', 'cartflows' ),
			),
			array(
				'value' => 'restore',
				'label' => __( 'Restore', 'cartflows' ),
			),
			array(
				'value' => 'delete_permanently',
				'label' => __( 'Delete Permanently', 'cartflows' ),
			),
		);

		$draft_flows_bulkactions = array(
			array(
				'value' => '-1',
				'label' => __( 'Bulk Action', 'cartflows' ),
			),
			array(
				'value' => 'export',
				'label' => __( 'Export', 'cartflows' ),
			),
			array(
				'value' => 'trash',
				'label' => __( 'Move to Trash', 'cartflows' ),
			),
			array(
				'value' => 'delete_permanently',
				'label' => __( 'Delete Permanently', 'cartflows' ),
			),
		);

		$page_builder      = \Cartflows_Helper::get_common_setting( 'default_page_builder' );
		$page_builder_name = \Cartflows_Helper::get_page_builder_name( $page_builder );

		$localize = apply_filters(
			'cartflows_react_admin_localize',
			array(
				'current_user'                    => ! empty( wp_get_current_user()->user_firstname ) ? wp_get_current_user()->user_firstname : wp_get_current_user()->display_name,
				'cf_pro_status'                   => $this->get_plugin_status( 'cartflows-pro/cartflows-pro.php' ),
				'woocommerce_status'              => $this->get_plugin_status( 'woocommerce/woocommerce.php' ),
				'default_page_builder'            => $page_builder,
				'required_plugins'                => \Cartflows_Helper::get_plugins_groupby_page_builders(),
				'required_plugins_data'           => $this->get_required_plugins_data(),
				'is_any_required_plugins_missing' => $this->get_any_required_plugins_status(),
				'admin_base_slug'                 => $this->menu_slug,
				'admin_base_url'                  => admin_url(),
				'plugin_dir'                      => CARTFLOWS_URL,
				'admin_url'                       => admin_url( 'admin.php' ),
				'ajax_url'                        => admin_url( 'admin-ajax.php' ),
				'home_slug'                       => $this->menu_slug,
				'is_pro'                          => _is_cartflows_pro(),
				'page_builder'                    => $page_builder,
				'page_builder_name'               => $page_builder_name,
				'global_checkout'                 => \Cartflows_Helper::get_common_setting( 'global_checkout' ),
				'flows_count'                     => \wp_count_posts( CARTFLOWS_FLOW_POST_TYPE, 'readable' ),
				'currentFlowSteps'                => $current_flow_steps,
				'license_status'                  => \get_option( 'wc_am_client_cartflows_activated', '' ),
				'cf_domain_url'                   => CARTFLOWS_DOMAIN_URL,
				'logo_url'                        => esc_url_raw( CARTFLOWS_URL . 'assets/images/cartflows-logo.svg' ),
				'create_product_src'              => $product_src,
				'cf_font_family'                  => AdminHelper::get_font_family(),
				'flows_and_steps'                 => \Cartflows_Helper::get_instance()->get_flows_and_steps(),
				'active_flows_bulkactions'        => $active_flows_bulkactions,
				'trash_flows_bulkactions'         => $trash_flows_bulkactions,
				'draft_flows_bulkactions'         => $draft_flows_bulkactions,
				'woo_currency'                    => function_exists( 'get_woocommerce_currency_symbol' ) ? get_woocommerce_currency_symbol() : '',
				'template_library_url'            => wcf()->get_site_url(),
			)
		);

		if ( $this->is_current_page( $this->menu_slug ) ) {
			$this->settings_app_scripts( $localize );
		} elseif ( $this->is_current_page( 'cartflows', array( 'wcf-edit-flow', 'wcf-edit-step' ) ) ) {
			wp_enqueue_media();
			$this->editor_app_scripts( $localize );
		}
	}

	/**
	 * Get required plugin status.
	 */
	public function get_required_plugins_data() {

		$missing_plugins_data = array();

		$page_builder_plugins = \Cartflows_Helper::get_plugins_groupby_page_builders();

		foreach ( $page_builder_plugins as $slug => $data ) {

			$missing_plugins_data[ $slug ] = 'no';
			$current_page_builder_data     = $page_builder_plugins[ $slug ];

			foreach ( $current_page_builder_data['plugins'] as $plugin ) {
				if ( 'activate' === $plugin['status'] || 'install' === $plugin['status'] ) {
					$missing_plugins_data[ $slug ] = 'yes';
				}
			}

			// Divi.
			if ( 'divi' === $slug ) {
				if ( 'activate' === $current_page_builder_data['theme-status'] ) {
					$missing_plugins_data[ $slug ] = 'yes';
				}
			}
		}

		return $missing_plugins_data;
	}
	/**
	 * Get required plugin status
	 */
	public function get_any_required_plugins_status() {

		$default_page_builder = \Cartflows_Helper::get_common_setting( 'default_page_builder' );
		$any_inactive         = 'no';

		$page_builder_plugins = \Cartflows_Helper::get_plugins_groupby_page_builders();

		if ( isset( $page_builder_plugins[ $default_page_builder ] ) ) {

			$current_page_builder_data = $page_builder_plugins[ $default_page_builder ];

			foreach ( $current_page_builder_data['plugins'] as $plugin ) {
				if ( 'activate' === $plugin['status'] || 'install' === $plugin['status'] ) {
					$any_inactive = 'yes';
				}
			}

			// Divi.
			if ( 'divi' === $default_page_builder ) {
				if ( 'activate' === $current_page_builder_data['theme-status'] ) {
					$any_inactive = 'yes';
				}
			}
		}

		return $any_inactive;
	}

	/**
	 * Get plugin status
	 *
	 * @since 1.1.4
	 *
	 * @param  string $plugin_init_file Plguin init file.
	 * @return mixed
	 */
	public function get_plugin_status( $plugin_init_file ) {

		$installed_plugins = get_plugins();

		if ( ! isset( $installed_plugins[ $plugin_init_file ] ) ) {
			return 'not-installed';
		} elseif ( is_plugin_active( $plugin_init_file ) ) {
			return 'active';
		} else {
			return 'inactive';
		}
	}

	/**
	 * Settings app scripts
	 *
	 * @param array $localize Variable names.
	 */
	public function settings_app_scripts( $localize ) {
		$handle            = 'wcf-react-settings';
		$build_path        = CARTFLOWS_ADMIN_CORE_DIR . 'assets/build/';
		$build_url         = CARTFLOWS_ADMIN_CORE_URL . 'assets/build/';
		$script_asset_path = $build_path . 'settings-app.asset.php';
		$script_info       = file_exists( $script_asset_path )
			? include $script_asset_path
			: array(
				'dependencies' => array(),
				'version'      => CARTFLOWS_VER,
			);

		$script_dep = array_merge( $script_info['dependencies'], array( 'updates' ) );

		wp_register_script(
			$handle,
			$build_url . 'settings-app.js',
			$script_dep,
			$script_info['version'],
			true
		);

		wp_register_style(
			$handle,
			$build_url . 'settings-app.css',
			array(),
			CARTFLOWS_VER
		);

		wp_enqueue_script( $handle );

		wp_set_script_translations( $handle, 'cartflows' );

		wp_enqueue_style( $handle );
		wp_style_add_data( $handle, 'rtl', 'replace' );

		$localize['is_flows_limit'] = ( ! _is_cartflows_pro() && 3 <= AdminHelper::get_flows_count() ) ? true : false;

		wp_localize_script( $handle, 'cartflows_react', $localize );

	}

	/**
	 * Settings app scripts
	 *
	 * @param array $localize Variable names.
	 */
	public function editor_app_scripts( $localize ) {
		$handle            = 'wcf-editor-app';
		$build_path        = CARTFLOWS_ADMIN_CORE_DIR . 'assets/build/';
		$build_url         = CARTFLOWS_ADMIN_CORE_URL . 'assets/build/';
		$script_asset_path = $build_path . 'editor-app.asset.php';
		$script_info       = file_exists( $script_asset_path )
			? include $script_asset_path
			: array(
				'dependencies' => array(),
				'version'      => CARTFLOWS_VER,
			);

		wp_register_script(
			$handle,
			$build_url . 'editor-app.js',
			$script_info['dependencies'],
			$script_info['version'],
			true
		);

		wp_register_style(
			$handle,
			$build_url . 'editor-app.css',
			array(),
			CARTFLOWS_VER
		);

		wp_enqueue_script( $handle );

		wp_set_script_translations( $handle, 'cartflows' );

		wp_enqueue_style( $handle );
		wp_style_add_data( $handle, 'rtl', 'replace' );

		$localize['flow_id'] = isset( $_GET['flow_id'] ) ? intval( $_GET['flow_id'] ) : 0; //phpcs:ignore

		$step_id = isset( $_GET['step_id'] ) ? intval( $_GET['step_id'] ) : false; //phpcs:ignore

		if ( $step_id ) {

			$meta_options        = AdminHelper::get_step_meta_options( $step_id );
			$localize['options'] = $meta_options['options'];
		}

		wp_localize_script( $handle, 'cartflows_react', $localize );
	}

	/**
	 * CHeck if it is current page by parameters
	 *
	 * @param string $page_slug Menu name.
	 * @param string $action Menu name.
	 *
	 * @return  string page url
	 */
	public function is_current_page( $page_slug = '', $action = '' ) {

		$page_matched = false;

		if ( empty( $page_slug ) ) {
			return false;
		}

		$current_page_slug = isset($_GET['page']) ? sanitize_text_field($_GET['page']) : ''; //phpcs:ignore
		$current_action = isset($_GET['action']) ? sanitize_text_field($_GET['action']) : ''; //phpcs:ignore

		if ( ! is_array( $action ) ) {
			$action = explode( ' ', $action );
		}

		if ( $page_slug === $current_page_slug && in_array( $current_action, $action, true ) ) {
			$page_matched = true;
		}

		return $page_matched;
	}

	/**
	 *  Add footer link.
	 */
	public function add_footer_link() {

		$logs_page_url = add_query_arg(
			array(
				'page'   => CARTFLOWS_SLUG,
				'action' => 'wcf-log',
			),
			admin_url( '/admin.php' )
		);

		echo '<span id="footer-thankyou"> Thank you for using <a href="https://cartflows.com/">CartFlows</a></span> | <a href="' . $logs_page_url . '">Logs</a> | <a href="#!" class="switch-to-old-ui">' . __( 'Switch To Old UI', 'cartflows' ) . '</a>';
	}

}

AdminMenu::get_instance();