File "work_days.php"

Full Path: /home/romayxjt/public_html/wp-content/plugins/vikbooking/site/layouts/tools/work_days.php
File size: 10.92 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * @package     VikBooking
 * @subpackage  com_vikbooking
 * @author      Alessio Gaggii - E4J srl
 * @copyright   Copyright (C) 2025 E4J srl. 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 is the layout file for the "work_days" operator tool.
 * 
 * @var string 	$tool 		   The tool identifier.
 * @var array 	$operator      The operator record accessing the tool.
 * @var object 	$permissions   The operator-tool permissions registry.
 * @var string 	$tool_uri 	   The base URI for rendering this tool.
 */
extract($displayData);

// access environment objects
$app     = JFactory::getApplication();
$vbo_app = VikBooking::getVboApplication();

// load assets
$vbo_app->loadDatePicker();
$vbo_app->loadSelect2();

$nowdf = VikBooking::getDateFormat();
if ($nowdf == "%d/%m/%Y") {
	$usedf = 'd/m/Y';
} elseif ($nowdf == "%m/%d/%Y") {
	$usedf = 'm/d/Y';
} else {
	$usedf = 'Y/m/d';
}
$datesep = VikBooking::getDateSeparator();

// get the current operator permissions
$perm_work_days_exceptions = (bool) $permissions->get('work_days_exceptions', 0);

if ($app->input->getBool('update_operator', false) && JSession::checkToken()) {
	// safely update values upon form submit
	$dbo = JFactory::getDbo();

	// normalize to linear array
	$work_days_week = (array) $app->input->get('work_days_week', [], 'array');
	$work_days_week_schedule = array_combine(array_keys($work_days_week), array_values($work_days_week));
	$work_days_week = [];
	foreach ($work_days_week_schedule as $wday => $whours) {
		$work_days_week[] = [
			'wday'  => $wday,
			'hours' => $whours,
		];
	}

	// build operator update values
	$update = [
		'id' => $operator['id'],
		'work_days_week' => json_encode($work_days_week),
	];

	if ($perm_work_days_exceptions) {
		// normalize to linear array
		$work_days_exceptions = (array) $app->input->get('work_days_exceptions', [], 'array');
		foreach ($work_days_exceptions as &$wexceptions) {
			if (is_scalar($wexceptions)) {
				$wexceptions = json_decode($wexceptions, true);
			}
		}
		unset($wexceptions);

		// set operator update value
		$update['work_days_exceptions'] = json_encode($work_days_exceptions);
	}

	$update = (object) $update;
	$dbo->updateObject('#__vikbooking_operators', $update, 'id');

	$app->enqueueMessage(JText::translate('VBOSUBMITPRECHECKINTNKS'), 'success');
	$app->redirect($tool_uri);
	$app->close();
}

?>

<form action="<?php echo $tool_uri; ?>" method="POST">
	<div class="vbo-site-container vbo-site-container-full vbo-site-container-compact">
		<div class="vbo-params-wrap">
			<div class="vbo-params-container">
				<div class="vbo-params-block vbo-params-block-full-setting">

					<div class="vbo-param-container">
						<div class="vbo-param-setting">
							<span class="vbo-param-setting-comment"><?php echo JText::translate('VBO_WORK_DAYS_WEEK_HELP'); ?></span>
						</div>
					</div>

				<?php
				// manage work days week schedules
				$work_days_list = [1, 2, 3, 4, 5, 6, 0];
				foreach ($work_days_list as $w) {
					?>
					<div class="vbo-param-container">
						<div class="vbo-param-label"><?php echo VikBooking::sayWeekDay($w); ?></div>
						<div class="vbo-param-setting">
							<select name="work_days_week[<?php echo $w; ?>]" id="vbo-mngoper-work-days-week-<?php echo $w; ?>">
								<option value="0"><?php echo JText::translate('VBO_DAY_OFF'); ?></option>
								<optgroup label="<?php echo JHtml::fetch('esc_attr', JText::translate('VBO_WORKING_HOURS')); ?>">
								<?php
								for ($h = 1; $h <= 24; $h++) {
									$is_selected = false;
									foreach (($operator['work_days_week'] ?? []) as $wday_data) {
										if ($wday_data['wday'] == $w) {
											$is_selected = $is_selected || (($wday_data['hours'] ?? 0) == $h);
										}
									}
									?>
									<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>
									<?php
								}
								?>
								</optgroup>
							</select>
						</div>
					</div>
					<?php
				}

				if ($perm_work_days_exceptions) {
					// manage the work days exceptions
					?>
					<div class="vbo-param-container">
						<div class="vbo-param-setting">
							<span class="vbo-param-setting-comment"><?php echo JText::translate('VBO_WORK_DAYS_EXCEPTIONS_HELP'); ?></span>
						</div>
					</div>

					<div class="vbo-param-container">
						<div class="vbo-param-label"><?php echo JText::translate('VBO_EXCEPTIONS'); ?></div>
						<div class="vbo-param-setting">
							<div class="btn-toolbar vbo-mng-oper-work-dates">
								<div class="btn-group pull-left">
									<?php echo $vbo_app->getCalendar('', 'wdexceptfrom', 'wdexceptfrom', '%Y-%m-%d', array('class'=>'', 'size'=>'10', 'maxlength'=>'19', 'todayBtn' => 'true', 'placeholder' => JText::translate('VBCONFIGCLOSINGDATEFROM'))); ?>
								</div>
								<div class="btn-group pull-left">
									<?php echo $vbo_app->getCalendar('', 'wdexceptto', 'wdexceptto', '%Y-%m-%d', array('class'=>'', 'size'=>'10', 'maxlength'=>'19', 'todayBtn' => 'true', 'placeholder' => JText::translate('VBCONFIGCLOSINGDATETO'))); ?>
								</div>
								<div class="btn-group pull-left">
									<select id="wdexcepthours">
										<option value="0"><?php echo JText::translate('VBO_DAY_OFF'); ?></option>
										<optgroup label="<?php echo $this->escape(JText::translate('VBO_WORKING_HOURS')); ?>">
										<?php
										for ($h = 1; $h <= 24; $h++) {
											?>
											<option value="<?php echo $h; ?>"><?php echo sprintf('%d %s', $h, ($h > 1 ? JText::translate('VBO_HOURS') : JText::translate('VBO_HOUR'))); ?></option>
											<?php
										}
										?>
										</optgroup>
									</select>
								</div>
								<div class="btn-group pull-left">
									<button type="button" class="btn" onclick="vboMngOperAddDaysException();"><?php VikBookingIcons::e('plus-circle'); ?> <?php echo JText::translate('VBCONFIGCLOSINGDATEADD'); ?></button>
								</div>
							</div>
							<div id="vbo-mngoper-work-days-exceptions" style="display: block;">
							<?php
							$active_wday_exceptions = $operator['work_days_exceptions'] ?? [];
							foreach ($active_wday_exceptions as $day_exception) {
								$day_exception_signature = implode('::', [($day_exception['from'] ?? ''), ($day_exception['to'] ?? '')]);
								?>
								<input type="hidden" name="work_days_exceptions[]" value="<?php echo JHtml::fetch('esc_attr', json_encode($day_exception)); ?>" />
								<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); ?>">
									<span><?php echo date(str_replace("/", $datesep, $usedf), strtotime($day_exception['from'])); ?></span>
								<?php
								if (!empty($day_exception['to']) && $day_exception['from'] != $day_exception['to']) {
									?>
									<span> - </span>
									<span><?php echo date(str_replace("/", $datesep, $usedf), strtotime($day_exception['to'])); ?></span>
									<?php
								}
								?>
									<span> - </span>
									<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>
									<span class="vbo-closed-date-rm" onclick="vboMngOperRemoveDaysException('<?php echo JHtml::fetch('esc_attr', $day_exception_signature); ?>');"><?php VikBookingIcons::e('times'); ?></span>
								</div>
								<?php
							}
							?>
							</div>
						</div>
					</div>
					<?php
				}
				?>

					<div class="vbo-param-container">
						<div class="vbo-param-setting">
							<?php echo JHtml::fetch('form.token'); ?>
							<input type="hidden" name="update_operator" value="1" />
							<button type="submit" class="btn vbo-pref-color-btn"><?php echo JText::translate('VBSAVE'); ?></button>
						</div>
					</div>

				</div>
			</div>
		</div>
	</div>
</form>

<script type="text/javascript">
	function vboMngOperAddDaysException() {
		let from = document.querySelector('#wdexceptfrom');
		let to = document.querySelector('#wdexceptto');
		let hours = document.querySelector('#wdexcepthours');
		let interval = [];

		if (!from || !from.value) {
			return false;
		}

		interval.push(from.value);

		if (to && to.value && new Date(from.value) < new Date(to.value)) {
			interval.push(to.value);
		} else {
			interval.push(from.value);
		}

		let hidden_inp = document.createElement('input');
		hidden_inp.setAttribute('type', 'hidden');
		hidden_inp.setAttribute('name', 'work_days_exceptions[]');
		hidden_inp.value = JSON.stringify({
			from: interval[0],
			to: interval[1],
			hours: parseInt(hours.value),
		});

		let interval_elem = document.createElement('div');
		interval_elem.classList.add('vbo-closed-date-entry');
		if (hours.value == 0) {
			interval_elem.classList.add('vbo-closed-date-entry-dayoff');
		}
		interval_elem.setAttribute('data-date-period', interval.join('::'));

		let interval_from = document.createElement('span');
		interval_from.innerText = interval[0];
		interval_elem.append(interval_from);

		let interval_sep = document.createElement('span');
		interval_sep.innerText = ' - ';

		if (interval[0] != interval[1]) {
			interval_elem.append(interval_sep);

			let interval_to = document.createElement('span');
			interval_to.innerText = interval[1];
			interval_elem.append(interval_to);
		}

		let interval_sep_clone = interval_sep.cloneNode(true);
		interval_elem.append(interval_sep_clone);

		let interval_hours = document.createElement('span');
		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')); ?>;
		interval_elem.append(interval_hours);

		let interval_delete = document.createElement('span');
		interval_delete.classList.add('vbo-closed-date-rm');
		interval_delete.innerHTML = '<?php VikBookingIcons::e('times'); ?>';
		interval_delete.addEventListener('click', () => {
			vboMngOperRemoveDaysException(interval.join('::'));
		});
		interval_elem.append(interval_delete);

		let container = document.querySelector('#vbo-mngoper-work-days-exceptions');

		container.append(hidden_inp);
		container.append(interval_elem);

		from.value = '';
		to.value = '';
		hours.value = 0;
	}

	function vboMngOperRemoveDaysException(interval) {
		document.querySelectorAll('.vbo-closed-date-entry[data-date-period="' + interval + '"]').forEach((container) => {
			let hidden_inp = container.previousElementSibling;
			if (hidden_inp && hidden_inp.matches('input[name="work_days_exceptions[]"]')) {
				hidden_inp.remove();
			}
			container.remove();
		});
	}
</script>