File "multitasking.php"

Full Path: /home/romayxjt/public_html/wp-content/plugins/vikbooking/admin/layouts/sidepanel/multitasking.php
File size: 15.86 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * @package     VikBooking
 * @subpackage  com_vikbooking
 * @author      Alessio Gaggii - E4J srl
 * @copyright   Copyright (C) 2022 e4j - Extensionsforjoomla.com. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 * @link        https://vikwp.com
 */

defined('ABSPATH') or die('No script kiddies please!');

/**
 * Obtain vars from arguments received in the layout file.
 * This layout file should be called once at most per page.
 * 
 * @var string  $vbo_page 	  the name of the current View in VBO.
 * @var string 	$btn_trigger  the CSS selector of the button that opens the panel.
 */
extract($displayData);

// make sure the current page name is set and it's a string
$vbo_page = isset($vbo_page) ? htmlspecialchars($vbo_page, ENT_QUOTES) : '';

// get the current page and root URIs
$vbo_page_uri = htmlspecialchars((string) JUri::getInstance(), ENT_QUOTES);
$root_uri 	  = htmlspecialchars(JUri::root(), ENT_QUOTES);

/**
 * We allow to sort the admin widgets.
 * 
 * @since 	1.16.10 (J) - 1.6.10 (WP)
 */
JHtml::fetch('script', VBO_SITE_URI.'resources/jquery-ui.sortable.min.js');

// get admin widgets helper
$widgets_helper = VikBooking::getAdminWidgetsInstance();

// get all widgets by preloading their assets (if any)
$admin_widgets = $widgets_helper->getWidgetNames($preload = true);

// load current widgets map for this page
$current_map = $widgets_helper->getMultitaskingMap($vbo_page);

// page active widgets list
$active_widgets = [];

// check if the notification audio file exists within VCM
$notif_audio_path = implode(DIRECTORY_SEPARATOR, [VCM_ADMIN_PATH, 'assets', 'css', 'audio', 'new_notification.mp3']);
$notif_audio_url  = is_file($notif_audio_path) ? (VCM_ADMIN_URI . implode('/', ['assets', 'css', 'audio', 'new_notification.mp3'])) : null;

// theme color preferences
$color_scheme = VikBooking::getAppearancePref();
$scheme_name  = JText::translate('VBO_APPEARANCE_PREF_AUTO');
$current_mode = 'magic';
if ($color_scheme == 'light') {
	$scheme_name = JText::translate('VBO_APPEARANCE_PREF_LIGHT');
	$current_mode = 'sun';
} elseif ($color_scheme == 'dark') {
	$scheme_name = JText::translate('VBO_APPEARANCE_PREF_DARK');
	$current_mode = 'moon';
}

// JS lang vars
JText::script('VBO_BROWSER_NOTIFS_ON');
JText::script('VBO_BROWSER_NOTIFS_OFF');
JText::script('VBO_BROWSER_NOTIFS_OFF_HELP');
JText::script('VBO_ADMIN_WIDGET');
JText::script('VBO_CONGRATS');
JText::script('VBO_APPEARANCE_PREF_AUTO');
JText::script('VBO_APPEARANCE_PREF_LIGHT');
JText::script('VBO_APPEARANCE_PREF_DARK');

?>

<div class="vbo-sidepanel-wrapper vbo-sidepanel-right vbo-sidepanel-close">

	<div class="vbo-sidepanel-container">

		<div class="vbo-sidepanel-layouts">
			<div class="vbo-sidepanel-dismiss">
				<span class="vbo-sidepanel-dismiss-btn"><?php VikBookingIcons::e('times'); ?></span>
			</div>
			<div class="vbo-sidepanel-notifications">
				<button type="button" class="vbo-sidepanel-notifications-btn"><?php VikBookingIcons::e('bell'); ?></button>
			</div>
			<div class="vbo-sidepanel-colorscheme">
				<span class="vbo-tooltip vbo-tooltip-bottom vbo-sidepanel-colorscheme-current" data-tooltiptext="<?php echo JHtml::fetch('esc_attr', $scheme_name); ?>"><?php VikBookingIcons::e($current_mode); ?></span>
				<div class="vbo-sidepanel-colorscheme-list">
					<div class="vbo-sidepanel-colorscheme-option<?php echo $color_scheme == 'auto' ? ' vbo-sidepanel-colorscheme-option-active' : ''; ?>" data-scheme="auto">
						<span><?php VikBookingIcons::e('magic'); ?> <?php echo JText::translate('VBO_APPEARANCE_PREF_AUTO'); ?></span>
					</div>
					<div class="vbo-sidepanel-colorscheme-option<?php echo $color_scheme == 'light' ? ' vbo-sidepanel-colorscheme-option-active' : ''; ?>" data-scheme="light">
						<span><?php VikBookingIcons::e('sun'); ?> <?php echo JText::translate('VBO_APPEARANCE_PREF_LIGHT'); ?></span>
					</div>
					<div class="vbo-sidepanel-colorscheme-option<?php echo $color_scheme == 'dark' ? ' vbo-sidepanel-colorscheme-option-active' : ''; ?>" data-scheme="dark">
						<span><?php VikBookingIcons::e('moon'); ?> <?php echo JText::translate('VBO_APPEARANCE_PREF_DARK'); ?></span>
					</div>
				</div>
			</div>
			<div class="vbo-sidepanel-layout-type">
				<span class="vbo-sidepanel-layout-large">
					<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96.75 75.3"><defs></defs><path d="M87.68,8.65a3.23,3.23,0,0,1,3.23,3.22V66.53a3.23,3.23,0,0,1-3.23,3.23H11.57a3.23,3.23,0,0,1-3.22-3.23V11.87a3.22,3.22,0,0,1,3.22-3.22H87.68m0-7.1H11.57A10.32,10.32,0,0,0,1.25,11.87V66.53A10.32,10.32,0,0,0,11.57,76.85H87.68A10.32,10.32,0,0,0,98,66.53V11.87A10.32,10.32,0,0,0,87.68,1.55Z" transform="translate(-1.25 -1.55)"/><rect id="wide" x="10.15" y="10" width="77.22" height="55.25" rx="4.94"/></svg>
				</span>
				<span class="vbo-sidepanel-layout-small">
					<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96.75 75.3"><defs></defs><path d="M87.68,8.65a3.23,3.23,0,0,1,3.23,3.22V66.53a3.23,3.23,0,0,1-3.23,3.23H11.57a3.23,3.23,0,0,1-3.22-3.23V11.87a3.22,3.22,0,0,1,3.22-3.22H87.68m0-7.1H11.57A10.32,10.32,0,0,0,1.25,11.87V66.53A10.32,10.32,0,0,0,11.57,76.85H87.68A10.32,10.32,0,0,0,98,66.53V11.87A10.32,10.32,0,0,0,87.68,1.55Z" transform="translate(-1.25 -1.55)"/><rect id="right" x="48.1" y="12.42" width="35.75" height="50.93" rx="3.23"/></svg>
				</span>
			</div>
		</div>

		<div class="vbo-sidepanel-body-top">

			<div class="vbo-sidepanel-search">
				<?php VikBookingIcons::e('search', 'vbo-sidepanel-search-input-icn'); ?>
				<input id="vbo-sidepanel-search-input" type="text" placeholder="<?php echo htmlspecialchars(JText::translate('VBO_SEARCH_ADMIN_WIDGETS')); ?>" value="" autocomplete="off" />
			</div>

			<div class="vbo-sidepanel-add-widgets">
			<?php
			foreach ($admin_widgets as $k => $admin_widget) {
				/**
				 * Add widget container must be focusable with "tabindex=-1" so that via JS we will
				 * have the "relatedTarget" event property set to this element when blurring on search field.
				 */
				?>
				<div class="vbo-sidepanel-add-widget" data-vbowidgetid="<?php echo $admin_widget->id; ?>" tabindex="-1">
					<div class="vbo-sidepanel-widget-info">
						<div class="vbo-sidepanel-widget-info-det">
							<span class="vbo-sidepanel-widget-icn vbo-admin-widget-style-<?php echo $admin_widget->style; ?>"><?php echo $admin_widget->icon; ?></span>
							<span class="vbo-sidepanel-widget-name"><?php echo $admin_widget->name; ?></span>
						</div>
						<div class="vbo-sidepanel-widget-add">
							<span class="vbo-widget-render-modal"><?php echo VikBookingIcons::e('far fa-window-restore'); ?></span>
							<span class="vbo-widget-render-regular"><?php echo VikBookingIcons::e('plus-circle'); ?></span>
						</div>
					</div>
					<div class="vbo-sidepanel-widget-tags" style="display: none;"><?php echo strtolower($admin_widget->name . ' ' . $admin_widget->descr); ?></div>
				</div>
				<?php
			}
			?>
				<div class="vbo-sidepanel-add-widgets-nores" style="display: none;">
					<span><?php echo JText::translate('VBONORESULTS'); ?></span>
				</div>
			</div>

		</div>

		<div class="vbo-sidepanel-active-widgets">
		<?php
		// get multitask data object
		$multitask_data = VBOMultitaskParser::getInstance($vbo_page, $vbo_page_uri)->getData();
		foreach ($current_map as $widget_id) {
			$widget_instance = $widgets_helper->getWidget($widget_id);
			if (!$widget_instance) {
				continue;
			}
			// turn on multitask flag
			$widget_instance->setInMultitask(true);
			// build widget info object
			$widget_info = new stdClass;
			$widget_info->id   = $widget_instance->getIdentifier();
			$widget_info->name = $widget_instance->getName();
			// push widget info object to list
			$active_widgets[] = $widget_info;
			?>
			<div class="vbo-admin-widgets-widget-output vbo-admin-widgets-container-small" data-vbowidgetid="<?php echo $widget_info->id; ?>">
				<div class="vbo-admin-widgets-widget-detach"><?php VikBookingIcons::e('window-restore'); ?></div>
				<?php $widget_instance->render($multitask_data); ?>
			</div>
			<?php
		}
		?>
		</div>

		<div class="vbo-sidepanel-shortcut" style="<?php echo $active_widgets ? 'display: none;' : ''; ?>">
				<div class="shortcut-keys">
				<span class="mod"></span>
				<span class="key">⏎</span>
			</div>
			<div class="shortcut-desc">
				<?php echo JText::translate('VBO_KEYBOARD_SHORTCUT'); ?>
			</div>
			<div class="shortcut-subdesc"></div>
		</div>

		<div class="vbo-sidepanel-edit-widgets">
			<div class="vbo-sidepanel-edit-widgets-wrap">
				<button class="btn btn-small vbo-sidepanel-edit-widgets-trig" style="<?php echo !count($active_widgets) ? 'display: none;' : ''; ?>"><?php echo JText::translate('VBO_WIDGETS_CUSTWIDGETS'); ?></button>
			</div>
		</div>

	</div>

</div>

<script type="text/javascript">
	jQuery(function() {

		// inject core properties
		VBOCore.setOptions({
			is_vbo: 			true,
			cms: 				"<?php echo VBOPlatformDetection::isWordPress() ? 'wordpress' : 'joomla'; ?>",
			widget_ajax_uri:    "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=exec_admin_widget'); ?>",
			assets_ajax_uri: 	"<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=widgets_get_assets'); ?>",
			multitask_ajax_uri: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=exec_multitask_widgets'); ?>",
			watchdata_ajax_uri: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=widgets_watch_data'); ?>",
			current_page: 	    "<?php echo $vbo_page; ?>",
			current_page_uri:   "<?php echo $vbo_page_uri; ?>",
			root_uri:   		"<?php echo $root_uri; ?>",
			admin_widgets: 	    <?php echo json_encode($active_widgets); ?>,
			notif_audio_url: 	"<?php echo $notif_audio_url; ?>",
			tn_texts: 			{
				notifs_enabled: 		Joomla.JText._('VBO_BROWSER_NOTIFS_ON'),
				notifs_disabled: 		Joomla.JText._('VBO_BROWSER_NOTIFS_OFF'),
				notifs_disabled_help: 	Joomla.JText._('VBO_BROWSER_NOTIFS_OFF_HELP'),
				admin_widget: 			Joomla.JText._('VBO_ADMIN_WIDGET'),
				congrats: 				Joomla.JText._('VBO_CONGRATS'),
			},
			default_loading_body: '<?php VikBookingIcons::e('circle-notch', 'fa-spin fa-fw'); ?>',
			service_worker_path:  '<?php echo VBOWebappServiceworker::getUri(); ?>',
			service_worker_scope: '<?php echo VBOWebappServiceworker::getScope(); ?>',
			push: 				  <?php echo json_encode(VBOWebappPush::getConfig()); ?>,
		});

		// initialize multitasking events
		VBOCore.prepareMultitasking({
			selector: 		 ".vbo-sidepanel-wrapper",
			sclass_l_small:  "vbo-sidepanel-right",
			sclass_l_large:  "vbo-sidepanel-large",
			btn_trigger: 	 "<?php echo $btn_trigger; ?>",
			search_selector: "#vbo-sidepanel-search-input",
			search_nores: 	 ".vbo-sidepanel-add-widgets-nores",
			close_selector:  ".vbo-sidepanel-dismiss-btn",
			t_layout_small:	 ".vbo-sidepanel-layout-small",
			t_layout_large:  ".vbo-sidepanel-layout-large",
			wclass_base_sel: ".vbo-admin-widgets-widget-output",
			wclass_l_small:  "vbo-admin-widgets-container-small",
			wclass_l_large:  "vbo-admin-widgets-container-large",
			addws_selector:	 ".vbo-sidepanel-add-widgets",
			addw_selector:	 ".vbo-sidepanel-add-widget",
			addwfs_selector: ".vbo-sidepanel-add-widget-focussed",
			wtags_selector:	 ".vbo-sidepanel-widget-tags",
			addw_data_attr:  "data-vbowidgetid",
			actws_selector:  ".vbo-sidepanel-active-widgets",
			editw_selector:  ".vbo-sidepanel-edit-widgets-trig",
			editmode_class:  "vbo-admin-widgets-widget-editing",
			rmwidget_class:  "vbo-admin-widgets-widget-remove",
			rmwidget_icn:  	 '<?php VikBookingIcons::e('times'); ?>',
			dtcwidget_class: "vbo-admin-widgets-widget-detach",
			dtctarget_class: "vbo-admin-widget-head",
			dtcwidget_icn: 	 '<?php VikBookingIcons::e('far fa-window-restore'); ?>',
			notif_selector:  ".vbo-sidepanel-notifications-btn",
			notif_on_class:  "vbo-sidepanel-notifications-on",
			notif_off_class: "vbo-sidepanel-notifications-off",
		});

		// install Service Worker
		VBOCore.installServiceWorker().then((registration) => {
			VBOCore.handlePushSubscription(registration).then((subscription) => {
				console.info('Push notifications are enabled');
			}).catch((error) => {
				console.warn(error);
			});
		}).catch((error) => {
			console.warn(error);
		});

		// color scheme preferences
		jQuery('.vbo-sidepanel-colorscheme-current').on('click', function() {
			jQuery('.vbo-sidepanel-colorscheme-list').toggleClass('vbo-sidepanel-colorscheme-list-show');
		});

		// color scheme selection
		jQuery('.vbo-sidepanel-colorscheme-option').on('click', function() {
			let set_mode = jQuery(this).attr('data-scheme');

			let vbo_css_base_uri = '<?php echo VBO_ADMIN_URI . (VBOPlatformDetection::isWordPress() ? 'resources/' : '') . 'vbo-appearance-%s.css'; ?>';
			let vbo_css_base_id  = 'vbo-css-appearance-';
			let vcm_css_base_id  = 'vcm-css-appearance-';
			let vbo_css_modes 	 = {
				auto: vbo_css_base_uri.replace('%s', 'auto'),
				dark: vbo_css_base_uri.replace('%s', 'dark'),
				light: null,
			};
			let vbo_mode_texts = {
				auto: Joomla.JText._('VBO_APPEARANCE_PREF_AUTO'),
				dark: Joomla.JText._('VBO_APPEARANCE_PREF_DARK'),
				light: Joomla.JText._('VBO_APPEARANCE_PREF_LIGHT'),
			};
			let vbo_mode_icons = {
				auto: '<?php VikBookingIcons::e('magic') ?>',
				dark: '<?php VikBookingIcons::e('moon') ?>',
				light: '<?php VikBookingIcons::e('sun') ?>',
			};

			if (!vbo_css_modes.hasOwnProperty(set_mode)) {
				return false;
			}

			// toggle active class
			jQuery('.vbo-sidepanel-colorscheme-option').removeClass('vbo-sidepanel-colorscheme-option-active');
			jQuery(this).addClass('vbo-sidepanel-colorscheme-option-active');

			// adjust current preference content
			jQuery('.vbo-sidepanel-colorscheme-current')
				.attr('data-tooltiptext', vbo_mode_texts[set_mode])
				.html(vbo_mode_icons[set_mode]);

			// set/unset CSS files from DOM
			for (let app_mode in vbo_css_modes) {
				if (!vbo_css_modes.hasOwnProperty(app_mode) || !vbo_css_modes[app_mode]) {
					continue;
				}
				if (app_mode == set_mode) {
					// set this CSS file
					jQuery('head').append('<link rel="stylesheet" id="' + vbo_css_base_id + app_mode + '" href="' + vbo_css_modes[app_mode] + '" media="all">');
				} else {
					// unset this CSS file
					if (jQuery('link#' + vbo_css_base_id + app_mode).length) {
						jQuery('link#' + vbo_css_base_id + app_mode).remove();
					} else if (jQuery('link#' + vbo_css_base_id + app_mode + '-css').length) {
						// WP framework may add "-css" as suffix to the given ID
						jQuery('link#' + vbo_css_base_id + app_mode + '-css').remove();
					}
					// check if the VCM related CSS file should be unset too
					if (jQuery('link#' + vcm_css_base_id + app_mode).length) {
						jQuery('link#' + vcm_css_base_id + app_mode).remove();
					} else if (jQuery('link#' + vcm_css_base_id + app_mode + '-css').length) {
						// WP framework may add "-css" as suffix to the given ID
						jQuery('link#' + vcm_css_base_id + app_mode + '-css').remove();
					}
				}
			}

			// close menu-list
			jQuery('.vbo-sidepanel-colorscheme-list').removeClass('vbo-sidepanel-colorscheme-list-show');

			// silently update configuration value
			VBOCore.doAjax(
				"<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=configuration.update'); ?>",
				{
					settings: {
						appearance_pref: set_mode,
					}
				},
				(success) => {
					// do nothing
				},
				(error) => {
					console.error(error);
				}
			);
		});

		// subscribe to the multitask-panel-close event to dismiss the color scheme selection menu
		document.addEventListener(VBOCore.multitask_close_event, function() {
			if (jQuery('.vbo-sidepanel-colorscheme-list-show').length) {
				jQuery('.vbo-sidepanel-colorscheme-list-show').removeClass('vbo-sidepanel-colorscheme-list-show');
			}
		});

		// dinamycally change the shortcut modifier depending on the OS
		const isMacOs = navigator.platform.toUpperCase().indexOf('MAC') === 0;
		jQuery('.vbo-sidepanel-shortcut .shortcut-keys .mod').text(isMacOs ? '⌘' : '⌃');
		jQuery('.vbo-sidepanel-shortcut .shortcut-subdesc').text(isMacOs ? '(CMD + ENTER)' : '(CTRL + ENTER)');
	});
</script>