', esc_attr( $layout_style ) );
self::render_support_sidebar();
printf( '
', esc_attr( $main_style ) );
}
/**
* Close the main column and the support shell.
*
* @since 5.4.5
*/
public static function support_layout_close() {
echo '
';
echo '
';
}
/**
* Right-rail "Report an issue" card (Import + Settings).
*
* Lite → WordPress.org support. Pro plugin present → vendor contact form.
*
* @since 5.4.5
*/
public static function render_support_sidebar() {
$t = self::support_layout_tokens();
$support_url = self::is_pro_plugin_present()
? 'https://elearningevolve.com/contact/'
: 'https://wordpress.org/support/plugin/add-from-server-reloaded/';
$aside_style = sprintf(
'grid-column:2;grid-row:1;width:%dpx;max-width:%dpx;box-sizing:border-box;',
$t['sidebar'],
$t['sidebar']
);
?>
.afsr-page-header,#afsr-admin-app.afsrreloaded-wrap>.afsr-pro-banner,#afsr-admin-app.afsr-settings-wrap>.afsr-page-header,#afsr-admin-app .afsr-stepper{max-width:var(--afsr-prelayout-max)}'
. '@media (max-width:960px){#afsr-admin-app.afsrreloaded-wrap,#afsr-admin-app.afsr-settings-wrap{--afsr-prelayout-max:100%%}#afsr-admin-app .afsr-browse-layout{grid-template-columns:minmax(0,1fr)!important}#afsr-admin-app .afsr-browse-main,#afsr-admin-app .afsr-support-sidebar{grid-column:1!important;grid-row:auto!important;max-width:100%%!important;width:100%%!important}}',
$t['main_max'],
$t['sidebar'],
$t['gap']
);
wp_enqueue_style( 'common' );
wp_add_inline_style( 'common', $css );
}
/**
* Enqueue Import UI assets for locked Pro screens / Settings.
*
* @since 5.4.3
*/
public static function enqueue_locked_ui_assets() {
$wizard_css = AFSRRELOADED_PLUGIN_DIR_PATH . 'assets/css/admin-styles.css';
$wizard_js = AFSRRELOADED_PLUGIN_DIR_PATH . 'assets/js/admin-scripts.js';
if ( ! wp_style_is( 'afsr-admin-ui', 'registered' ) ) {
wp_register_style(
'afsr-admin-ui',
plugins_url( 'assets/css/admin-styles.css', AFSRRELOADED_PLUGIN_FILE ),
array( 'common', 'dashicons', 'add-from-server-reloaded' ),
file_exists( $wizard_css ) ? (string) filemtime( $wizard_css ) : AFSRRELOADED_VERSION
);
}
if ( ! wp_script_is( 'afsr-admin-ui', 'registered' ) ) {
wp_register_script(
'afsr-admin-ui',
plugins_url( 'assets/js/admin-scripts.js', AFSRRELOADED_PLUGIN_FILE ),
array( 'jquery', 'add-from-server-reloaded' ),
file_exists( $wizard_js ) ? (string) filemtime( $wizard_js ) : AFSRRELOADED_VERSION,
true
);
}
self::enqueue_browse_layout_critical_css();
wp_enqueue_style( 'dashicons' );
wp_enqueue_style( 'add-from-server-reloaded' );
wp_enqueue_style( 'afsr-admin-ui' );
wp_enqueue_script( 'add-from-server-reloaded' );
wp_enqueue_script( 'afsr-admin-ui' );
}
/**
* Sidebar PRO badge / Get Pro styling (keeps default WP admin fonts).
*
* Must load on every wp-admin screen: submenu labels include the badge
* HTML globally, so gating to plugin pages made "PRO" render as plain
* text on Dashboard and other non-plugin screens.
* CSS is scoped to #adminmenu only.
*
* @since 5.4.3
*
* @param string $hook Current admin page hook (unused).
*/
public static function enqueue_menu_badge_assets( $hook = '' ) {
unset( $hook );
if ( ! is_admin() ) {
return;
}
// No Lite PRO badges when Pro is active — skip the tiny stylesheet.
if ( self::is_pro_active() ) {
return;
}
$css = '
#adminmenu .afsr-menu-pro-badge {
display: inline-block;
margin-left: 6px;
padding: 1px 6px;
border-radius: 999px;
background: #8a6d3b;
color: #f5e6b8;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.04em;
line-height: 1.5;
vertical-align: middle;
}
#adminmenu .wp-submenu a[href*="elearningevolve.com/products/add-from-server-pro"] {
color: #e8c56a !important;
}
#adminmenu .afsr-menu-external {
margin-left: 4px;
font-size: 12px;
}
';
wp_register_style( 'afsr-admin-menu-badges', false, array(), AFSRRELOADED_VERSION );
wp_enqueue_style( 'afsr-admin-menu-badges' );
wp_add_inline_style( 'afsr-admin-menu-badges', $css );
}
/**
* Add PRO badges to Free submenu labels and normalize order.
*
* Lite: Settings is 2nd (after the main Import item).
* Pro: Settings sits after Access Control (feature menus first).
*
* @since 5.4.3
*/
public static function decorate_submenu_labels() {
global $submenu;
if ( empty( $submenu['add-from-server-reloaded'] ) || ! is_array( $submenu['add-from-server-reloaded'] ) ) {
return;
}
$pro_active = self::is_pro_active();
$top_label = $pro_active
? __( 'AFS Pro', 'add-from-server-reloaded' )
: __( 'AFS Lite', 'add-from-server-reloaded' );
// Keep the auto first submenu item label in sync with the top-level menu name.
foreach ( $submenu['add-from-server-reloaded'] as $index => $item ) {
if ( ! is_array( $item ) || empty( $item[2] ) ) {
continue;
}
if ( 'add-from-server-reloaded' === (string) $item[2] ) {
$submenu['add-from-server-reloaded'][ $index ][0] = $top_label;
}
}
// PRO badge only on History + Scheduled Imports (not every Pro submenu).
$pro_slugs = array(
'add-from-server-reloaded-history' => true,
'add-from-server-reloaded-scheduler' => true,
);
if ( $pro_active ) {
// Pro: feature menus first; Settings after Access Control.
$desired = array(
'add-from-server-reloaded',
'add-from-server-reloaded-history',
'add-from-server-reloaded-scheduler',
'add-from-server-reloaded-remote',
'add-from-server-reloaded-duplicates',
'add-from-server-reloaded-email',
'add-from-server-reloaded-access',
'add-from-server-reloaded-settings',
);
} else {
// Lite: Settings 2nd; Pro Features / Get Pro stay at the end.
$desired = array(
'add-from-server-reloaded',
'add-from-server-reloaded-settings',
'add-from-server-reloaded-history',
'add-from-server-reloaded-scheduler',
'add-from-server-reloaded-remote',
'add-from-server-reloaded-duplicates',
'add-from-server-reloaded-email',
'add-from-server-reloaded-access',
self::PAGE_FEATURES,
);
}
$by_slug = array();
$extras = array();
foreach ( $submenu['add-from-server-reloaded'] as $item ) {
if ( ! is_array( $item ) || empty( $item[2] ) ) {
continue;
}
$slug = (string) $item[2];
if ( ! $pro_active && isset( $pro_slugs[ $slug ] ) && false === strpos( (string) $item[0], 'afsr-menu-pro-badge' ) ) {
$item[0] = wp_strip_all_tags( (string) $item[0] ) . ' ';
}
if ( 0 === strpos( $slug, 'http://' ) || 0 === strpos( $slug, 'https://' ) ) {
if ( false === strpos( (string) $item[0], 'afsr-menu-external' ) ) {
$item[0] = wp_strip_all_tags( (string) $item[0] ) . ' ';
}
$extras[] = $item;
continue;
}
$by_slug[ $slug ] = $item;
}
$ordered = array();
foreach ( $desired as $slug ) {
if ( isset( $by_slug[ $slug ] ) ) {
$ordered[] = $by_slug[ $slug ];
unset( $by_slug[ $slug ] );
}
}
foreach ( $by_slug as $item ) {
$ordered[] = $item;
}
foreach ( $extras as $item ) {
$ordered[] = $item;
}
$submenu['add-from-server-reloaded'] = $ordered;
}
/**
* Catalog of Pro features (non-technical one-line descriptions).
*
* @since 5.4.2
*
* @return array