UNPKG

webgme

Version:

Web-based Generic Modeling Environment

318 lines (270 loc) 11.8 kB
/*globals require, WebGMEGlobal, $, DEBUG, angular*/ /*jshint browser:true*/ require( [ 'jquery', 'jquery-ui', 'jquery-ui-iPad', 'js/jquery.WebGME', 'bootstrap', 'bootstrap-notify', 'underscore', 'backbone', 'js/WebGME', 'js/util', 'text!gmeConfig.json', 'text!package.json', 'js/logger', 'superagent', 'q', 'ravenjs', 'common/storage/util', 'angular', 'angular-ui-bootstrap', 'isis-ui-components', 'isis-ui-components-templates' ], function (jQuery, jQueryUi, jQueryUiiPad, jqueryWebGME, bootstrap, bootstrapNotify, underscore, backbone, webGME, util, gmeConfigJson, packageJson, Logger, superagent, Q, Raven, StorageUtil) { 'use strict'; var gmeConfig = JSON.parse(gmeConfigJson), webgmeEnginePackage = JSON.parse(packageJson), log = Logger.create('gme:main', gmeConfig.client.log), domDeferred = Q.defer(), defaultRavenOpts; WebGMEGlobal.gmeConfig = gmeConfig; WebGMEGlobal.version = gmeConfig.client.appVersion; WebGMEGlobal.webgmeVersion = webgmeEnginePackage.version; defaultRavenOpts = {release: WebGMEGlobal.version}; if (gmeConfig.client.errorReporting && gmeConfig.client.errorReporting.enable === true) { Raven.config( gmeConfig.client.errorReporting.DSN, gmeConfig.client.errorReporting.ravenOptions || defaultRavenOpts ).install(); } // Set the referrer in the session store (if not already set and we are the top window) if (window.top === window && typeof window.sessionStorage.getItem('originalReferrer') !== 'string') { window.sessionStorage.setItem('originalReferrer', document.referrer); } // domDeferred will be resolved (with gmeApp) when the dom is ready (i.e. $ function invoked). $(function () { var d, keys, i, gmeApp; if (gmeConfig.debug) { DEBUG = gmeConfig.debug; } log.debug('domReady, got gmeConfig'); //#2 check URL d = util.getURLParameterByName('debug').toLowerCase(); if (d === 'true') { DEBUG = true; } else if (d === 'false') { DEBUG = false; } // attach external libraries to extlib/* keys = Object.keys(gmeConfig.requirejsPaths); for (i = 0; i < keys.length; i += 1) { // assume this is a relative path from the current working directory gmeConfig.requirejsPaths[keys[i]] = 'extlib/' + gmeConfig.requirejsPaths[keys[i]]; log.debug('Requirejs path resolved: ', keys[i], gmeConfig.requirejsPaths[keys[i]]); } // update client config to route the external lib requests require.config({ paths: gmeConfig.requirejsPaths }); // Extended disable function jQuery.fn.extend({ disable: function (state) { return this.each(function () { var $this = $(this); if ($this.is('input, button')) { this.disabled = state; } else { $this.toggleClass('disabled', state); } }); } }); // Initialize Angular. For this time no better place. // has to be initialized as early as possible gmeApp = angular.module( 'gmeApp', [ //'ngRoute', //'routeStyles', 'ui.bootstrap', 'isis.ui.components', //'gme.ui.projectsDialog', 'gme.ui.headerPanel' ]).config(['$locationProvider', function ($locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false // https://github.com/angular/angular.js/issues/8934 }); }]); domDeferred.resolve(gmeApp); }); function populateAvailableExtensionPoints(callback) { function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1); } function requestExtensionPoint(name) { var deferred = Q.defer(); log.debug('requestExtensionPoint', name); superagent.get('api/' + name) .end(function (err, res) { var keyName = 'all' + capitalizeFirstLetter(name); if (res.status === 200) { WebGMEGlobal[keyName] = res.body; log.debug('/api/' + name, WebGMEGlobal[keyName]); deferred.resolve(); } else { log.error('/api/' + name + 'failed'); WebGMEGlobal[keyName] = []; deferred.reject(err); } }); return deferred.promise; } function requestPluginMetadata() { var deferred = Q.defer(); superagent.get('api/plugins/metadata') .end(function (err, res) { if (res.status === 200) { WebGMEGlobal.allPlugins = Object.keys(res.body); WebGMEGlobal.allPluginsMetadata = res.body; deferred.resolve(); } else { log.error('/api/' + name + 'failed'); WebGMEGlobal.allPlugins = []; WebGMEGlobal.allPluginsMetadata = {}; deferred.reject(err); } }); return deferred.promise; } return Q.all([ requestExtensionPoint('visualizers'), requestPluginMetadata(), requestExtensionPoint('decorators'), requestExtensionPoint('seeds'), requestExtensionPoint('addOns') ]).nodeify(callback); } function populateUserInfo(callback) { var userInfo, userDeferred = Q.defer(); function checkIfAdminInOrg(userId, orgId) { var deferred = Q.defer(); superagent.get('api/orgs/' + orgId) .end(function (err, res) { if (res.status === 200) { if (res.body.admins.indexOf(userId) > -1) { userInfo.adminOrgs.push(res.body); } } else { log.error('failed getting org info', err); } deferred.resolve(); }); return deferred.promise; } superagent.get('api/user') .end(function (err, res) { if (res.status === 200) { userInfo = res.body || {_id: 'N/A', orgs: []}; userInfo.adminOrgs = []; Q.allSettled(userInfo.orgs.map(function (orgId) { return checkIfAdminInOrg(userInfo._id, orgId); })) .then(function () { WebGMEGlobal.userInfo = userInfo; userDeferred.resolve(userInfo); }) .catch(userDeferred.reject); } else { userDeferred.reject(err); } }); return userDeferred.promise.nodeify(callback); } function getDefaultComponentSettings(callback) { var deferred = Q.defer(); superagent.get('api/componentSettings') .end(function (err, res) { if (res.status === 200) { WebGMEGlobal.componentSettings = res.body; } else { log.warn('Could not obtain any default component settings (./config/components.json'); WebGMEGlobal.componentSettings = {}; } deferred.resolve(); }); return deferred.promise.nodeify(callback); } function loadExtraCssFiles(callback) { var deferred = Q.defer(); if (gmeConfig.visualization.extraCss.length > 0) { require(gmeConfig.visualization.extraCss.map(function (cssFile) { return 'css!' + cssFile; }), deferred.resolve, deferred.reject ); } else { deferred.resolve(); } return deferred.promise.nodeify(callback); } function loadDisplayNames(callback) { var deferred = Q.defer(); superagent.get('api/users') .query({displayName: true}) .end(function (err, res) { if (res.status === 200) { WebGMEGlobal._displayNames = {}; res.body.forEach(function (userData) { WebGMEGlobal._displayNames[userData._id] = userData.displayName; }); WebGMEGlobal.getUserDisplayName = function (userId) { return WebGMEGlobal._displayNames[userId] || userId; }; WebGMEGlobal.getProjectDisplayedNameFromProjectId = function (projectId) { return WebGMEGlobal.getUserDisplayName(StorageUtil.getOwnerFromProjectId(projectId)) + ' ' + StorageUtil.CONSTANTS.PROJECT_DISPLAYED_NAME_SEP + ' ' + StorageUtil.getProjectNameFromProjectId(projectId); }; } else { log.error('Unable to get display name list for users!'); WebGMEGlobal.getUserDisplayName = function (userId) { return userId; }; WebGMEGlobal.getProjectDisplayedNameFromProjectId = StorageUtil.getProjectDisplayedNameFromProjectId; } deferred.resolve(); }); return deferred.promise.nodeify(callback); } Q.all([ domDeferred.promise, loadExtraCssFiles(), populateAvailableExtensionPoints(), populateUserInfo(), getDefaultComponentSettings(), loadDisplayNames() ]) .then(function (result) { var gmeApp = result[0]; webGME.start(function (client) { gmeApp.value('gmeClient', client); angular.bootstrap(document, ['gmeApp']); }); }) .catch(function (err) { log.error('Error at start up', err); throw err; }); } );