plugin = $plugin;
$this->html = $html;
$this->demo_import = $demo_import;
}
public function add_pages(): void {
add_submenu_page(
sprintf( 'edit.php?post_type=%s', Views_Cpt::NAME ),
__( 'Demo import', 'acf-views' ),
__( 'Demo import', 'acf-views' ),
'edit_posts',
self::PAGE_DEMO_IMPORT,
array( $this, 'get_import_page' )
);
add_submenu_page(
sprintf( 'edit.php?post_type=%s', Views_Cpt::NAME ),
__( 'Docs', 'acf-views' ),
__( 'Docs', 'acf-views' ),
'edit_posts',
self::PAGE_DOCS,
function () {
printf(
'',
esc_url( Plugin::DOCS_URL )
);
}
);
add_submenu_page(
sprintf( 'edit.php?post_type=%s', Views_Cpt::NAME ),
__( 'Survey', 'acf-views' ),
__( 'Survey', 'acf-views' ),
'edit_posts',
self::PAGE_SURVEY,
function () {
printf(
'',
esc_url( Plugin::SURVEY_URL )
);
}
);
$this->remove_submenu_links();
}
public function get_header(): void {
$tabs = $this->get_pages();
$current_url = $this->get_current_admin_url();
$acf_views_list_url = $this->plugin->get_admin_url();
$acf_cards_list_url = $this->plugin->get_admin_url( '', Cards_Cpt::NAME );
$current_screen = get_current_screen();
$is_edit_screen = null !== $current_screen && 'post' === $current_screen->base && '' === $current_screen->action;
$is_add_screen = null !== $current_screen && 'post' === $current_screen->base && 'add' === $current_screen->action;
$is_active_child = ( $is_edit_screen || $is_add_screen );
$is_active_acf_views_child = $is_active_child && null !== $current_screen && Views_Cpt::NAME === $current_screen->post_type;
$is_active_acf_cards_child = $is_active_child && null !== $current_screen && Cards_Cpt::NAME === $current_screen->post_type;
foreach ( $tabs as &$tab ) {
$is_acf_views_list_page = $tab['url'] === $acf_views_list_url;
$is_acf_cards_list_page = $tab['url'] === $acf_cards_list_url;
$is_active_child = $is_acf_views_list_page && $is_active_acf_views_child;
$is_active_child = $is_active_child || ( $is_acf_cards_list_page && $is_active_acf_cards_child );
if ( $current_url !== $tab['url'] &&
! $is_active_child ) {
continue;
}
$tab['isActive'] = true;
break;
}
$this->html->print_dashboard_header( $this->plugin->get_name(), $this->plugin->get_version(), $tabs );
}
public function get_import_page(): void {
$is_with_delete_button = false;
$is_with_form_message = false;
if ( false === $this->demo_import->is_processed() ) {
$this->demo_import->read_ids();
} else {
$is_with_form_message = true;
}
if ( $this->demo_import->is_has_data() &&
! $this->demo_import->is_has_error() ) {
$is_with_form_message = true;
$is_with_delete_button = true;
}
$form_nonce = wp_create_nonce( 'av-demo-import' );
$this->html->print_dashboard_import(
$is_with_delete_button,
$form_nonce,
$is_with_form_message,
$this->demo_import
);
}
/**
* @param string[] $links
*
* @return string[]
*/
public function extend_plugin_action_links( array $links ): array {
$cpt_links = array_reverse( $this->get_cpt_links() );
foreach ( $cpt_links as $cpt_link ) {
array_unshift( $links, $cpt_link );
}
return array_merge( $links, $this->get_promo_links() );
}
public function set_hooks( Current_Screen $current_screen ): void {
if ( false === $current_screen->is_admin() ) {
return;
}
$plugin_slug = $this->plugin->get_slug();
add_action( 'admin_menu', array( $this, 'add_pages' ) );
add_action(
'current_screen',
function ( WP_Screen $screen ) {
if ( ! in_array( $screen->post_type, array( Views_Cpt::NAME, Cards_Cpt::NAME ), true ) ) {
return;
}
add_action( 'in_admin_header', array( $this, 'get_header' ) );
}
);
add_filter( "plugin_action_links_{$plugin_slug}", array( $this, 'extend_plugin_action_links' ) );
}
/**
* @return array>
*/
protected function get_pages(): array {
// iframe with https isn't supported on localhost (and websites with http).
$is_https = true === wp_is_using_https();
$docs_url = true === $is_https ?
$this->plugin->get_admin_url( self::PAGE_DOCS ) :
Plugin::DOCS_URL;
$is_docs_blank = false === $is_https;
return array(
array(
'isLeftBlock' => true,
'url' => $this->plugin->get_admin_url(),
'label' => __( 'Views', 'acf-views' ),
'isActive' => false,
'isSecondary' => false,
),
array(
'isLeftBlock' => true,
'url' => $this->plugin->get_admin_url( '', Cards_Cpt::NAME ),
'label' => __( 'Cards', 'acf-views' ),
'isActive' => false,
'isSecondary' => false,
),
array(
'isLeftBlock' => true,
'url' => $this->plugin->get_admin_url( Settings_Page::SLUG ),
'label' => __( 'Settings', 'acf-views' ),
'isActive' => false,
'isSecondary' => false,
),
array(
'isLeftBlock' => true,
'url' => $this->plugin->get_admin_url( Tools::SLUG ),
'label' => __( 'Tools', 'acf-views' ),
'isActive' => false,
'isSecondary' => false,
),
array(
'isLeftBlock' => true,
'url' => Plugin::PRO_VERSION_URL,
'isBlank' => true,
'label' => __( 'Get PRO', 'acf-views' ),
'isActive' => false,
'iconClasses' => 'av-toolbar__external-icon dashicons dashicons-star-filled',
'isSecondary' => false,
),
array(
'isRightBlock' => true,
'url' => $this->plugin->get_admin_url( self::PAGE_DEMO_IMPORT ),
'label' => __( 'Demo Import', 'acf-views' ),
'isActive' => false,
'isSecondary' => true,
),
array(
'isRightBlock' => true,
'url' => $docs_url,
'label' => __( 'Docs', 'acf-views' ),
'isActive' => false,
'isSecondary' => false,
'isBlank' => $is_docs_blank,
),
array(
'isRightBlock' => true,
// static to be overridden in child.
'url' => static::URL_SUPPORT,
'label' => __( 'Support', 'acf-views' ),
'isActive' => false,
'isSecondary' => false,
'iconClasses' => 'av-toolbar__license-icon dashicons dashicons-external',
'isBlank' => true,
),
);
}
protected function get_current_admin_url(): string {
$uri = Query_Arguments::get_string_for_non_action( 'REQUEST_URI', 'server' );
$uri = preg_replace( '|^.*/wp-admin/|i', '', $uri );
if ( null === $uri ) {
return '';
}
return admin_url( $uri );
}
protected function get_plugin(): Plugin {
return $this->plugin;
}
protected function remove_submenu_links(): void {
$url = sprintf( 'edit.php?post_type=%s', Views_Cpt::NAME );
global $submenu;
if ( ! $submenu[ $url ] ) {
// @phpcs:ignore
$submenu[ $url ] = array();
}
foreach ( $submenu[ $url ] as $item_key => $item ) {
if ( 4 !== count( $item ) ||
! in_array(
$item[2],
array(
self::PAGE_DEMO_IMPORT,
self::PAGE_DOCS,
self::PAGE_SURVEY,
),
true
) ) {
continue;
}
unset( $submenu[ $url ][ $item_key ] );
}
}
/**
* @return string[]
*/
protected function get_cpt_links(): array {
return array(
sprintf(
'%s',
esc_url( $this->plugin->get_admin_url( '', Views_Cpt::NAME ) ),
esc_html_x( 'Views', 'acf-views' )
),
sprintf(
'%s',
esc_url( $this->plugin->get_admin_url( '', Cards_Cpt::NAME ) ),
esc_html_x( 'Cards', 'acf-views' )
),
);
}
/**
* @return string[]
*/
protected function get_promo_links(): array {
$link_style = 'color:#d46f4d; font-weight:bold; transition: opacity 0.3s;';
return array(
sprintf(
'%s',
Plugin::PRO_VERSION_URL,
esc_attr( $link_style ),
esc_html_x( 'Get Pro', 'acf-views' )
),
);
}
}