File "contextmenu.php"

Full Path: /home/romayxjt/public_html/wp-content/plugins/vikbooking/admin/layouts/taskmanager/areas/contextmenu.php
File size: 14.62 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/** 
 * @package     VikBooking
 * @subpackage  core
 * @author      E4J s.r.l.
 * @copyright   Copyright (C) 2025 E4J s.r.l. All Rights Reserved.
 * @license     http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 * @link        https://vikwp.com
 */

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

/**
 * Obtain vars from arguments received in the layout file.
 * 
 * @var string  $caller     The identifier of who's calling this layout file.
 * @var array   $events     The custom event names to trigger for certain actions.
 * @var array   $active 	List of active area IDs by default.
 */
extract($displayData);

// load context menu assets
VikBooking::getVboApplication()->loadContextMenuAssets();

// load all the existing task areas
$taskAreas = VBOTaskModelArea::getInstance()->getItems();

// define the default events
if (!isset($events) || !is_array($events)) {
	$events = [];
}
$events['render_task']  = $events['render_task'] ?? 'vbo-tm-area-render-task';
$events['hide_task']    = $events['hide_task'] ?? 'vbo-tm-area-hide-task';
$events['update_areas'] = $events['update_areas'] ?? 'vbo-tm-area-update-status';
$events['create_areas'] = $events['create_areas'] ?? 'vbo-tm-area-create-trigger';

// define the default active areas
if (!isset($active) || !is_array($active)) {
	$active = [];
}

?>

<button type="button" class="btn vbo-context-menu-btn vbo-context-menu-tm-areas">
	<span class="vbo-context-menu-ico"><?php VikBookingIcons::e('sort-down'); ?></span>
	<span class="vbo-context-menu-lbl"><?php echo JText::translate('VBO_PROJECTS_AREAS'); ?></span>
</button>

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

		// all task areas
		const taskAreas = <?php echo json_encode($taskAreas); ?>;

		// active task areas
		const activeAreas = <?php echo json_encode($active); ?>;

		const createNewTaskManagerArea = () => {
			// define the modal cancel button
			let cancel_btn = jQuery('<button></button>')
				.attr('type', 'button')
				.addClass('btn')
				.text(<?php echo json_encode(JText::translate('VBANNULLA')); ?>)
				.on('click', () => {
					VBOCore.emitEvent('vbo-tm-newarea-dismiss');
				});

			// define the modal save button
			let save_btn = jQuery('<button></button>')
				.attr('type', 'button')
				.addClass('btn btn-success')
				.text(<?php echo json_encode(JText::translate('VBSAVE')); ?>)
				.on('click', function() {
					// disable button to prevent double submissions
					let submit_btn = jQuery(this);
					submit_btn.prop('disabled', true);

					// start loading animation
					VBOCore.emitEvent('vbo-tm-newarea-loading');

					// get form data
					const areaForm = new FormData(document.querySelector('#vbo-tm-area-manage-form'));

					// build query parameters for the request
					let qpRequest = new URLSearchParams(areaForm).toString();

					// make the request
					VBOCore.doAjax(
						"<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=taskmanager.createArea'); ?>",
						qpRequest,
						(resp) => {
							// reload current page on success
							window.location.reload();
						},
						(error) => {
							// display error message
							alert(error.responseText);

							// re-enable submit button
							submit_btn.prop('disabled', false);

							// stop loading
							VBOCore.emitEvent('vbo-tm-newarea-loading');
						}
					);
				});

			// display modal
			let modalBody = VBOCore.displayModal({
				suffix:        'tm_newarea_modal',
				title:         <?php echo json_encode(JText::translate('VBO_PROJECT_AREA')); ?> + ' - ' + <?php echo json_encode(JText::translate('VBO_ADD_NEW')); ?>,
				extra_class:   'vbo-modal-rounded vbo-modal-tall vbo-modal-taller',
				body_prepend:  true,
				lock_scroll:   true,
				footer_left:   cancel_btn,
				footer_right:  save_btn,
				loading_event: 'vbo-tm-newarea-loading',
				dismiss_event: 'vbo-tm-newarea-dismiss',
			});

			// start loading animation
			VBOCore.emitEvent('vbo-tm-newarea-loading');

			// make the request
			VBOCore.doAjax(
				"<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=taskmanager.renderLayout'); ?>",
				{
					type: 'areas.managearea',
					data: {
						form_id: 'vbo-tm-area-manage-form',
					},
				},
				(resp) => {
					// stop loading
					VBOCore.emitEvent('vbo-tm-newarea-loading');

					try {
						// decode the response (if needed), and append the content to the modal body
						let obj_res = typeof resp === 'string' ? JSON.parse(resp) : resp;
						modalBody.append(obj_res['html']);
					} catch (err) {
						console.error('Error decoding the response', err, resp);
					}
				},
				(error) => {
					// display error message
					alert(error.responseText);

					// stop loading
					VBOCore.emitEvent('vbo-tm-newarea-loading');
				}
			);
		}

		// build task area buttons
		let btns = [];

		taskAreas.forEach((area, index) => {
			// build button text element
            let btnTxtEl = jQuery('<span></span>')
                .addClass('vbo-ctxmenu-entry-icn')
                .html(jQuery('<span></span>').text(area.name));
            let btnTxtIcn = jQuery('<i></i>')
                .addClass('vbo-tm-area-edit')
                .addClass('<?php echo VikBookingIcons::i('edit'); ?>');
            btnTxtEl.append(btnTxtIcn);

			// push area button
			btns.push({
				activeState: activeAreas.includes(parseInt(area.id)),
				areaId: area.id,
				class: 'vbo-context-menu-entry-secondary',
				text: btnTxtEl,
				separator: (++index == taskAreas.length),
				icon: function() {
					return this.activeState === true ? '<?php echo VikBookingIcons::i('check-square'); ?>' : '<?php echo VikBookingIcons::i('far fa-square'); ?>';
				},
				action: function(root, event) {
					if (!event?.target || !jQuery(event.target).hasClass('vbo-tm-area-edit')) {
						// toggle active state
						this.activeState = !this.activeState;

						if (this.activeState) {
							// push the current area ID to the active list
							if (typeof vboTmActiveAreas !== 'undefined' && Array.isArray(vboTmActiveAreas)) {
								vboTmActiveAreas.push(parseInt(this.areaId));
							}

							// render tasks for the selected area
							VBOCore.emitEvent('<?php echo $events['render_task']; ?>', {
								areaId: this.areaId,
							});
						} else {
							// delete the current area ID from the active list
							if (typeof vboTmActiveAreas !== 'undefined' && Array.isArray(vboTmActiveAreas)) {
								vboTmActiveAreas.forEach((activeAreaId, activeAreaIndex) => {
									if (activeAreaId == this.areaId) {
										// remove the area ID from the active list
										vboTmActiveAreas.splice(activeAreaIndex, 1);
										return;
									}
								});
							}

							// hide tasks for the selected area
							VBOCore.emitEvent('<?php echo $events['hide_task']; ?>', {
								areaId: this.areaId,
							});
						}

						// do not proceed
                        return;
					}

					// define the modal cancel button
                    let cancel_btn = jQuery('<button></button>')
                        .attr('type', 'button')
                        .addClass('btn')
                        .text(<?php echo json_encode(JText::translate('VBANNULLA')); ?>)
                        .on('click', () => {
                            VBOCore.emitEvent('vbo-tm-editarea-dismiss');
                        });

                    // define the modal save button
                    let save_btn = jQuery('<button></button>')
                        .attr('type', 'button')
                        .addClass('btn btn-success')
                        .text(<?php echo json_encode(JText::translate('VBSAVE')); ?>)
                        .on('click', function() {
                            // disable button to prevent double submissions
                            let submit_btn = jQuery(this);
                            submit_btn.prop('disabled', true);

                            // start loading animation
                            VBOCore.emitEvent('vbo-tm-editarea-loading');

                            // get form data
                            const areaForm = new FormData(document.querySelector('#vbo-tm-area-manage-form'));

                            // build query parameters for the request
                            let qpRequest = new URLSearchParams(areaForm);

                            // make sure the request always includes the tags query parameter, even if the list is empty
                            if (!qpRequest.has('area[tags][]')) {
                                qpRequest.append('area[tags][]', []);
                            }

                            // make sure the request always includes the statuses query parameter, even if the list is empty
                            if (!qpRequest.has('area[status_enums][]')) {
                                qpRequest.append('area[status_enums][]', []);
                            }

                            // make the request
                            VBOCore.doAjax(
                                "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=taskmanager.updateArea'); ?>",
                                qpRequest.toString(),
                                (resp) => {
                                    // reload current page on success
                                    window.location.reload();
                                },
                                (error) => {
                                    // display error message
                                    alert(error.responseText);

                                    // re-enable submit button
                                    submit_btn.prop('disabled', false);

                                    // stop loading
                                    VBOCore.emitEvent('vbo-tm-editarea-loading');
                                }
                            );
                        });

                    // display modal
                    let modalBody = VBOCore.displayModal({
                        suffix:        'tm_editarea_modal',
                        title:         <?php echo json_encode(JText::translate('VBO_PROJECT_AREA')); ?> + ' - ' + <?php echo json_encode(JText::translate('VBMAINPAYMENTSEDIT')); ?>,
                        extra_class:   'vbo-modal-rounded vbo-modal-tall vbo-modal-taller',
                        body_prepend:  true,
                        lock_scroll:   true,
                        footer_left:   cancel_btn,
                        footer_right:  save_btn,
                        loading_event: 'vbo-tm-editarea-loading',
                        dismiss_event: 'vbo-tm-editarea-dismiss',
                    });

                    // start loading animation
                    VBOCore.emitEvent('vbo-tm-editarea-loading');

                    // make the request
                    VBOCore.doAjax(
                        "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=taskmanager.renderLayout'); ?>",
                        {
                            type: 'areas.managearea',
                            data: {
                                id: area.id,
                                form_id: 'vbo-tm-area-manage-form',
                            },
                        },
                        (resp) => {
                            // stop loading
                            VBOCore.emitEvent('vbo-tm-editarea-loading');

                            try {
                                // decode the response (if needed), and append the content to the modal body
                                let obj_res = typeof resp === 'string' ? JSON.parse(resp) : resp;
                                modalBody.append(obj_res['html']);
                            } catch (err) {
                                console.error('Error decoding the response', err, resp);
                            }
                        },
                        (error) => {
                            // display error message
                            alert(error.responseText);

                            // stop loading
                            VBOCore.emitEvent('vbo-tm-editarea-loading');
                        }
                    );
				},
			});
		});

		if (taskAreas.length) {
			// push show all button
			btns.push({
				class: 'vbo-context-menu-entry-warning',
				text: <?php echo json_encode(JText::translate('VBPARAMSEASONCALENDARPRICESANY')); ?>,
				icon: '<?php echo VikBookingIcons::i('eye'); ?>',
				action: function(root, config) {
					let all_btns = jQuery(root).vboContextMenu('buttons');
					all_btns.forEach((btn) => {
						if (typeof btn.activeState === 'undefined') {
							return;
						}
						if (!btn.activeState) {
							// call button click action
							btn.action(root, config);
						}
					});
				},
				disabled: function(root, config) {
					// disabled when all buttons are active
					return config.buttons.every(btn => btn.activeState !== false);
				},
			});

			// push hide all button
			btns.push({
				class: 'vbo-context-menu-entry-warning',
				text: <?php echo json_encode(JText::translate('VBO_HIDE_ALL')); ?>,
				icon: '<?php echo VikBookingIcons::i('eye-slash'); ?>',
				separator: true,
				action: function(root, config) {
					let all_btns = jQuery(root).vboContextMenu('buttons');
					all_btns.forEach((btn) => {
						if (typeof btn.activeState === 'undefined') {
							return;
						}
						if (btn.activeState) {
							// call button click action
							btn.action(root, config);
						}
					});
				},
				disabled: function(root, config) {
					// disabled when all buttons are inactive
					return config.buttons.every(btn => btn.activeState !== true);
				},
			});
		}

		// push create new area button
		btns.push({
			class: 'vbo-context-menu-entry-success',
			text: <?php echo json_encode(JText::translate('VBO_ADD_NEW')); ?>,
			icon: '<?php echo VikBookingIcons::i('plus-circle'); ?>',
			action: function(root, config) {
				createNewTaskManagerArea();
			}
		});

		// start context menu on the proper button element
		jQuery('.vbo-context-menu-tm-areas').vboContextMenu({
			placement: 'bottom-left',
			buttons: btns,
		});

		// register event for updating the task area status
		document.addEventListener('<?php echo $events['update_areas']; ?>', (e) => {
			let all_btns = jQuery('.vbo-context-menu-tm-areas').vboContextMenu('buttons');
			all_btns.forEach((btn) => {
				if (typeof btn.areaId === 'undefined') {
					return;
				}
				if (!document.querySelector('.vbo-tm-area-wrap[data-area-id="' + btn.areaId + '"]')) {
					// turn off this area active state
					btn.activeState = false;
				}
			});
		});

		// register event for creating a new task area
		document.addEventListener('<?php echo $events['create_areas']; ?>', (e) => {
			createNewTaskManagerArea();
		});

	});
</script>