File "tasks.php"

Full Path: /home/romayxjt/public_html/wp-content/plugins/vikbooking/admin/layouts/taskmanager/list/tasks.php
File size: 16.63 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 array  $data  The data for rendering the tasks of given areas within a list.
 */
extract($displayData);

// get the task area IDs
$areaIds = [];

if (is_array($data['area_ids'] ?? null)) {
    $areaIds = $data['area_ids'];
}

if (!$areaIds) {
    // we need to make the query return no results with an empty area ID
    $areaIds = [0];
}

// get fetching start and limit values
$start = abs(intval($data['start'] ?? 0));
$limit = abs(intval($data['limit'] ?? 10));

// get the filters for rendering the area tasks
$filters = (array) ($data['filters'] ?? []);

// save current filters in the user state
JFactory::getApplication()->setUserState('vbo.tm.filters', $filters);

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

// get the list of tasks according to filters, by always forcing/injecting the area IDs
$tasks = VBOTaskModelTask::getInstance()->filterItems(array_merge($filters, ['id_areas' => $areaIds]), $start, $limit);

foreach ($tasks as $taskRecord) {
    // wrap task record into a registry
    $task = VBOTaskTaskregistry::getInstance((array) $taskRecord);

    // load task tags
    $tags = $task->getTags() ? $task->getTagRecords() : [];

    ?>
    <div class="vbo-tm-list-task-row" data-task-id="<?php echo $task->getID(); ?>" data-area-id="<?php echo $task->getAreaID(); ?>">

        <div class="vbo-tm-list-task-cell edit-trigger" data-type="id">
            <span><?php VikBookingIcons::e('hashtag'); ?> <?php echo $task->getID(); ?></span>
        </div>

        <div class="vbo-tm-list-task-cell" data-type="title">
            <a href="JavaScript: void(0);" class="edit-trigger"><?php echo $task->getTitle(); ?></a>
            <div class="secondary">
                <small><?php echo JHtml::fetch('date.relative', $task->get('modifiedon') ?: $task->get('createdon')); ?></small>
            </div>
        </div>

        <div class="vbo-tm-list-task-cell" data-type="assignees">
        <?php
        foreach ($task->getAssigneeDetails() as $operator) {
            ?>
            <span class="vbo-tm-list-area-task-assignee vbo-tm-task-assignee">
                <span class="vbo-tm-list-area-task-assignee-avatar vbo-tm-task-assignee-avatar" title="<?php echo JHtml::fetch('esc_attr', $operator['name']); ?>">
                <?php
                if (!empty($operator['img_uri'])) {
                    ?>
                    <img src="<?php echo $operator['img_uri']; ?>" alt="<?php echo JHtml::fetch('esc_attr', $operator['initials']); ?>" decoding="async" loading="lazy" />
                    <?php
                } else {
                    ?>
                    <span><?php echo $operator['initials']; ?></span>
                    <?php
                }
                ?>
                </span>
            </span>
            <?php
        }
        ?>
        </div>

        <div class="vbo-tm-list-task-cell" data-type="due">
            <?php if ($dueDate = $task->getDueDate()): ?>
                <div><?php echo JHtml::fetch('date', $dueDate, 'd F Y'); ?></div>
                <div class="secondary"><small><?php echo JHtml::fetch('date', $dueDate, 'H:i'); ?></small></div>
            <?php endif; ?>
        </div>

        <div class="vbo-tm-list-task-cell" data-type="status">
        <?php
        if ($taskManager->statusTypeExists($task->getStatus())) {
            $status = $taskManager->getStatusTypeInstance($task->getStatus());
            echo JHtml::fetch('vbohtml.taskmanager.status', $status);
        }

        if ($task->get('hasUnreadMessages', false)): ?>
            <a href="javascript:void(0)" class="unread-message-dot mini edit-trigger">
                <?php VikBookingIcons::e('comment'); ?>
            </a>
        <?php endif; ?>
        </div>

        <div class="vbo-tm-list-task-cell" data-type="id_order">

            <div class="order-summary-flex">
                
                <?php
                if ($task->getBookingId() && $bookingElement = $task->buildBookingElement()) {
                    if (!empty($bookingElement['img'])) {
                        $img = '<img src="' . $bookingElement['img'] . '" class="vbo-booking-badge-avatar" decoding="async" loading="lazy" />';
                    } else {
                        $img = '<span class="vbo-booking-badge-avatar"><i class="' . VikBookingIcons::i($bookingElement['icon_class'] ?? 'hotel') . '"></i></span>';
                    }

                    $img = '<div class="see-booking-details" data-bid="' . $task->getBookingId() . '">'
                        . $img
                        . '<i class="' . VikBookingIcons::i('eye') . ' effect"></i>'
                        . '</div>';

                    $bookingText = $bookingElement['text'] . ' #' . $bookingElement['id'];
                } else {
                    $img = '<span class="vbo-booking-badge-avatar edit-trigger"><i class="' . VikBookingIcons::i('plus') . '"></i></span>';
                    $bookingText = '<em>' . JText::translate('VBO_UNASSIGNED') . '</em>';
                }
                ?>

                <?php echo $img; ?>

                <div class="order-room-booking-details">
                    <?php if ($task->getListingId()): ?>
                        <div class="order-room"><?php echo $task->getListingName($task->getListingId()); ?></div>
                    <?php endif; ?>

                    <div class="order-booking"><?php echo $bookingText; ?></div>
                </div>

            </div>

        </div>

        <div class="vbo-tm-list-task-cell" data-type="id_area">
            <span><?php echo $task->getAreaName($task->getAreaID()); ?></span>
        </div>

        <div class="vbo-tm-list-task-cell" data-type="tags">
        <?php
        if ($tags) {
            ?>
            <div class="vbo-tm-list-task-tags">
            <?php
            foreach ($tags as $tag) {
                $tag = (array) $tag;
                ?>
                <span class="vbo-tm-task-tag vbo-tm-color <?php echo $tag['color']; ?>"><?php echo $tag['name']; ?></span>
                <?php
            }
            ?>
            </div>
            <?php
        }
        ?>
        </div>

    </div>
    <?php
}

if (!$tasks) {
    ?>
    <p class="info" data-no-results="1"><?php echo !$start ? JText::translate('VBO_NO_RECORDS_FOUND') : JText::translate('VBO_NO_MORE_RECORDS'); ?></p>
    <?php
}
?>

<script type="text/javascript">

    jQuery(function($) {

        /**
         * Register listeners for editing an existing task.
         */
        document
            .querySelectorAll('.vbo-tm-list-task-row')
            .forEach((taskElement) => {
                if (taskElement.clickListener) {
                    // listener added already
                    return;
                }

                // get the clicked task and area IDs
                const taskId = taskElement.getAttribute('data-task-id');
                const areaId = taskElement.getAttribute('data-area-id');

                // build the click-able elements
                let clickableElements = taskElement.querySelectorAll('.edit-trigger');

                clickableElements.forEach((element) => {
                    element.addEventListener('click', () => {
                        // define the modal delete button
                        let delete_btn = jQuery('<button></button>')
                            .attr('type', 'button')
                            .addClass('btn btn-danger')
                            .text(<?php echo json_encode(JText::translate('VBELIMINA')); ?>)
                            .on('click', function() {
                                if (!confirm(<?php echo json_encode(JText::translate('VBDELCONFIRM')); ?>)) {
                                    return false;
                                }

                                // disable button to prevent double submissions
                                let submit_btn = jQuery(this);
                                submit_btn.prop('disabled', true);

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

                                // make the request
                                VBOCore.doAjax(
                                    "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=taskmanager.deleteTask'); ?>",
                                    {
                                        data: {
                                            id: taskId,
                                        },
                                    },
                                    (resp) => {
                                        // trigger filters-changed event on success
                                        VBOCore.emitEvent('vbo-tm-filters-changed', {
                                            filters: vboTmFilters,
                                        });

                                        // dismiss the modal
                                        VBOCore.emitEvent('vbo-tm-edittask-dismiss');
                                    },
                                    (error) => {
                                        // display error message
                                        alert(error.responseText);

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

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

                        // 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-edittask-loading');

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

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

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

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

                                // make the request
                                VBOCore.doAjax(
                                    "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=taskmanager.updateTask'); ?>",
                                    qpRequest.toString(),
                                    (resp) => {
                                        // trigger filters-changed event on success
                                        VBOCore.emitEvent('vbo-tm-filters-changed', {
                                            filters: vboTmFilters,
                                        });

                                        // dismiss the modal
                                        VBOCore.emitEvent('vbo-tm-edittask-dismiss');
                                    },
                                    (error) => {
                                        // display error message
                                        alert(error.responseText);

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

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

                        // display modal
                        let modalBody = VBOCore.displayModal({
                            suffix:         'tm_edittask_modal',
                            title:          <?php echo json_encode(JText::translate('VBO_TASK')); ?> + ' #' + taskId,
                            extra_class:    'vbo-modal-rounded vbo-modal-taller vbo-modal-large',
                            body_prepend:   true,
                            lock_scroll:    true,
                            escape_dismiss: false,
                            footer_left:    delete_btn,
                            footer_right:   save_btn,
                            loading_event:  'vbo-tm-edittask-loading',
                            dismiss_event:  'vbo-tm-edittask-dismiss',
                        });

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

                        // make the request
                        VBOCore.doAjax(
                            "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=taskmanager.renderLayout'); ?>",
                            {
                                type: 'tasks.managetask',
                                data: {
                                    task_id: taskId,
                                    area_id: areaId,
                                    form_id: 'vbo-tm-task-manage-form',
                                },
                            },
                            (resp) => {
                                // stop loading
                                VBOCore.emitEvent('vbo-tm-edittask-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-edittask-loading');
                            }
                        );
                    });
                });

                // turn flag on for listener set
                taskElement.clickListener = true;
            });

        /**
         * Register listeners for display the reservation details.
         */
        document
            .querySelectorAll('.see-booking-details[data-bid]')
            .forEach((bookingEl) => {
                if (bookingEl.clickListener) {
                    // listener added already
                    return;
                }

                // get the clicked booking ID
                const bookingId = bookingEl.getAttribute('data-bid');

                bookingEl.addEventListener('click', () => {
                    VBOCore.handleDisplayWidgetNotification({
                        widget_id: 'booking_details',
                    }, {
                        booking_id: bookingId,
                        modal_options: {
                            body_prepend: false,
                            enlargeable:  false,
                            minimizeable: false,
                        },
                    });
                });

                // turn flag on for listener set
                bookingEl.clickListener = true;
            });
    });

</script>