PluginProbe
VikBooking Hotel Booking Engine & PMS / trunk
VikBooking Hotel Booking Engine & PMS vtrunk
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 1.7.3 All 36 releases
vikbooking / admin / layouts / sidepanel / multitasking.php

multitasking.php in VikBooking Hotel Booking Engine & PMS trunk, at admin/layouts/sidepanel/multitasking.php

369 lines 15.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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>
369