Home Reference Source Repository

js/Application.js

import bootstrap from 'twbs/bootstrap';
import 'twbs/bootstrap/css/bootstrap.css!';
import _ from 'underscore';
import $ from 'jquery';
import Marionette from 'backbone.marionette';
import moment from 'moment';
import './Plugins';
import Radio from 'backbone.radio';

import BehaviorTable from './Behaviors/BehaviorTable';
import ControllerAuthentication from './Controllers/ControllerAuthentication';
import ControllerContextMenu from './Controllers/ControllerContextMenu';
import ControllerDownload from './Controllers/ControllerDownload';
import ControllerModal from './Controllers/ControllerModal';
import ControllerProject from './Controllers/ControllerProject';
import ControllerResource from './Controllers/ControllerResource';
import ControllerResourceList from './Controllers/ControllerResourceList';
import ControllerRunJob from './Controllers/ControllerRunJob';
import ControllerServer from './Controllers/ControllerServer';
import ControllerWorkflow from './Controllers/ControllerWorkflow';
import ControllerWorkflowBuilder from './Controllers/ControllerWorkflowBuilder';
import ControllerWorkflowJob from './Controllers/ControllerWorkflowJob';
import ControllerWorkflowJobGroup from './Controllers/ControllerWorkflowJobGroup';
import ControllerWorkflowRun from './Controllers/ControllerWorkflowRun';
import Configuration from './Configuration';
import ErrorManager from 'js/Managers/ErrorManager';
import RODAN_EVENTS from './Shared/RODAN_EVENTS';
import GlobalInputPortTypeCollection from './Collections/Global/GlobalInputPortTypeCollection';
import GlobalJobCollection from './Collections/Global/GlobalJobCollection';
import GlobalOutputPortTypeCollection from './Collections/Global/GlobalOutputPortTypeCollection';
import GlobalProjectCollection from './Collections/Global/GlobalProjectCollection';
import GlobalResourceTypeCollection from './Collections/Global/GlobalResourceTypeCollection';
import LayoutViewMaster from './Views/Master/LayoutViewMaster';
import RadioManager from './Managers/RadioManager';
import UpdateManager from './Managers/UpdateManager';
import TransferManager from './Managers/TransferManager';

/**
 * Main application class.
 */
export default class Application extends Marionette.Application
{
///////////////////////////////////////////////////////////////////////////////////////
// PUBLIC METHODS
///////////////////////////////////////////////////////////////////////////////////////
    /**
     * Called on Marionette.Application.start(). This will load the configuration from the host.
     */
    onStart()
    {
        Configuration.load('configuration.json', () => this._startUp());
    }

///////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
///////////////////////////////////////////////////////////////////////////////////////
    /**
     * Application start-up
     */
    _startUp()
    {
        Configuration.load('info.json');
        this.addRegions({
            regionMaster: '#region-master'
        });

        // Non-network and non-GUI inits. Do these first.
        this._initializeBehaviors();
        this._initializeDateTimeFormatter();
        this._initializeRadio();
        this._initializeCollections();
        this._initializeManagers();

        this._initializeAjaxPrefilters();
        this._initializeViews();
        this._initializeControllers();
        
        Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_LOAD_ROUTES);
    }

    /**
     * Initialize managers.
     */
    _initializeManagers()
    {
        this._transferManager = new TransferManager();
        this._radioManager = new RadioManager();
        this._updateManager = new UpdateManager();
        this._errorManager = new ErrorManager();
    }

    /**
     * Initializes various helpers.
     */
    _initializeDateTimeFormatter()
    {
        moment.defaultFormat = Configuration.DATETIME_FORMAT;
        _.formatFromUTC = function(dateTime)
        {
            // TODO - see https://github.com/DDMAL/rodan-client/issues/59
            try
            {
                return moment(dateTime).format();
            }
            catch(error)
            {
                return moment.moment(dateTime).format();
            }
        };
    }

    /**
     * Initialize behaviors.
     */
    _initializeBehaviors()
    {
        Marionette.Behaviors.behaviorsLookup = function()
        {
            return {'Table': BehaviorTable};
        };
    }

    /**
     * Set event binding.
     */
    _initializeRadio()
    {
        Radio.channel('rodan').on(RODAN_EVENTS.EVENT__SERVER_ROUTESLOADED, () => this._handleEventRoutesLoaded());
        Radio.channel('rodan').on(RODAN_EVENTS.EVENT__AUTHENTICATION_LOGIN_SUCCESS, () => this._handleAuthenticationSuccess());
    }

    /**
     * Initialize controllers. These are not used for viewing; rather, they are server/auth control.
     */
    _initializeControllers()
    {
        this._contextMenuController = new ControllerContextMenu();
        this._downloadController = new ControllerDownload();
        this._controllerServer = new ControllerServer();
        this._controllerAuthentication = new ControllerAuthentication(this._controllerServer);
        this._modalController = new ControllerModal();
        this._projectController = new ControllerProject();
        this._resourceController = new ControllerResource();
        this._resourceListController = new ControllerResourceList();
        this._runJobController = new ControllerRunJob();
        this._workflowController = new ControllerWorkflow();
        this._workflowRunController = new ControllerWorkflowRun();
        this._workflowBuilderController = new ControllerWorkflowBuilder();
        this._workflowJobController = new ControllerWorkflowJob();
        this._workflowJobGroupController = new ControllerWorkflowJobGroup();
    }

    /**
     * Initialize AJAX prefilters. This allows the application a lower level of request monitoring (if desired).
     */
    _initializeAjaxPrefilters()
    {
        var that = this;
        $.ajaxPrefilter(function(options)
        {
            that._controllerAuthentication.ajaxPrefilter(options);
            that._controllerServer.ajaxPrefilter(options);
        });
    }

    /**
     * Initialize collections.
     */
    _initializeCollections()
    {
        this._jobCollection = new GlobalJobCollection();
        this._resourceTypeCollection = new GlobalResourceTypeCollection();
        this._inputPortTypeCollection = new GlobalInputPortTypeCollection();
        this._outputPortTypeCollection = new GlobalOutputPortTypeCollection();
        this._projectCollection = new GlobalProjectCollection();
    }

    /**
     * Initialize all the views so they can respond to events.
     */
    _initializeViews()
    {
        this._layoutViewMaster = new LayoutViewMaster();
    }

    /**
     * Handle EVENT__SERVER_ROUTESLOADED.
     */
    _handleEventRoutesLoaded()
    {
        // Render layout views.
        /** @ignore */
        this.regionMaster.show(this._layoutViewMaster);

        // Check authentication.
        Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__AUTHENTICATION_CHECK); 
    }

    /**
     * Handle authentication success.
     */
    _handleAuthenticationSuccess()
    {
        var user = Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__AUTHENTICATION_USER);
        Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__SERVER_LOAD_ROUTE_OPTIONS);
        Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_PROJECTS_LOAD, {data: {user: user.get('uuid')}});
        Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_INPUTPORTTYPES_LOAD);
        Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_OUTPUTPORTTYPES_LOAD);
        Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_RESOURCETYPES_LOAD);
        Radio.channel('rodan').request(RODAN_EVENTS.REQUEST__GLOBAL_JOBS_LOAD, {data: {enabled: 'True'}});
        Radio.channel('rodan').trigger(RODAN_EVENTS.EVENT__PROJECT_SELECTED_COLLECTION); 
    }
}