2026-03-26 12:07:55 +00:00

464 lines
16 KiB
PHP

<?php
/**
* Simply Schedule Appointments Wp Admin.
*
* @since 0.0.3
* @package Simply_Schedule_Appointments
*/
/**
* Simply Schedule Appointments Wp Admin.
*
* @since 0.0.3
*/
class SSA_Wp_Admin {
protected $script_handle_whitelist = array();
protected $style_handle_whitelist = array();
/**
* Parent plugin class.
*
* @since 0.0.3
*
* @var Simply_Schedule_Appointments
*/
protected $plugin = null;
/**
* Constructor.
*
* @since 0.0.3
*
* @param Simply_Schedule_Appointments $plugin Main plugin object.
*/
public function __construct( $plugin ) {
$this->plugin = $plugin;
$this->hooks();
}
/**
* Initiate our hooks.
*
* @since 0.0.3
*/
public function hooks() {
add_action( 'admin_menu', array( $this, 'register_admin_menu' ) );
add_action( 'admin_init', array( $this, 'ssa_gravity_forms_editor_styles' ), 10, 0 );
add_action( 'admin_init', array( $this, 'dashboard_upcoming_appointments_widget' ) );
add_action( 'admin_init', array( $this, 'upcoming_appointments_widget' ) );
add_action( 'admin_init', array( $this, 'maybe_redirect' ), 0 );
add_action( 'admin_init', array( $this, 'store_enqueued_styles_scripts' ), 0 );
add_action( 'admin_enqueue_scripts', array( $this, 'disable_third_party_styles_scripts' ), 9999999 );
add_action( 'admin_body_class', array( $this, 'body_class' ) );
add_action( 'admin_print_scripts', array( $this, 'remove_admin_notices' ) );
add_filter( 'plugin_action_links', array( $this, 'plugin_action_upgrade_link'), 10, 2 );
// rest api
add_action( 'rest_api_init', array( $this, 'register_wp_endpoints' ) );
}
public function register_wp_endpoints(){
$namespace = 'ssa/v1';
register_rest_route( $namespace, '/pages', array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_wp_pages' ),
'permission_callback' => array( $this, 'get_wp_pages_permissions_check' ),
'args' => array(
'context' => array(
'default' => 'view',
),
),
),
) );
}
public function get_wp_pages_permissions_check( $request ) {
return current_user_can( 'ssa_manage_site_settings' );
}
public function get_wp_pages( $request ) {
$args = array(
'sort_order' => 'ASC',
'sort_column' => 'title',
);
$pages = get_pages($args);
// Adjust structure to match what the front-end expects
foreach ($pages as $key => $page) {
$pages[$key]->id = $page->ID;
$pages[$key]->title = array(
'rendered' => $page->post_title,
);
}
return rest_ensure_response( $pages );
}
public function ssa_gravity_forms_editor_styles() {
wp_enqueue_style( 'ssa_gravity_forms_editor_styles', $this->plugin->url( 'assets/css/ssa-gravity-forms-editor-styles.css' ), array(), Simply_Schedule_Appointments::VERSION );
}
public function dashboard_upcoming_appointments_widget() {
wp_enqueue_style( 'dashboard_upcoming_appointments_widget_styles', $this->plugin->url( 'assets/css/dashboard-upcoming-appointments-widget.css' ), array(), Simply_Schedule_Appointments::VERSION );
}
public function upcoming_appointments_widget() {
wp_enqueue_style( 'upcoming_appointments_widget_styles', $this->plugin->url( 'assets/css/upcoming-appointments.css' ), array(), Simply_Schedule_Appointments::VERSION );
}
public function maybe_redirect() {
if ( !empty( $_GET['page'] ) && $_GET['page'] === 'simply-schedule-appointments-settings' ) {
wp_redirect( $this->url( '/ssa/settings/all' ) );
exit;
}
if ( !empty( $_GET['page'] ) && $_GET['page'] === 'simply-schedule-appointments-types' ) {
wp_redirect( $this->url( '/ssa/appointment-types/all' ) );
exit;
}
if ( !empty( $_GET['page'] ) && $_GET['page'] === 'simply-schedule-appointments-support' ) {
wp_redirect( $this->url( '/ssa/support' ) );
exit;
}
if ( !empty( $_GET['page'] ) && $_GET['page'] === 'simply-schedule-appointments-team' ) {
wp_redirect( $this->url( '/ssa/settings/staff/all' ) );
exit;
}
if ( !empty( $_GET['page'] ) && $_GET['page'] === 'simply-schedule-appointments-ssa-support-admin' ) {
wp_redirect( admin_url( 'admin.php?page=simply-schedule-appointments&ssa-support-admin=1' ) );
exit;
}
}
public function url( $path='' ) {
$url = admin_url( 'admin.php?page=simply-schedule-appointments' );
if ( empty( $path ) ) {
return $url;
}
$path = ltrim( $path, '/' );
$url .= '/#/'.$path;
return $url;
}
public function remove_admin_notices() {
if ( !$this->is_admin_page() ) {
return;
}
global $wp_filter;
if (is_user_admin()) {
if (isset($wp_filter['user_admin_notices'])) {
unset($wp_filter['user_admin_notices']);
}
} elseif (isset($wp_filter['admin_notices'])) {
unset($wp_filter['admin_notices']);
}
if (isset($wp_filter['all_admin_notices'])) {
unset($wp_filter['all_admin_notices']);
}
}
public function is_admin_page() {
if ( empty( $_GET['page'] ) || strpos( $_GET['page'], 'simply-schedule-appointments' ) === false ) {
return false;
}
return true;
}
public function store_enqueued_styles_scripts() {
if ( !$this->is_admin_page() ) {
return;
}
global $wp_scripts;
$this->script_handle_whitelist = $wp_scripts->queue;
}
public function disable_third_party_styles_scripts() {
if ( ! $this->is_admin_page() ) {
return;
}
if ( $this->should_restrict_access_to_admin_page() ) {
return;
}
$custom_whitelist = array(
);
global $wp_scripts;
foreach ($wp_scripts->queue as $key => $handle) {
if ( strpos( $handle, 'ssa-' ) === 0 ) {
continue;
}
if ( in_array( $handle, $this->script_handle_whitelist ) || in_array( $handle, $custom_whitelist ) ) {
continue;
}
wp_dequeue_script( $handle );
}
global $wp_styles;
foreach ($wp_styles->queue as $key => $handle) {
if ( strpos( $handle, 'ssa-' ) === 0 ) {
continue;
}
if ( in_array( $handle, $this->style_handle_whitelist ) || in_array( $handle, $custom_whitelist ) ) {
continue;
}
wp_dequeue_style( $handle );
}
}
public function plugin_action_upgrade_link( $links, $file ) {
if ( strpos($file, 'simply-schedule-appointments.php') === false ) {
return $links;
}
if ( $this->plugin->get_current_edition() !== 1 ) {
return $links;
}
$ssa_pricing_url = 'https://simplyscheduleappointments.com/pricing/?utm_source=plugin&utm_medium=ads&utm_campaign=upgrade&utm_content=upgrade-plugin-listing';
echo "<style id='ssa-admin-dash-upgrade-link-css'>
.ssa-basic-upgrade-link-admin-dash {
padding: 2px 4px;
border-radius: 2px;
background-color: #037b77;
color: #fff;
border: none;
}
.ssa-basic-upgrade-link-admin-dash:hover {
background-color: #046a66;
color: white;
}
</style>";
$upgrade_link = '<a class="ssa-basic-upgrade-link-admin-dash" target="_blank" href="' . $ssa_pricing_url . '">' . __('Upgrade', 'simply-schedule-appointments') . '</a>';
$links['upgrade'] = $upgrade_link;
return $links;
}
public function register_admin_menu() {
add_menu_page(
__('Appointments', 'simply-schedule-appointments' ),
__('Appointments', 'simply-schedule-appointments' ),
'ssa_manage_appointments',
'simply-schedule-appointments',
array( $this, 'render_admin_page' ),
'dashicons-calendar',
null
);
$settings = $this->plugin->settings->get();
if ( !empty( $settings['global']['wizard_completed'] ) ) {
add_submenu_page(
'simply-schedule-appointments',
__('Appointment Types', 'simply-schedule-appointments' ),
__('Appointment Types', 'simply-schedule-appointments' ),
'ssa_manage_appointment_types',
'simply-schedule-appointments-types',
array( $this, 'render_admin_page' )
);
if( class_exists( 'SSA_Staff' ) && $this->plugin->settings_installed->is_enabled( 'staff' ) ) {
add_submenu_page(
'simply-schedule-appointments',
__('Team', 'simply-schedule-appointments' ),
__('Team', 'simply-schedule-appointments' ),
'ssa_manage_staff',
'simply-schedule-appointments-team',
array( $this, 'render_admin_page' )
);
}
add_submenu_page(
'simply-schedule-appointments',
__('Settings', 'simply-schedule-appointments' ),
__('Settings', 'simply-schedule-appointments' ),
'ssa_manage_site_settings',
'simply-schedule-appointments-settings',
array( $this, 'render_admin_page' )
);
if ( SSA_Support::should_display_support_tab() ) {
add_submenu_page(
'simply-schedule-appointments',
__('Support', 'simply-schedule-appointments' ),
__('Support', 'simply-schedule-appointments' ),
'ssa_manage_site_settings',
'simply-schedule-appointments-support',
array( $this, 'render_admin_page' )
);
}
}
}
public function should_restrict_access_to_admin_page() {
if ( ! current_user_can( 'ssa_manage_others_appointments' ) ) {
if ( ! current_user_can( 'ssa_manage_site_settings' ) ) {
$staff = $this->plugin->staff_model->find_by_user_id( get_current_user_id() );
if ( empty( $staff['id'] ) ) {
// This is user with the "Team Member" role but who isn't associated to a staff_id
return true;
} else if ( 'publish' !== $staff['status'] ) {
// This is user with the "Team Member" role but is linked to an inactive/deleted Team Member
return true;
}
}
}
return false;
}
public function render_admin_page() {
if ( $this->should_restrict_access_to_admin_page() ) {
wp_die( __( 'Please ask your administrator to link your account to an active team member.', 'simply-schedule-appointments' ), __( 'Permission Denied', 'simply-schedule-appointments' ) );
}
remove_filter( 'script_loader_tag', 'mesmerize_defer_js_scripts', 11 ); // remove bug with 3rd party "Mesmerize" theme
remove_filter( 'style_loader_tag', 'mesmerize_defer_css_scripts', 11 ); // remove bug with 3rd party "Mesmerize" theme
//
wp_enqueue_style( 'ssa-admin-material-icons', $this->plugin->url('assets/css/material-icons.css'), array(), Simply_Schedule_Appointments::VERSION );
wp_enqueue_style( 'ssa-admin-vendor', $this->plugin->url('admin-app/dist/static/css/chunk-vendors.css'), array(), Simply_Schedule_Appointments::VERSION );
wp_enqueue_style( 'ssa-admin-style', $this->plugin->url('admin-app/dist/static/css/app.css'), array('ssa-admin-vendor'), Simply_Schedule_Appointments::VERSION );
wp_enqueue_style( 'ssa-admin-roboto-font', $this->plugin->url('assets/css/roboto-font.css'), array(), Simply_Schedule_Appointments::VERSION );
wp_enqueue_style( 'ssa-unsupported-style', $this->plugin->url('assets/css/unsupported.css'), array(), Simply_Schedule_Appointments::VERSION );
wp_enqueue_style( 'ssa-admin-style-custom', $this->plugin->templates->locate_template_url('admin-app/custom.css'), array(), Simply_Schedule_Appointments::VERSION );
wp_enqueue_script( 'ssa-unsupported-script', $this->plugin->url('assets/js/unsupported.js'), array(), Simply_Schedule_Appointments::VERSION);
wp_enqueue_script( 'ssa-admin-manifest', $this->plugin->url('admin-app/dist/static/js/manifest.js'), array(), Simply_Schedule_Appointments::VERSION, true );
wp_enqueue_script( 'ssa-admin-vendor', $this->plugin->url('admin-app/dist/static/js/chunk-vendors.js'), array( 'ssa-admin-manifest' ), Simply_Schedule_Appointments::VERSION, true );
wp_register_script( 'ssa-admin-app', $this->plugin->url('admin-app/dist/static/js/app.js'), array( 'ssa-admin-vendor' ), Simply_Schedule_Appointments::VERSION, true );
$pinned_notices = $this->plugin->notices->get_pinned_notices();
$error_notices = $this->plugin->error_notices->get_error_notices();
$settings = $this->plugin->settings->get();
$settings = $this->plugin->settings->remove_unauthorized_settings_for_current_user( $settings );
$appointment_types = $this->plugin->appointment_type_model->get_all_appointment_types();
$appointment_type_labels = $this->plugin->appointment_type_label_model->query();
wp_localize_script( 'ssa-admin-app', 'ssa',
$this->plugin->bootstrap->get_api_vars() );
wp_localize_script( 'ssa-admin-app', 'ssa_pinned_notices', $pinned_notices );
wp_localize_script( 'ssa-admin-app', 'ssa_error_notices', $error_notices );
wp_localize_script( 'ssa-admin-app', 'ssa_settings', $settings );
wp_localize_script( 'ssa-admin-app', 'ssa_appointment_types', $appointment_types );
wp_localize_script( 'ssa-admin-app', 'ssa_appointment_type_labels', $appointment_type_labels );
wp_localize_script( 'ssa-admin-app', 'ssa_translations', $this->get_translations() );
wp_enqueue_script( 'ssa-admin-app' );
echo '
<style>
body.wp-admin.admin-bar.ssa-admin-app #wpadminbar,
body.wp-admin.admin-bar.ssa-admin-app #adminmenumain,
body.wp-admin.admin-bar.ssa-admin-app #wpfooter,
body.wp-admin.admin-bar.ssa-admin-app .hidden,
body.wp-admin.admin-bar.ssa-admin-app .wpsso-notice.notice,
#wpadminbar,
#adminmenumain,
body.ssa-admin-app.wp-admin.has-toolbar-notices #wpadminbar,
body.ssa-admin-app.wp-admin.is-fullscreen-mode.has-toolbar-notices #wpadminbar,
body.ssa-admin-app.wp-admin.is-wp-toolbar-disabled.has-toolbar-notices #wpadminbar,
body.ssa-admin-app.wp-admin.woocommerce-embed-page.has-toolbar-notices #wpadminbar,
#wpfooter {
display: none !important;
}
.hidden {
display: none;
}
</style>
<div id="ssa-admin-app">
<noscript>
<div class="unsupported">
<div class="unsupported-container">
<img class="unsupported-icon" src="' . $this->plugin->url('admin-app/dist/static/images/foxes/fox-sleeping.svg') . '"/>
<h1 class="unsupported-label">' . __('Simply Schedule Appointments requires JavaScript', 'simply-schedule-appointments') . '</h1>
<p class="unsupported-description">' . __('Please make sure you enable JavaScript in your browser.', 'simply-schedule-appointments') . '</p>
</div>
</div>
</noscript>
</div>
<div id="ssa-unsupported" style="display:none;">
<div class="unsupported">
<div class="unsupported-container">
<img class="unsupported-icon" src="' . $this->plugin->url('admin-app/dist/static/images/foxes/fox-sleeping.svg') . '"/>
<h1 class="unsupported-label">' . __('Unsupported Browser', 'simply-schedule-appointments') . '</h1>
<p class="unsupported-description">' . __('Please update your browser to something more modern. We recommend Firefox or Chrome.', 'simply-schedule-appointments') . '</p>
</div>
</div>
</div>
';
}
public function get_translations() {
include $this->plugin->dir( 'languages/admin-app-translations.php' );
return $translations;
}
public function body_class( $classes ) {
if ( !$this->is_admin_page() ) {
return $classes;
}
$classes = "$classes ssa-admin-app "; // adding a trailing space for conflicts with poorly coded plugins
return $classes;
}
public function maybe_create_booking_page() {
$settings = $this->plugin->settings->get();
if ( empty( $settings['global']['booking_post_id'] ) ) {
return $this->create_booking_page();
}
$appointment = $this->plugin->appointment_model->get( $settings['global']['booking_post_id'] );
if ( empty( $appointment['id'] ) ) {
return $this->create_booking_page();
}
return $settings['global']['booking_post_id'];
}
public function create_booking_page() {
$wp_error = null;
$post_id = wp_insert_post( array(
'post_type' => 'page',
'post_status' => 'publish',
'post_title' => 'Schedule an Appointment',
'post_name' => 'appointments',
'post_content' => '[ssa_booking]',
), $wp_error );
$settings = $this->plugin->settings->get();
$settings['global']['booking_post_id'] = $post_id;
$this->plugin->settings->update_section( 'global', $settings['global'] );
return $post_id;
}
}