2026-03-27 11:54:51 +00:00

444 lines
12 KiB
PHP

<?php
/**
* Elementor Upcoming Appointments Widget.
*
* Elementor widget that inserts a coverflow-style carousel into the page.
*
* @since 1.0.0
*/
class SSA_Elementor_Upcoming_Appointments_Widget extends \Elementor\Widget_Base {
/**
* Get widget name.
*
* Retrieve coverflow carousel widget name.
*
* @since 1.0.0
* @access public
*
* @return string Widget name.
*/
public function get_name() {
return 'ssa-upcoming-appointments';
}
/**
* Get widget title.
*
* Retrieve Upcoming Appointments widget title.
*
* @since 1.0.0
* @access public
*
* @return string Widget title.
*/
public function get_title() {
return __( 'Upcoming Appointments', 'simply-schedule-appointments' );
}
/**
* Get widget icon.
*
* Retrieve Upcoming Appointments widget icon.
*
* @since 1.0.0
* @access public
*
* @return string Widget icon.
*/
public function get_icon() {
return 'eicon-calendar';
}
/**
* Get widget keywords.
*
* Retrieve the list of keywords the widget belongs to.
*
* @since 2.1.0
* @access public
*
* @return array Widget keywords.
*/
public function get_keywords() {
return [ 'ssa', 'schedule', 'calendar', 'appointments', 'simply' ];
}
/**
* Get widget categories.
*
* Retrieve the list of categories the Upcoming Appointments widget belongs to.
*
* @since 1.0.0
* @access public
*
* @return array Widget categories.
*/
public function get_categories() {
return [ 'general' ];
}
/**
* Retrieve the list of scripts the Upcoming Appointments widget depended on.
*
* Used to set scripts dependencies required to run the widget.
*
* @since 1.3.0
* @access public
*
* @return array Widget scripts dependencies.
*/
public function get_script_depends() {
return [];
}
/**
* Retrieve the list of styles the Upcoming Appointments widget depended on.
*
* Used to set style dependencies required to run the widget.
*
* @since 1.3.0
* @access public
*
* @return array Widget styles dependencies.
*/
public function get_style_depends() {
return [];
}
/**
* Determines whether to show the Staff section in the Upcoming Appointments editor block.
*
* Checks if the Staff feature is installed, enabled, and has at least one published staff member.
* If these conditions are met, it indicates that the Staff section should be displayed.
*
* @since 1.0.0
*
* @return bool True if the Staff section should be shown, false otherwise.
*/
public function should_show_staff_section() {
$is_staff_installed = ssa()->settings_installed->is_installed( 'staff' );
$is_staff_enabled = ssa()->settings_installed->is_enabled( 'staff' );
$is_staff_initialized = false;
if( $is_staff_enabled ) {
$staff_object_query = ssa()->staff_model->query( array(
'status' => 'publish',
));
if (is_array($staff_object_query) && count($staff_object_query) > 0) {
$is_staff_initialized = true;
}
}
$show_settings_block = false;
if ( $is_staff_installed && $is_staff_initialized ) {
$show_settings_block = true;
}
return $show_settings_block;
}
/**
* Determines whether to show the Resources section in the Upcoming Appointments editor block.
*
* Checks if the Resources feature is installed, enabled, and has Resource that are not of type identical.
* If these conditions are met, it indicates that the Resources section should be displayed.
*
* @since 1.0.0
*
* @return bool True if the Resources section should be shown, false otherwise.
*/
public function should_show_resources_section() {
$is_resources_installed = ssa()->settings_installed->is_installed( 'resources' );
$is_resources_enabled = ssa()->settings_installed->is_enabled( 'resources' );
$is_resources_initialized = false;
if( $is_resources_enabled ) {
$resources_object_query = ssa()->resource_group_model->query( array(
'status' => 'publish',
));
$filtered_resources_object = array_values(array_filter($resources_object_query, function($resource) {
return $resource['resource_type'] !== 'identical';
}));
if (is_array($filtered_resources_object) && count($filtered_resources_object) > 0) {
$is_resources_initialized = true;
}
}
$show_settings_block = false;
if ( $is_resources_installed && $is_resources_initialized ) {
$show_settings_block = true;
}
return $show_settings_block;
}
/**
* Register Upcoming Appointments widget controls.
*
* Adds different input fields to allow the user to change and customize the widget settings.
*
* @since 1.0.0
* @access protected
*/
protected function register_controls() {
/* Block header */
$this->start_controls_section(
'upcoming_appointments_block_section',
[
'label' => __( 'Block Description', 'simply-schedule-appointments' ),
'tab' => \Elementor\Controls_Manager::TAB_CONTENT,
]
);
$icon_url = $this->get_icon();
$this->add_control(
'title',
[
'raw' => '<div><i class="' . esc_attr($icon_url) . '"></i><span> Upcoming Appointments</span></div>',
'type' => \Elementor\Controls_Manager::RAW_HTML,
]
);
$this->add_control(
'description',
[
'raw' => '<p>' .esc_html__('Displays Upcoming Appointments. You can select what to show in the appointment card.', 'simply-schedule-appointments') . '</p>',
'type' => \Elementor\Controls_Manager::RAW_HTML,
]
);
$this->end_controls_section();
/* Display information block */
$this->start_controls_section(
'ssa_upcoming_appointments_display',
[
'label' => __( 'Display Information', 'simply-schedule-appointments' ),
]
);
$display_option = [
'Display Appointment Types' => __('Appointment Types', 'simply-schedule-appointments'),
];
$default_display_option = key($display_option);
$this->add_control(
'appointmentDisplay',
[
'label' => esc_html__( $display_option[$default_display_option], 'textdomain' ),
'type' => \Elementor\Controls_Manager::SWITCHER,
'label_on' => esc_html__( 'Show', 'textdomain' ),
'label_off' => esc_html__( 'Hide', 'textdomain' ),
'return_value' => $default_display_option,
'default' => '',
]
);
$this->end_controls_section();
/* Display selectable resources */
if ($this->should_show_resources_section()) {
$this->start_controls_section(
'ssa_upcoming_appointments_display_resources',
[
'label' => __( 'Display Resources', 'simply-schedule-appointments' ),
]
);
$resource_display_setting = [
'Disable' => __('Display Resources', 'simply-schedule-appointments'),
];
$default_resource_display_setting = key($resource_display_setting);
$this->add_control(
'disable_resources',
[
'label' => esc_html__( $default_resource_display_setting, 'simply-schedule-appointments'),
'type' => \Elementor\Controls_Manager::SWITCHER,
'label_on' => esc_html__('Hide', 'simply-schedule-appointments'),
'label_off' => esc_html__('Show', 'simply-schedule-appointments'),
'return_value' => $resource_display_setting[$default_resource_display_setting],
'default' => $resource_display_setting[$default_resource_display_setting],
]
);
$all_display_option = [
'All' => __('All', 'simply-schedule-appointments'),
];
$default_all_display_setting = key($all_display_option);
$this->add_control(
'all_resources',
[
'label' => esc_html__( $default_all_display_setting, 'simply-schedule-appointments'),
'type' => \Elementor\Controls_Manager::SWITCHER,
'label_on' => esc_html__('Show', 'simply-schedule-appointments'),
'label_off' => esc_html__('Hide', 'simply-schedule-appointments'),
'return_value' => $all_display_option[$default_all_display_setting],
'default' => $all_display_option[$default_all_display_setting],
'condition' => [
'disable_resources' => '',
],
]
);
$appointment_resources = ssa()->resource_group_model->query( array(
'status' => 'publish'
));
$filtered_resources = array_values(array_filter($appointment_resources, function($resource) {
return $resource['resource_type'] !== 'identical';
}));
$ssa_appointment_label_key_values = wp_list_pluck( $filtered_resources, 'title', 'id' );
$this->add_control(
'selected_resources',
[
'label' => esc_html__('Resources', 'simply-schedule-appointments'),
'type' => \Elementor\Controls_Manager::SELECT2,
'options' => $ssa_appointment_label_key_values,
'label_block' => true,
'multiple' => true,
'frontend_available' => true,
'condition' => [
'disable_resources' => '',
'all_resources' => ''
],
]
);
$this->end_controls_section();
}
/* Display team member information */
if ($this->should_show_staff_section()) {
$this->start_controls_section(
'ssa_upcoming_appointments_display_member_information',
[
'label' => __( 'Display Team Member Information', 'simply-schedule-appointments' ),
]
);
$member_information_setting = [
'Disable' => __('Display Team Members', 'simply-schedule-appointments'),
];
$default_member_information_setting = key($member_information_setting);
$this->add_control(
'disable_member_info',
[
'label' => esc_html__( $default_member_information_setting, 'simply-schedule-appointments'),
'type' => \Elementor\Controls_Manager::SWITCHER,
'label_on' => esc_html__('Hide', 'simply-schedule-appointments'),
'label_off' => esc_html__('Show', 'simply-schedule-appointments'),
'return_value' => $member_information_setting[$default_member_information_setting],
'default' => $member_information_setting[$default_member_information_setting],
]
);
$member_information = [
'Display Member Names' => __('Team Member Names', 'simply-schedule-appointments'),
'Display Member Images' => __('Team Member Images', 'simply-schedule-appointments'),
];
foreach ($member_information as $slug => $label) {
$this->add_control(
'toggle_' . $slug,
[
'label' => esc_html__('Show ', 'simply-schedule-appointments') . $label,
'type' => \Elementor\Controls_Manager::SWITCHER,
'label_on' => esc_html__('Show', 'simply-schedule-appointments'),
'label_off' => esc_html__('Hide', 'simply-schedule-appointments'),
'return_value' => $slug,
'default' => '',
'condition' => [
'disable_member_info' => '',
],
]
);
}
$this->end_controls_section();
}
}
/**
* Render Upcoming Appointments widget output on the frontend.
*
* Written in PHP and used to generate the final HTML.
*
* @since 1.0.0
* @access protected
*/
protected function render() {
$settings = $this->get_settings_for_display();
if ($settings['appointmentDisplay']) {
$attrs['appointmentDisplay'] = $settings['appointmentDisplay'];
}
if ($this->should_show_resources_section()) {
if( ! empty($settings['disable_resources'])){
$attrs['resourceDisplay'] = $settings['disable_resources'];
}
if ( ! empty( $settings['selected_resources'] ) ) {
$attrs['resourceTypes'] = $settings['selected_resources'] ;
} else {
$attrs['resourceTypes'] = [];
}
if($settings['all_resources']){
$attrs['allResourcesTypeOption'] = $settings['all_resources'];
}
} else {
$attrs['resourceTypes'] = [];
}
$member_info = [];
if ($this->should_show_staff_section()) {
foreach ($settings as $key => $value) {
if (strpos($key, 'toggle_') === 0) {
if ($value && $key !== 'toggle_') {
$slug = substr($key, 7);
$member_info[] = $slug;
}
}
}
if (!empty($settings['disable_member_info'])) {
$member_info[] = $settings['disable_member_info'];
}
if (!empty($member_info)) {
$attrs['memberInfo'] = $member_info;
}
} else {
$attrs['memberInfo'] = [];
}
?>
<div class="elementor-ssa-upcoming-appointments-wrapper">
<div <?php echo $this->get_render_attribute_string( 'upcoming_appointments' ); ?>>
<div class="ssa-upcoming-appointments">
<?php echo ssa()->shortcodes->ssa_upcoming_appointments( array(
'block_settings' => $attrs
) ); ?>
</div>
</div>
</div>
<?php
}
}