PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.16
VikBooking Hotel Booking Engine & PMS v1.8.16
1.8.16 1.8.15 1.8.14 1.8.13 1.8.12 1.8.11 1.8.10 1.8.9 1.8.6 1.8.7 1.8.8 trunk 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 All 37 releases
← All changes | admin/layouts/sidepanel/multitasking.php +368 -0 1.6.1 → 1.8.16 View file →
@@ -1,0 +1,368 @@
1 +<?php
2 +/**
3 + * @package VikBooking
4 + * @subpackage com_vikbooking
5 + * @author Alessio Gaggii - E4J srl
6 + * @copyright Copyright (C) 2022 e4j - Extensionsforjoomla.com. All rights reserved.
7 + * @license GNU General Public License version 2 or later; see LICENSE
8 + * @link https://vikwp.com
9 + */
10 +
11 +defined('ABSPATH') or die('No script kiddies please!');
12 +
13 +/**
14 + * Obtain vars from arguments received in the layout file.
15 + * This layout file should be called once at most per page.
16 + *
17 + * @var string $vbo_page the name of the current View in VBO.
18 + * @var string $btn_trigger the CSS selector of the button that opens the panel.
19 + */
20 +extract($displayData);
21 +
22 +// make sure the current page name is set and it's a string
23 +$vbo_page = isset($vbo_page) ? htmlspecialchars($vbo_page, ENT_QUOTES) : '';
24 +
25 +// get the current page and root URIs
26 +$vbo_page_uri = htmlspecialchars((string) JUri::getInstance(), ENT_QUOTES);
27 +$root_uri = htmlspecialchars(JUri::root(), ENT_QUOTES);
28 +
29 +/**
30 + * We allow to sort the admin widgets.
31 + *
32 + * @since 1.16.10 (J) - 1.6.10 (WP)
33 + */
34 +JHtml::fetch('script', VBO_SITE_URI.'resources/jquery-ui.sortable.min.js');
35 +
36 +// get admin widgets helper
37 +$widgets_helper = VikBooking::getAdminWidgetsInstance();
38 +
39 +// get all widgets by preloading their assets (if any)
40 +$admin_widgets = $widgets_helper->getWidgetNames($preload = true);
41 +
42 +// load current widgets map for this page
43 +$current_map = $widgets_helper->getMultitaskingMap($vbo_page);
44 +
45 +// page active widgets list
46 +$active_widgets = [];
47 +
48 +// check if the notification audio file exists within VCM
49 +$notif_audio_path = implode(DIRECTORY_SEPARATOR, [VCM_ADMIN_PATH, 'assets', 'css', 'audio', 'new_notification.mp3']);
50 +$notif_audio_url = is_file($notif_audio_path) ? (VCM_ADMIN_URI . implode('/', ['assets', 'css', 'audio', 'new_notification.mp3'])) : null;
51 +
52 +// theme color preferences
53 +$color_scheme = VikBooking::getAppearancePref();
54 +$scheme_name = JText::translate('VBO_APPEARANCE_PREF_AUTO');
55 +$current_mode = 'magic';
56 +if ($color_scheme == 'light') {
57 + $scheme_name = JText::translate('VBO_APPEARANCE_PREF_LIGHT');
58 + $current_mode = 'sun';
59 +} elseif ($color_scheme == 'dark') {
60 + $scheme_name = JText::translate('VBO_APPEARANCE_PREF_DARK');
61 + $current_mode = 'moon';
62 +}
63 +
64 +// JS lang vars
65 +JText::script('VBO_BROWSER_NOTIFS_ON');
66 +JText::script('VBO_BROWSER_NOTIFS_OFF');
67 +JText::script('VBO_BROWSER_NOTIFS_OFF_HELP');
68 +JText::script('VBO_ADMIN_WIDGET');
69 +JText::script('VBO_CONGRATS');
70 +JText::script('VBO_APPEARANCE_PREF_AUTO');
71 +JText::script('VBO_APPEARANCE_PREF_LIGHT');
72 +JText::script('VBO_APPEARANCE_PREF_DARK');
73 +
74 +?>
75 +
76 +<div class="vbo-sidepanel-wrapper vbo-sidepanel-right vbo-sidepanel-close">
77 +
78 + <div class="vbo-sidepanel-container">
79 +
80 + <div class="vbo-sidepanel-layouts">
81 + <div class="vbo-sidepanel-dismiss">
82 + <span class="vbo-sidepanel-dismiss-btn"><?php VikBookingIcons::e('times'); ?></span>
83 + </div>
84 + <div class="vbo-sidepanel-notifications">
85 + <button type="button" class="vbo-sidepanel-notifications-btn"><?php VikBookingIcons::e('bell'); ?></button>
86 + </div>
87 + <div class="vbo-sidepanel-colorscheme">
88 + <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>
89 + <div class="vbo-sidepanel-colorscheme-list">
90 + <div class="vbo-sidepanel-colorscheme-option<?php echo $color_scheme == 'auto' ? ' vbo-sidepanel-colorscheme-option-active' : ''; ?>" data-scheme="auto">
91 + <span><?php VikBookingIcons::e('magic'); ?> <?php echo JText::translate('VBO_APPEARANCE_PREF_AUTO'); ?></span>
92 + </div>
93 + <div class="vbo-sidepanel-colorscheme-option<?php echo $color_scheme == 'light' ? ' vbo-sidepanel-colorscheme-option-active' : ''; ?>" data-scheme="light">
94 + <span><?php VikBookingIcons::e('sun'); ?> <?php echo JText::translate('VBO_APPEARANCE_PREF_LIGHT'); ?></span>
95 + </div>
96 + <div class="vbo-sidepanel-colorscheme-option<?php echo $color_scheme == 'dark' ? ' vbo-sidepanel-colorscheme-option-active' : ''; ?>" data-scheme="dark">
97 + <span><?php VikBookingIcons::e('moon'); ?> <?php echo JText::translate('VBO_APPEARANCE_PREF_DARK'); ?></span>
98 + </div>
99 + </div>
100 + </div>
101 + <div class="vbo-sidepanel-layout-type">
102 + <span class="vbo-sidepanel-layout-large">
103 + <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>
104 + </span>
105 + <span class="vbo-sidepanel-layout-small">
106 + <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>
107 + </span>
108 + </div>
109 + </div>
110 +
111 + <div class="vbo-sidepanel-body-top">
112 +
113 + <div class="vbo-sidepanel-search">
114 + <?php VikBookingIcons::e('search', 'vbo-sidepanel-search-input-icn'); ?>
115 + <input id="vbo-sidepanel-search-input" type="text" placeholder="<?php echo htmlspecialchars(JText::translate('VBO_SEARCH_ADMIN_WIDGETS')); ?>" value="" autocomplete="off" />
116 + </div>
117 +
118 + <div class="vbo-sidepanel-add-widgets">
119 + <?php
120 + foreach ($admin_widgets as $k => $admin_widget) {
121 + /**
122 + * Add widget container must be focusable with "tabindex=-1" so that via JS we will
123 + * have the "relatedTarget" event property set to this element when blurring on search field.
124 + */
125 + ?>
126 + <div class="vbo-sidepanel-add-widget" data-vbowidgetid="<?php echo $admin_widget->id; ?>" tabindex="-1">
127 + <div class="vbo-sidepanel-widget-info">
128 + <div class="vbo-sidepanel-widget-info-det">
129 + <span class="vbo-sidepanel-widget-icn vbo-admin-widget-style-<?php echo $admin_widget->style; ?>"><?php echo $admin_widget->icon; ?></span>
130 + <span class="vbo-sidepanel-widget-name"><?php echo $admin_widget->name; ?></span>
131 + </div>
132 + <div class="vbo-sidepanel-widget-add">
133 + <span class="vbo-widget-render-modal"><?php echo VikBookingIcons::e('far fa-window-restore'); ?></span>
134 + <span class="vbo-widget-render-regular"><?php echo VikBookingIcons::e('plus-circle'); ?></span>
135 + </div>
136 + </div>
137 + <div class="vbo-sidepanel-widget-tags" style="display: none;"><?php echo strtolower($admin_widget->name . ' ' . $admin_widget->descr); ?></div>
138 + </div>
139 + <?php
140 + }
141 + ?>
142 + <div class="vbo-sidepanel-add-widgets-nores" style="display: none;">
143 + <span><?php echo JText::translate('VBONORESULTS'); ?></span>
144 + </div>
145 + </div>
146 +
147 + </div>
148 +
149 + <div class="vbo-sidepanel-active-widgets">
150 + <?php
151 + // get multitask data object
152 + $multitask_data = VBOMultitaskParser::getInstance($vbo_page, $vbo_page_uri)->getData();
153 + foreach ($current_map as $widget_id) {
154 + $widget_instance = $widgets_helper->getWidget($widget_id);
155 + if (!$widget_instance) {
156 + continue;
157 + }
158 + // turn on multitask flag
159 + $widget_instance->setInMultitask(true);
160 + // build widget info object
161 + $widget_info = new stdClass;
162 + $widget_info->id = $widget_instance->getIdentifier();
163 + $widget_info->name = $widget_instance->getName();
164 + // push widget info object to list
165 + $active_widgets[] = $widget_info;
166 + ?>
167 + <div class="vbo-admin-widgets-widget-output vbo-admin-widgets-container-small" data-vbowidgetid="<?php echo $widget_info->id; ?>">
168 + <div class="vbo-admin-widgets-widget-detach"><?php VikBookingIcons::e('window-restore'); ?></div>
169 + <?php $widget_instance->render($multitask_data); ?>
170 + </div>
171 + <?php
172 + }
173 + ?>
174 + </div>
175 +
176 + <div class="vbo-sidepanel-shortcut" style="<?php echo $active_widgets ? 'display: none;' : ''; ?>">
177 + <div class="shortcut-keys">
178 + <span class="mod"></span>
179 + <span class="key">⏎</span>
180 + </div>
181 + <div class="shortcut-desc">
182 + <?php echo JText::translate('VBO_KEYBOARD_SHORTCUT'); ?>
183 + </div>
184 + <div class="shortcut-subdesc"></div>
185 + </div>
186 +
187 + <div class="vbo-sidepanel-edit-widgets">
188 + <div class="vbo-sidepanel-edit-widgets-wrap">
189 + <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>
190 + </div>
191 + </div>
192 +
193 + </div>
194 +
195 +</div>
196 +
197 +<script type="text/javascript">
198 + jQuery(function() {
199 +
200 + // inject core properties
201 + VBOCore.setOptions({
202 + is_vbo: true,
203 + cms: "<?php echo VBOPlatformDetection::isWordPress() ? 'wordpress' : 'joomla'; ?>",
204 + widget_ajax_uri: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=exec_admin_widget'); ?>",
205 + assets_ajax_uri: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=widgets_get_assets'); ?>",
206 + multitask_ajax_uri: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=exec_multitask_widgets'); ?>",
207 + watchdata_ajax_uri: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=widgets_watch_data'); ?>",
208 + current_page: "<?php echo $vbo_page; ?>",
209 + current_page_uri: "<?php echo $vbo_page_uri; ?>",
210 + root_uri: "<?php echo $root_uri; ?>",
211 + admin_widgets: <?php echo json_encode($active_widgets); ?>,
212 + notif_audio_url: "<?php echo $notif_audio_url; ?>",
213 + tn_texts: {
214 + notifs_enabled: Joomla.JText._('VBO_BROWSER_NOTIFS_ON'),
215 + notifs_disabled: Joomla.JText._('VBO_BROWSER_NOTIFS_OFF'),
216 + notifs_disabled_help: Joomla.JText._('VBO_BROWSER_NOTIFS_OFF_HELP'),
217 + admin_widget: Joomla.JText._('VBO_ADMIN_WIDGET'),
218 + congrats: Joomla.JText._('VBO_CONGRATS'),
219 + },
220 + default_loading_body: '<?php VikBookingIcons::e('circle-notch', 'fa-spin fa-fw'); ?>',
221 + service_worker_path: '<?php echo VBOWebappServiceworker::getUri(); ?>',
222 + service_worker_scope: '<?php echo VBOWebappServiceworker::getScope(); ?>',
223 + push: <?php echo json_encode(VBOWebappPush::getConfig()); ?>,
224 + });
225 +
226 + // initialize multitasking events
227 + VBOCore.prepareMultitasking({
228 + selector: ".vbo-sidepanel-wrapper",
229 + sclass_l_small: "vbo-sidepanel-right",
230 + sclass_l_large: "vbo-sidepanel-large",
231 + btn_trigger: "<?php echo $btn_trigger; ?>",
232 + search_selector: "#vbo-sidepanel-search-input",
233 + search_nores: ".vbo-sidepanel-add-widgets-nores",
234 + close_selector: ".vbo-sidepanel-dismiss-btn",
235 + t_layout_small: ".vbo-sidepanel-layout-small",
236 + t_layout_large: ".vbo-sidepanel-layout-large",
237 + wclass_base_sel: ".vbo-admin-widgets-widget-output",
238 + wclass_l_small: "vbo-admin-widgets-container-small",
239 + wclass_l_large: "vbo-admin-widgets-container-large",
240 + addws_selector: ".vbo-sidepanel-add-widgets",
241 + addw_selector: ".vbo-sidepanel-add-widget",
242 + addwfs_selector: ".vbo-sidepanel-add-widget-focussed",
243 + wtags_selector: ".vbo-sidepanel-widget-tags",
244 + addw_data_attr: "data-vbowidgetid",
245 + actws_selector: ".vbo-sidepanel-active-widgets",
246 + editw_selector: ".vbo-sidepanel-edit-widgets-trig",
247 + editmode_class: "vbo-admin-widgets-widget-editing",
248 + rmwidget_class: "vbo-admin-widgets-widget-remove",
249 + rmwidget_icn: '<?php VikBookingIcons::e('times'); ?>',
250 + dtcwidget_class: "vbo-admin-widgets-widget-detach",
251 + dtctarget_class: "vbo-admin-widget-head",
252 + dtcwidget_icn: '<?php VikBookingIcons::e('far fa-window-restore'); ?>',
253 + notif_selector: ".vbo-sidepanel-notifications-btn",
254 + notif_on_class: "vbo-sidepanel-notifications-on",
255 + notif_off_class: "vbo-sidepanel-notifications-off",
256 + });
257 +
258 + // install Service Worker
259 + VBOCore.installServiceWorker().then((registration) => {
260 + VBOCore.handlePushSubscription(registration).then((subscription) => {
261 + console.info('Push notifications are enabled');
262 + }).catch((error) => {
263 + console.warn(error);
264 + });
265 + }).catch((error) => {
266 + console.warn(error);
267 + });
268 +
269 + // color scheme preferences
270 + jQuery('.vbo-sidepanel-colorscheme-current').on('click', function() {
271 + jQuery('.vbo-sidepanel-colorscheme-list').toggleClass('vbo-sidepanel-colorscheme-list-show');
272 + });
273 +
274 + // color scheme selection
275 + jQuery('.vbo-sidepanel-colorscheme-option').on('click', function() {
276 + let set_mode = jQuery(this).attr('data-scheme');
277 +
278 + let vbo_css_base_uri = '<?php echo VBO_ADMIN_URI . (VBOPlatformDetection::isWordPress() ? 'resources/' : '') . 'vbo-appearance-%s.css'; ?>';
279 + let vbo_css_base_id = 'vbo-css-appearance-';
280 + let vcm_css_base_id = 'vcm-css-appearance-';
281 + let vbo_css_modes = {
282 + auto: vbo_css_base_uri.replace('%s', 'auto'),
283 + dark: vbo_css_base_uri.replace('%s', 'dark'),
284 + light: null,
285 + };
286 + let vbo_mode_texts = {
287 + auto: Joomla.JText._('VBO_APPEARANCE_PREF_AUTO'),
288 + dark: Joomla.JText._('VBO_APPEARANCE_PREF_DARK'),
289 + light: Joomla.JText._('VBO_APPEARANCE_PREF_LIGHT'),
290 + };
291 + let vbo_mode_icons = {
292 + auto: '<?php VikBookingIcons::e('magic') ?>',
293 + dark: '<?php VikBookingIcons::e('moon') ?>',
294 + light: '<?php VikBookingIcons::e('sun') ?>',
295 + };
296 +
297 + if (!vbo_css_modes.hasOwnProperty(set_mode)) {
298 + return false;
299 + }
300 +
301 + // toggle active class
302 + jQuery('.vbo-sidepanel-colorscheme-option').removeClass('vbo-sidepanel-colorscheme-option-active');
303 + jQuery(this).addClass('vbo-sidepanel-colorscheme-option-active');
304 +
305 + // adjust current preference content
306 + jQuery('.vbo-sidepanel-colorscheme-current')
307 + .attr('data-tooltiptext', vbo_mode_texts[set_mode])
308 + .html(vbo_mode_icons[set_mode]);
309 +
310 + // set/unset CSS files from DOM
311 + for (let app_mode in vbo_css_modes) {
312 + if (!vbo_css_modes.hasOwnProperty(app_mode) || !vbo_css_modes[app_mode]) {
313 + continue;
314 + }
315 + if (app_mode == set_mode) {
316 + // set this CSS file
317 + jQuery('head').append('<link rel="stylesheet" id="' + vbo_css_base_id + app_mode + '" href="' + vbo_css_modes[app_mode] + '" media="all">');
318 + } else {
319 + // unset this CSS file
320 + if (jQuery('link#' + vbo_css_base_id + app_mode).length) {
321 + jQuery('link#' + vbo_css_base_id + app_mode).remove();
322 + } else if (jQuery('link#' + vbo_css_base_id + app_mode + '-css').length) {
323 + // WP framework may add "-css" as suffix to the given ID
324 + jQuery('link#' + vbo_css_base_id + app_mode + '-css').remove();
325 + }
326 + // check if the VCM related CSS file should be unset too
327 + if (jQuery('link#' + vcm_css_base_id + app_mode).length) {
328 + jQuery('link#' + vcm_css_base_id + app_mode).remove();
329 + } else if (jQuery('link#' + vcm_css_base_id + app_mode + '-css').length) {
330 + // WP framework may add "-css" as suffix to the given ID
331 + jQuery('link#' + vcm_css_base_id + app_mode + '-css').remove();
332 + }
333 + }
334 + }
335 +
336 + // close menu-list
337 + jQuery('.vbo-sidepanel-colorscheme-list').removeClass('vbo-sidepanel-colorscheme-list-show');
338 +
339 + // silently update configuration value
340 + VBOCore.doAjax(
341 + "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=configuration.update'); ?>",
342 + {
343 + settings: {
344 + appearance_pref: set_mode,
345 + }
346 + },
347 + (success) => {
348 + // do nothing
349 + },
350 + (error) => {
351 + console.error(error);
352 + }
353 + );
354 + });
355 +
356 + // subscribe to the multitask-panel-close event to dismiss the color scheme selection menu
357 + document.addEventListener(VBOCore.multitask_close_event, function() {
358 + if (jQuery('.vbo-sidepanel-colorscheme-list-show').length) {
359 + jQuery('.vbo-sidepanel-colorscheme-list-show').removeClass('vbo-sidepanel-colorscheme-list-show');
360 + }
361 + });
362 +
363 + // dinamycally change the shortcut modifier depending on the OS
364 + const isMacOs = navigator.platform.toUpperCase().indexOf('MAC') === 0;
365 + jQuery('.vbo-sidepanel-shortcut .shortcut-keys .mod').text(isMacOs ? '⌘' : '⌃');
366 + jQuery('.vbo-sidepanel-shortcut .shortcut-subdesc').text(isMacOs ? '(CMD + ENTER)' : '(CTRL + ENTER)');
367 + });
368 +</script>