API Docs for: 1.0.0
Show:

File: Resources/public/js/apps/ez-platformuiapp.js

/*
 * Copyright (C) eZ Systems AS. All rights reserved.
 * For full copyright and license information view LICENSE file distributed with this source code.
 */
YUI.add('ez-platformuiapp', function (Y) {
    "use strict";
    /**
     * Provides the PlatformUI Application class
     *
     * @module ez-platformuiapp
     */

    Y.namespace('eZ');

    /**
     * PlatformUI Application
     *
     * @namespace eZ
     * @class PlatformUIApp
     * @constructor
     * @extends App
     */
    Y.eZ.PlatformUIApp = Y.Base.create('platformuiApp', Y.App, [Y.eZ.TranslateProperty], {
        /**
         * Initializes the application.
         *
         * @method initializer
         */
        initializer: function () {
            this._dispatchConfig();
            Y.eZ.Translator.setPreferredLanguages(this.get('interfaceLanguages'));

            this._setGlobals();
            this._fireAppReadyEvent();
        },

        /**
         * Instantiates and renders a view with the given `ViewConstructor` and
         * `ServiceConstructor`. It does pretty much the same thing as what
         * happened when navigating in the app but it skips the routing phase.
         * When done, the `done` callback is called with the view and view
         * service instances as parameters.
         *
         * @method renderView
         * @param {Function} ViewConstructor
         * @param {Function} ServiceConstructor
         * @param {Object} requestParams the request parameters expected by the
         * view service.
         * @param {Function} done
         * @param {false|Error} done.error
         * @param {eZ.ViewService} done.viewService
         * @param {eZ.View} done.view
         */
        renderView: function (ViewConstructor, ServiceConstructor, requestParams, done) {
            var req, res,
                view, viewService;

            req = this._getRequest('renderComponent');
            req.params = requestParams;
            res = this._getResponse(req);

            viewService = new ServiceConstructor({
                app: this,
                capi: this.get('capi'),
                request: req,
                response: res,
                plugins: Y.eZ.PluginRegistry.getPlugins(ServiceConstructor.NAME),
                config: this.get('config'),
                bubbleTargets: this,
            });

            viewService.once('error', function (e) {
                done(new Error(e.message));
            });
            viewService.load(function () {
                view = new ViewConstructor(viewService.getViewParameters());
                view.render();
                view.addTarget(viewService);
                done(false, viewService, view);
            });
        },

        /**
         * Instantiates and renders a side view with the given `ViewConstructor` and
         * `ServiceConstructor`. It does pretty much the same thing as what
         * happened when the app is creating a side view.
         *
         * @method renderSideView
         * @param {Function} ViewConstructor
         * @param {Function} ServiceConstructor
         * @param {Object} params the parameters expected by the side view
         * service
         * @param {Function} done
         * @param {false|Error} done.error
         * @param {eZ.ViewService} done.viewService
         * @param {eZ.View} done.view
         */
        renderSideView: function (ViewConstructor, ServiceConstructor, params, done) {
            var req, res,
                view, viewService;

            req = this._getRequest('renderComponent');
            res = this._getResponse(req);

            viewService = new ServiceConstructor({
                app: this,
                capi: this.get('capi'),
                plugins: Y.eZ.PluginRegistry.getPlugins(ServiceConstructor.NAME),
                config: this.get('config'),
                bubbleTargets: this,
            });

            viewService.once('error', function (e) {
                done(new Error(e.message));
            });

            viewService.setAttrs({
                'parameters': params,
                'request': req,
                'response': res,
            });
            view = new ViewConstructor({bubbleTargets: viewService});
            viewService.load(function () {
                view.setAttrs(viewService.getViewParameters());
                view.render();
                view.addTarget(viewService);
                done(false, viewService, view);
            });
        },

        /**
         * Registers the `Y` sandbox object and the app instance in the global
         * `eZ.YUI` namespace.
         *
         * @method _setGlobals
         * @private
         */
        _setGlobals: function () {
            window.eZ = window.eZ || {};
            window.eZ.YUI = {
                Y: Y,
                app: this,
            };
        },

        /**
         * Fires the custom `ez:yui-app:ready` **DOM** event. It is dispatched
         * from the `document` object.
         *
         * @method _fireAppReadyEvent
         * @private
         */
        _fireAppReadyEvent: function () {
            var evt = new CustomEvent('ez:yui-app:ready');

            document.dispatchEvent(evt);
        },

        /**
         * Dispatches the `config` attribute value so that the app is configured
         * accordingly. The values consumed by the app are removed from the
         * configuration.
         *
         * @method _dispatchConfig
         * @protected
         */
        _dispatchConfig: function () {
            var config = this.get('config'),
                systemLanguageList = {},
                defaultLanguageCode;

            if ( !config ) {
                return;
            }
            Y.Object.each(config.rootInfo, function (value, attrName) {
                if ( this.attrAdded(attrName) ) {
                    this._set(attrName, value);
                    delete config.rootInfo[attrName];
                }
            }, this);
            if ( config.anonymousUserId ) {
                this._set('anonymousUserId', config.anonymousUserId);
                delete config.anonymousUserId;
            }
            config.localesMap = config.localesMap || {};
            this._set('localesMap', config.localesMap);

            this._set('capi', new Y.eZ.CAPI(
                this.get('apiRoot').replace(/\/{1,}$/, ''),
                new Y.eZ.SessionAuthAgent(
                    (config.sessionInfo && config.sessionInfo.isStarted) ? config.sessionInfo : undefined
                )
            ));
            delete config.sessionInfo;

            if ( config.languages ) {
                Y.Array.each(config.languages, function (language) {
                    systemLanguageList[language.languageCode] = language;
                    if ( language.default ) {
                        defaultLanguageCode = language.languageCode;
                    }
                });
                this._set('systemLanguageList', systemLanguageList);
                this._set('contentCreationDefaultLanguageCode', defaultLanguageCode);
                delete config.languages;
            }
            if ( config.interfaceLanguages ) {
                this._set('interfaceLanguages', config.interfaceLanguages);
                delete config.interfaceLanguages;
            }
        },

        /**
         * Returns the language name of the language with the given
         * `languageCode`. If no language is found with this code, the language
         * code is returned.
         *
         * @method getLanguageName
         * @since 1.1
         * @param {String} languageCode
         * @return {String}
         */
        getLanguageName: function (languageCode) {
            var systemLanguageList = this.get('systemLanguageList');

            if ( systemLanguageList[languageCode] ) {
                return systemLanguageList[languageCode].name;
            }
            return languageCode;
        },
    }, {
        ATTRS: {
            /**
             * The application configuration. It is dispatched to the others
             * application attributes/properties at build time.
             *
             * @attribute config
             * @type {Object|undefined}
             * @writeOnce
             */
            config: {
                writeOnce: 'initOnly',
            },

            /**
             * The base URI to build the URI of the ajax request
             *
             * @attribute apiRoot
             * @default "/"
             * @type String
             * @readOnly
             */
            apiRoot: {
                readOnly: true,
                value: "/"
            },

            /**
             * The root directory where to find the assets.
             *
             * @attribute assetRoot
             * @default "/"
             * @type String
             * @readOnly
             */
            assetRoot: {
                readOnly: true,
                value: "/"
            },

            /**
             * eZ Platform REST client
             *
             * @attribute capi
             * @default null
             * @type {eZ.CAPI}
             * @readOnly
             * @required
             */
            capi: {
                readOnly: true,
                value: null
            },

            /**
             * Stores the REST id of the configured anonymous user
             *
             * @attribute anonymousUserId
             * @type {String}
             * @readOnly
             */
            anonymousUserId: {
                readOnly: true,
                value: "/api/ezp/v2/user/users/10",
            },

            /**
             * System language list provided with config. The list is hash
             * containing language objects and is indexed by languageCode.
             *
             * @attribute systemLanguageList
             * @default {}
             * @type {Object}
             * @readOnly
             */
            systemLanguageList: {
                readOnly: true,
                value: {}
            },

            /**
             * Default language code, as defined by the current siteaccess language config.
             *
             * @attribute contentCreationDefaultLanguageCode
             * @default "eng-GB"
             * @type {String}
             * @readOnly
             */
            contentCreationDefaultLanguageCode: {
                readOnly: true,
                value: "eng-GB"
            },

            /**
             * Holds the Locales conversion map between eZ Locale codes and
             * POSIX ones. See locale.yml
             *
             * @attribute localesMap
             * @type {Object}
             * @readOnly
             * @default {}
             */
            localesMap: {
                readOnly: true,
                value: {},
            },

            /**
             * List of preferred languages in which the interface should be
             * translated.
             *
             * @attribute interfaceLanguages
             * @readOnly
             * @default ['en']
             * @type {Array}
             */
            interfaceLanguages: {
                readOnly: true,
                value: ['en'],
            },
        }
    });
});