Home Reference Source Repository

js/Controllers/ControllerContextMenu.js

import $ from 'jquery';
import BaseController from './BaseController';
import RODAN_EVENTS from 'js/Shared/RODAN_EVENTS';
import Radio from 'backbone.radio';

/**
 * Controls context menus.
 */
export default class ControllerContextMenu extends BaseController
{
///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
///////////////////////////////////////////////////////////////////////////////////////
    /**
     * Initialize radio.
     */
    _initializeRadio()
    {
        Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__CONTEXTMENU_HIDE, () => this._handleRequestContextMenuHide());
        Radio.channel('rodan').reply(RODAN_EVENTS.REQUEST__CONTEXTMENU_SHOW, options => this._handleRequestContextMenuShow(options));
    }

///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS - Radio handlers
///////////////////////////////////////////////////////////////////////////////////////
    /**
     * Handle request context menu hide.
     */
    _handleRequestContextMenuHide()
    {
        $('#menu-context').hide();
    }

    /**
     * Handle request context menu show.
     */
    _handleRequestContextMenuShow(options)
    {
        $('#menu-context').empty();
        for (var index in options.items)
        {
            var itemData = options.items[index];
            var callOptions = itemData.options ? itemData.options : {};
            var label = itemData.label;
            var channel = itemData.channel ? itemData.channel : 'rodan';
            var radiorequest = itemData.radiorequest;

            var functionCall = (event) => {
                var data = $(event.currentTarget).data('radio');
                Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__CONTEXTMENU_HIDE);
                Radio.channel(channel).request(data.request, data.options);
            };

            var anchor = $('<a>' + label + '</a>');
            anchor.data('radio', {request: radiorequest, options: callOptions});
            anchor.click(functionCall);
            $('#menu-context').append($('<li></li>').append(anchor));
        }
        $('#menu-context').css('top', options.top);
        $('#menu-context').css('left', options.left);
        $('#menu-context').show();
        $('body').one('click', this._handleRequestContextMenuHide);
    }
}