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
vikbooking / site / layouts / tools / work_days.php

work_days.php in VikBooking Hotel Booking Engine & PMS 1.8.16, at site/layouts/tools/work_days.php

300 lines 10.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) 2025 E4J srl. 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 is the layout file for the "work_days" operator tool.
16 *
17 * @var string $tool The tool identifier.
18 * @var array $operator The operator record accessing the tool.
19 * @var object $permissions The operator-tool permissions registry.
20 * @var string $tool_uri The base URI for rendering this tool.
21 */
22 extract($displayData);
23
24 // access environment objects
25 $app = JFactory::getApplication();
26 $vbo_app = VikBooking::getVboApplication();
27
28 // load assets
29 $vbo_app->loadDatePicker();
30 $vbo_app->loadSelect2();
31
32 $nowdf = VikBooking::getDateFormat();
33 if ($nowdf == "%d/%m/%Y") {
34 $usedf = 'd/m/Y';
35 } elseif ($nowdf == "%m/%d/%Y") {
36 $usedf = 'm/d/Y';
37 } else {
38 $usedf = 'Y/m/d';
39 }
40 $datesep = VikBooking::getDateSeparator();
41
42 // get the current operator permissions
43 $perm_work_days_exceptions = (bool) $permissions->get('work_days_exceptions', 0);
44
45 if ($app->input->getBool('update_operator', false) && JSession::checkToken()) {
46 // safely update values upon form submit
47 $dbo = JFactory::getDbo();
48
49 // normalize to linear array
50 $work_days_week = (array) $app->input->get('work_days_week', [], 'array');
51 $work_days_week_schedule = array_combine(array_keys($work_days_week), array_values($work_days_week));
52 $work_days_week = [];
53 foreach ($work_days_week_schedule as $wday => $whours) {
54 $work_days_week[] = [
55 'wday' => $wday,
56 'hours' => $whours,
57 ];
58 }
59
60 // build operator update values
61 $update = [
62 'id' => $operator['id'],
63 'work_days_week' => json_encode($work_days_week),
64 ];
65
66 if ($perm_work_days_exceptions) {
67 // normalize to linear array
68 $work_days_exceptions = (array) $app->input->get('work_days_exceptions', [], 'array');
69 foreach ($work_days_exceptions as &$wexceptions) {
70 if (is_scalar($wexceptions)) {
71 $wexceptions = json_decode($wexceptions, true);
72 }
73 }
74 unset($wexceptions);
75
76 // set operator update value
77 $update['work_days_exceptions'] = json_encode($work_days_exceptions);
78 }
79
80 $update = (object) $update;
81 $dbo->updateObject('#__vikbooking_operators', $update, 'id');
82
83 $app->enqueueMessage(JText::translate('VBOSUBMITPRECHECKINTNKS'), 'success');
84 $app->redirect($tool_uri);
85 $app->close();
86 }
87
88 ?>
89
90 <form action="<?php echo $tool_uri; ?>" method="POST">
91 <div class="vbo-site-container vbo-site-container-full vbo-site-container-compact">
92 <div class="vbo-params-wrap">
93 <div class="vbo-params-container">
94 <div class="vbo-params-block vbo-params-block-full-setting">
95
96 <div class="vbo-param-container">
97 <div class="vbo-param-setting">
98 <span class="vbo-param-setting-comment"><?php echo JText::translate('VBO_WORK_DAYS_WEEK_HELP'); ?></span>
99 </div>
100 </div>
101
102 <?php
103 // manage work days week schedules
104 $work_days_list = [1, 2, 3, 4, 5, 6, 0];
105 foreach ($work_days_list as $w) {
106 ?>
107 <div class="vbo-param-container">
108 <div class="vbo-param-label"><?php echo VikBooking::sayWeekDay($w); ?></div>
109 <div class="vbo-param-setting">
110 <select name="work_days_week[<?php echo $w; ?>]" id="vbo-mngoper-work-days-week-<?php echo $w; ?>">
111 <option value="0"><?php echo JText::translate('VBO_DAY_OFF'); ?></option>
112 <optgroup label="<?php echo JHtml::fetch('esc_attr', JText::translate('VBO_WORKING_HOURS')); ?>">
113 <?php
114 for ($h = 1; $h <= 24; $h++) {
115 $is_selected = false;
116 foreach (($operator['work_days_week'] ?? []) as $wday_data) {
117 if ($wday_data['wday'] == $w) {
118 $is_selected = $is_selected || (($wday_data['hours'] ?? 0) == $h);
119 }
120 }
121 ?>
122 <option value="<?php echo $h; ?>"<?php echo $is_selected ? ' selected="selected"' : ''; ?>><?php echo sprintf('%d %s', $h, ($h > 1 ? JText::translate('VBO_HOURS') : JText::translate('VBO_HOUR'))); ?></option>
123 <?php
124 }
125 ?>
126 </optgroup>
127 </select>
128 </div>
129 </div>
130 <?php
131 }
132
133 if ($perm_work_days_exceptions) {
134 // manage the work days exceptions
135 ?>
136 <div class="vbo-param-container">
137 <div class="vbo-param-setting">
138 <span class="vbo-param-setting-comment"><?php echo JText::translate('VBO_WORK_DAYS_EXCEPTIONS_HELP'); ?></span>
139 </div>
140 </div>
141
142 <div class="vbo-param-container">
143 <div class="vbo-param-label"><?php echo JText::translate('VBO_EXCEPTIONS'); ?></div>
144 <div class="vbo-param-setting">
145 <div class="btn-toolbar vbo-mng-oper-work-dates">
146 <div class="btn-group pull-left">
147 <?php echo $vbo_app->getCalendar('', 'wdexceptfrom', 'wdexceptfrom', '%Y-%m-%d', array('class'=>'', 'size'=>'10', 'maxlength'=>'19', 'todayBtn' => 'true', 'placeholder' => JText::translate('VBCONFIGCLOSINGDATEFROM'))); ?>
148 </div>
149 <div class="btn-group pull-left">
150 <?php echo $vbo_app->getCalendar('', 'wdexceptto', 'wdexceptto', '%Y-%m-%d', array('class'=>'', 'size'=>'10', 'maxlength'=>'19', 'todayBtn' => 'true', 'placeholder' => JText::translate('VBCONFIGCLOSINGDATETO'))); ?>
151 </div>
152 <div class="btn-group pull-left">
153 <select id="wdexcepthours">
154 <option value="0"><?php echo JText::translate('VBO_DAY_OFF'); ?></option>
155 <optgroup label="<?php echo $this->escape(JText::translate('VBO_WORKING_HOURS')); ?>">
156 <?php
157 for ($h = 1; $h <= 24; $h++) {
158 ?>
159 <option value="<?php echo $h; ?>"><?php echo sprintf('%d %s', $h, ($h > 1 ? JText::translate('VBO_HOURS') : JText::translate('VBO_HOUR'))); ?></option>
160 <?php
161 }
162 ?>
163 </optgroup>
164 </select>
165 </div>
166 <div class="btn-group pull-left">
167 <button type="button" class="btn" onclick="vboMngOperAddDaysException();"><?php VikBookingIcons::e('plus-circle'); ?> <?php echo JText::translate('VBCONFIGCLOSINGDATEADD'); ?></button>
168 </div>
169 </div>
170 <div id="vbo-mngoper-work-days-exceptions" style="display: block;">
171 <?php
172 $active_wday_exceptions = $operator['work_days_exceptions'] ?? [];
173 foreach ($active_wday_exceptions as $day_exception) {
174 $day_exception_signature = implode('::', [($day_exception['from'] ?? ''), ($day_exception['to'] ?? '')]);
175 ?>
176 <input type="hidden" name="work_days_exceptions[]" value="<?php echo JHtml::fetch('esc_attr', json_encode($day_exception)); ?>" />
177 <div class="vbo-closed-date-entry<?php echo !$day_exception['hours'] ? ' vbo-closed-date-entry-dayoff' : ''; ?>" data-date-period="<?php echo JHtml::fetch('esc_attr', $day_exception_signature); ?>">
178 <span><?php echo date(str_replace("/", $datesep, $usedf), strtotime($day_exception['from'])); ?></span>
179 <?php
180 if (!empty($day_exception['to']) && $day_exception['from'] != $day_exception['to']) {
181 ?>
182 <span> - </span>
183 <span><?php echo date(str_replace("/", $datesep, $usedf), strtotime($day_exception['to'])); ?></span>
184 <?php
185 }
186 ?>
187 <span> - </span>
188 <span><?php echo !($day_exception['hours'] ?? 0) ? JText::translate('VBO_DAY_OFF') : sprintf('%d %s', $day_exception['hours'], ($day_exception['hours'] > 1 ? JText::translate('VBCONFIGONETENEIGHT') : JText::translate('VBO_HOUR'))); ?></span>
189 <span class="vbo-closed-date-rm" onclick="vboMngOperRemoveDaysException('<?php echo JHtml::fetch('esc_attr', $day_exception_signature); ?>');"><?php VikBookingIcons::e('times'); ?></span>
190 </div>
191 <?php
192 }
193 ?>
194 </div>
195 </div>
196 </div>
197 <?php
198 }
199 ?>
200
201 <div class="vbo-param-container">
202 <div class="vbo-param-setting">
203 <?php echo JHtml::fetch('form.token'); ?>
204 <input type="hidden" name="update_operator" value="1" />
205 <button type="submit" class="btn vbo-pref-color-btn"><?php echo JText::translate('VBSAVE'); ?></button>
206 </div>
207 </div>
208
209 </div>
210 </div>
211 </div>
212 </div>
213 </form>
214
215 <script type="text/javascript">
216 function vboMngOperAddDaysException() {
217 let from = document.querySelector('#wdexceptfrom');
218 let to = document.querySelector('#wdexceptto');
219 let hours = document.querySelector('#wdexcepthours');
220 let interval = [];
221
222 if (!from || !from.value) {
223 return false;
224 }
225
226 interval.push(from.value);
227
228 if (to && to.value && new Date(from.value) < new Date(to.value)) {
229 interval.push(to.value);
230 } else {
231 interval.push(from.value);
232 }
233
234 let hidden_inp = document.createElement('input');
235 hidden_inp.setAttribute('type', 'hidden');
236 hidden_inp.setAttribute('name', 'work_days_exceptions[]');
237 hidden_inp.value = JSON.stringify({
238 from: interval[0],
239 to: interval[1],
240 hours: parseInt(hours.value),
241 });
242
243 let interval_elem = document.createElement('div');
244 interval_elem.classList.add('vbo-closed-date-entry');
245 if (hours.value == 0) {
246 interval_elem.classList.add('vbo-closed-date-entry-dayoff');
247 }
248 interval_elem.setAttribute('data-date-period', interval.join('::'));
249
250 let interval_from = document.createElement('span');
251 interval_from.innerText = interval[0];
252 interval_elem.append(interval_from);
253
254 let interval_sep = document.createElement('span');
255 interval_sep.innerText = ' - ';
256
257 if (interval[0] != interval[1]) {
258 interval_elem.append(interval_sep);
259
260 let interval_to = document.createElement('span');
261 interval_to.innerText = interval[1];
262 interval_elem.append(interval_to);
263 }
264
265 let interval_sep_clone = interval_sep.cloneNode(true);
266 interval_elem.append(interval_sep_clone);
267
268 let interval_hours = document.createElement('span');
269 interval_hours.innerText = hours.value > 0 ? hours.value + ' ' + (hours.value > 1 ? <?php echo json_encode(JText::translate('VBO_HOURS')); ?> : <?php echo json_encode(JText::translate('VBO_HOUR')); ?>) : <?php echo json_encode(JText::translate('VBO_DAY_OFF')); ?>;
270 interval_elem.append(interval_hours);
271
272 let interval_delete = document.createElement('span');
273 interval_delete.classList.add('vbo-closed-date-rm');
274 interval_delete.innerHTML = '<?php VikBookingIcons::e('times'); ?>';
275 interval_delete.addEventListener('click', () => {
276 vboMngOperRemoveDaysException(interval.join('::'));
277 });
278 interval_elem.append(interval_delete);
279
280 let container = document.querySelector('#vbo-mngoper-work-days-exceptions');
281
282 container.append(hidden_inp);
283 container.append(interval_elem);
284
285 from.value = '';
286 to.value = '';
287 hours.value = 0;
288 }
289
290 function vboMngOperRemoveDaysException(interval) {
291 document.querySelectorAll('.vbo-closed-date-entry[data-date-period="' + interval + '"]').forEach((container) => {
292 let hidden_inp = container.previousElementSibling;
293 if (hidden_inp && hidden_inp.matches('input[name="work_days_exceptions[]"]')) {
294 hidden_inp.remove();
295 }
296 container.remove();
297 });
298 }
299 </script>
300