File "contextmenu.php"

Full Path: /home/romayxjt/public_html/wp-content/plugins/vikbooking/admin/layouts/taskmanager/statuses/contextmenu.php
File size: 6.4 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     List of JS events to trigger.
 * @var array   $filters    The current View filters.
 */
extract($displayData);

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

// define the default events
if (!isset($events) || !is_array($events)) {
    $events = [];
}
$events['filter_status'] = $events['filter_status'] ?? 'vbo-tm-apply-filters';

// get current filters
$filters = (array) ($filters ?? []);

// access the task manager
$taskManager = VBOFactory::getTaskManager();

// make TASK_MANAGER_STATUSES var global
JHtml::fetch('vbohtml.tmscripts.statuses');

// find the active status, if any
$activeStatus = [];

foreach ($taskManager->getStatusGroupElements() as $groupId => $group) {
    // iterate over the statuses of this group
    foreach ($group['elements'] as $statusType) {
        // check if it's the active one
        if ($statusType['id'] == ($filters['statusId'] ?? null)) {
            // active status found
            $activeStatus = $statusType;
        }
    }
}

?>

<button type="button" class="btn vbo-context-menu-btn vbo-context-menu-tm-statuses<?php echo $activeStatus ? ' vbo-tm-filter-active' : ''; ?>">
<?php
if ($activeStatus) {
    // active filter
    ?>
    <span class="vbo-context-menu-lbl"><?php echo $activeStatus['text']; ?></span>
    <span class="vbo-context-menu-lbl-orig" style="display: none;"><?php echo JText::translate('VBSTATUS'); ?></span>
    <?php
} else {
    // filter not set
    ?>
    <span class="vbo-context-menu-lbl"><?php echo JText::translate('VBSTATUS'); ?></span>
    <?php
}
?>
    <span class="vbo-context-menu-ico"><?php VikBookingIcons::e('sort-down'); ?></span>
</button>

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

        // build buttons
        let btns = [];

        // push unset status filter button
        btns.push({
            statusId: null,
            class: 'vbo-context-menu-entry-secondary',
            searchable: false,
            separator: false,
            text: <?php echo json_encode(JText::translate('VBANYTHING')); ?>,
            icon: '<?php echo VikBookingIcons::i('times'); ?>',
            visible: () => {
                return vboTmFilters && vboTmFilters?.statusId;
            },
            action: function(root, config) {
                // remove status filter
                VBOCore.emitEvent('<?php echo $events['filter_status']; ?>', {
                    filters: {
                        statusId: null,
                    },
                });

                if (jQuery(root).find('.vbo-context-menu-lbl-orig').length) {
                    // restore default label
                    jQuery(root)
                        .find('.vbo-context-menu-lbl')
                        .remove();

                    jQuery(root)
                        .find('.vbo-context-menu-lbl-orig')
                        .attr('class', '')
                        .addClass('vbo-context-menu-lbl')
                        .show();
                }

                jQuery(root).removeClass('vbo-tm-filter-active');
            },
        });

        window.TASK_MANAGER_STATUSES.forEach((elem, index) => {
            // build button icon element
            let btnIconEl = jQuery('<span></span>')
                .addClass('vbo-colortag-circle')
                .addClass('vbo-tm-colortag-circle')
                .addClass('vbo-tm-statustype-circle');

            if (elem?.color) {
                btnIconEl.addClass(elem.color);
            }

            // push status button
            btns.push({
                statusId: elem.id,
                class: elem.id ? 'vbo-context-menu-entry-secondary' : 'btngroup',
                searchable: elem.id ? true : false,
                text: elem.text,
                icon: elem.id ? btnIconEl : null,
                disabled: () => {
                    return !elem.id || (vboTmFilters && vboTmFilters?.statusId == elem.id);
                },
                action: function(root, config) {
                    if (this.statusId) {
                        // apply status filter
                        VBOCore.emitEvent('<?php echo $events['filter_status']; ?>', {
                            filters: {
                                statusId: this.statusId,
                            },
                        });

                        let color = elem?.color || '';
                        let name = elem.text || this.text;

                        if (jQuery(root).find('.vbo-context-menu-lbl-orig').length) {
                            // filter changed
                            jQuery(root)
                                .find('.vbo-context-menu-lbl')
                                .attr('class', '')
                                .addClass('vbo-context-menu-lbl')
                                .text(name);
                        } else {
                            // filter set for the first time
                            jQuery(root)
                                .find('.vbo-context-menu-lbl')
                                .attr('class', '')
                                .addClass('vbo-context-menu-lbl-orig')
                                .hide();

                            jQuery(root)
                                .find('.vbo-context-menu-lbl-orig')
                                .parent()
                                .prepend(
                                    jQuery('<span></span>')
                                        .addClass('vbo-context-menu-lbl')
                                        .text(name)
                                );
                        }

                        jQuery(root).addClass('vbo-tm-filter-active');
                    }
                },
            });
        });

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

    });
</script>