APIs

Show:
  1. /**
  2. Application router and layout router responsible for kick starting the application as
  3. well as management for sizing events
  4. @class LayoutRouter
  5. @constructor
  6. @return {Object} instantiated AppRouter
  7. **/
  8. define(['underscore', 'jquery', 'backbone', 'AppAuth', 'NavigationView', 'AppEntryFaderView', 'LoginView', 'AppContentFaderView', 'WaitView', 'LivePreView', 'bootbox', 'CampaignManagerView', 'ResourcesLoaderView', 'ResourcesLoaderView', 'StationsViewLoader', 'SettingView', 'FQLoaderView', 'AdStatsLoaderView', 'ProStudioView', 'HelpView', 'InstallView', 'LogoutView', 'CampaignSliderStackView', 'ScreenLayoutSelectorView', 'X2JS', 'XDate', 'LanguageSelectorView', 'SceneLoaderView', 'DashboardView'],
  9. function (_, $, Backbone, AppAuth, NavigationView, AppEntryFaderView, LoginView, AppContentFaderView, WaitView, LivePreView, Bootbox, CampaignManagerView, ResourcesLoaderView, ResourcesLoaderView, StationsViewLoader, SettingView, FQLoaderView, AdStatsLoaderView, ProStudioView, HelpView, InstallView, LogoutView, CampaignSliderStackView, ScreenLayoutSelectorView, X2JS, XDate, LanguageSelectorView, SceneLoaderView, DashboardView) {
  10.  
  11. BB.SERVICES.LAYOUT_ROUTER = 'LayoutRouter';
  12.  
  13. /**
  14. Event fired when app resized
  15. @event APP_SIZED
  16. @static
  17. @final
  18. **/
  19. BB.EVENTS.APP_SIZED = 'APP_SIZED';
  20.  
  21. var LayoutRouter = BB.Router.extend({
  22.  
  23. /**
  24. Constructor
  25. @method initialize
  26. **/
  27. initialize: function () {
  28. var self = this;
  29. BB.comBroker.setService(BB.SERVICES['LAYOUT_ROUTER'], self);
  30.  
  31. // global x2j required by pepper
  32. window.x2js = new X2JS({
  33. escapeMode: true,
  34. attributePrefix: "_",
  35. arrayAccessForm: "none",
  36. emptyNodeForm: "text",
  37. enableToStringFunc: true,
  38. arrayAccessFormPaths: [],
  39. skipEmptyTextNodesForObj: true
  40. });
  41. BB.comBroker.setService('compX2JS', window.x2js);
  42. BB.comBroker.setService('XDATE', new XDate());
  43. self._initLoginPage();
  44. self._listenLogoHover();
  45. self._listenSizeChanges();
  46. self.m_authenticating = false;
  47.  
  48. $(window).trigger('resize');
  49. $('[data-toggle="tooltip"]').tooltip({'placement': 'bottom', 'delay': 1000});
  50. },
  51.  
  52. /**
  53. Router definition to function maps
  54. @method routes
  55. **/
  56. routes: {
  57. "app": "_routeApp",
  58. "authenticate/:user/:pass": "_routeAuthenticate",
  59. "authenticating": "_routeAuthenticating",
  60. "authenticated": "_routeAuthenticated",
  61. "unauthenticated": "_routeUnauthenticated",
  62. "authenticationFailed": "_routeAuthenticationFailed"
  63. },
  64.  
  65. /**
  66. Initiate user credential route authentication
  67. @method authenticate
  68. @param {String} i_user
  69. @param {String} i_pass
  70. **/
  71. _routeAuthenticate: function (i_user, i_pass) {
  72. var self = this;
  73. if (self.m_authenticating)
  74. return;
  75. this.m_appAuth.authenticate(i_user, i_pass);
  76. },
  77.  
  78. /**
  79. In process of route authentication
  80. @method authenticating
  81. **/
  82. _routeAuthenticating: function () {
  83. var self = this;
  84. self.m_authenticating = true;
  85. this.m_appEntryFaderView.selectView(this.m_mainAppWaitView);
  86. },
  87.  
  88. /**
  89. Authentication passed, load app page route
  90. @method authenticating
  91. **/
  92. _routeAuthenticated: function () {
  93. var self = this;
  94. self.m_authenticating = false;
  95. this.navigate('app', {trigger: true});
  96. self._updateLayoutDelay();
  97. },
  98.  
  99. /**
  100. No authentication passed, load Login page route
  101. @method authenticating
  102. **/
  103. _routeUnauthenticated: function () {
  104. var self = this;
  105. self.m_authenticating = false;
  106. this.m_appEntryFaderView.selectView(this.m_loginView);
  107. },
  108.  
  109. /**
  110. Failed user authentication route
  111. @method authenticationFailed
  112. **/
  113. _routeAuthenticationFailed: function () {
  114. var self = this;
  115. self.m_authenticating = false;
  116. Bootbox.dialog({
  117. message: $(Elements.MSG_BOOTBOX_WRONG_USER_PASS).text(),
  118. title: $(Elements.MSG_BOOTBOX_PROBLEM).text(),
  119. buttons: {
  120. danger: {
  121. label: $(Elements.MSG_BOOTBOX_OK).text(),
  122. className: "btn-danger",
  123. callback: function () {
  124. }
  125. }
  126. }
  127. });
  128. this.m_appEntryFaderView.selectView(this.m_loginView);
  129. },
  130.  
  131. /**
  132. On successful authentication load main application StackViews per this route App
  133. @method app
  134. **/
  135. _routeApp: function () {
  136. var self = this;
  137. if (this.m_appAuth.authenticated) {
  138. this._disableBack();
  139. this._initContentPage();
  140. this._initProperties();
  141. this._initCampaignWizardPage();
  142. this._initModal();
  143. this._initDashBoard();
  144. this._initCustomer();
  145. pepper.injectPseudoScenePlayersIDs();
  146. } else {
  147. this.navigate('unauthenticated', {trigger: true});
  148. }
  149. },
  150.  
  151. /**
  152. Create two StackView views: AppEntryFaderView and AppContentFaderView
  153. AppEntryFaderView allows for page selection between login page and main app content page
  154. AppContentFaderView serves as dual purpose view. On one hand it serves as simple show/hide div for main login page / content page,
  155. on the other hand it itself is a StackView.Fader that allows for show/hide between main content sections including campaigns,
  156. stations, resources, settings etc
  157. @method _initLoginPage
  158. **/
  159. _initLoginPage: function () {
  160.  
  161. this.m_appAuth = new AppAuth();
  162.  
  163. this.m_appEntryFaderView = new AppEntryFaderView({
  164. el: Elements.APP_ENTRY,
  165. duration: 500
  166. });
  167.  
  168. this.m_appContentFaderView = new AppContentFaderView({
  169. el: Elements.APP_CONTENT,
  170. duration: 650
  171. });
  172.  
  173. this.m_loginView = new LoginView({
  174. el: Elements.APP_LOGIN
  175. });
  176.  
  177. this.m_loginView = new LoginView({
  178. el: Elements.APP_LOGIN
  179. });
  180.  
  181. this.m_livePreview = new LivePreView({
  182. el: Elements.LIVE_PREVIEW
  183. });
  184.  
  185. this.m_mainAppWaitView = new WaitView({
  186. el: Elements.WAITS_SCREEN_ENTRY_APP
  187. });
  188.  
  189. this.m_logoutView = new BB.View({
  190. el: Elements.APP_LOGOUT
  191. });
  192.  
  193. this.m_appEntryFaderView.addView(this.m_loginView);
  194. this.m_appEntryFaderView.addView(this.m_logoutView);
  195. this.m_appEntryFaderView.addView(this.m_livePreview);
  196. // this.m_appEntryFaderView.addView(this.m_fasterQTermRegistration);
  197. this.m_appEntryFaderView.addView(this.m_appContentFaderView);
  198. this.m_appEntryFaderView.addView(this.m_mainAppWaitView);
  199.  
  200. BB.comBroker.setService(BB.SERVICES['APP_AUTH'], this.m_appAuth);
  201. BB.comBroker.setService(BB.SERVICES['APP_ENTRY_FADER_VIEW'], this.m_appEntryFaderView);
  202. BB.comBroker.setService(BB.SERVICES['APP_CONTENT_FADER_VIEW'], this.m_appContentFaderView);
  203. },
  204.  
  205. /**
  206. Update the general dashboard with stats
  207. @method Update
  208. **/
  209. _initDashBoard: function () {
  210. $(Elements.SERVER_NAME).text(pepper.getUserData().domain);
  211. $(Elements.BUISINESS_ID).text(pepper.getUserData().businessID);
  212. $(Elements.CLASS_USER_NAME).text(pepper.getUserData().userName);
  213. },
  214.  
  215. /**
  216. Setup customer account
  217. @method _initCustomer
  218. **/
  219. _initCustomer: function () {
  220. var self = this;
  221. if (pepper.getUserData().resellerID == 1 || pepper.getUserData().whiteLabel == 0) {
  222. $(Elements.CLASS_RES_HID).fadeIn();
  223. } else {
  224. $(Elements.APP_NAME).text(pepper.getUserData().resellerName);
  225. $(Elements.CLASS_RES_HID).remove();
  226. }
  227. },
  228.  
  229. /**
  230. Use the previously created m_appContentFaderView to add list of views including campaign, stations, logout etc
  231. so navigation can be switched between each content div. Also we create one special view called
  232. CampaignSliderStackView that it itself is a StackView.Slider that will later allow for Campaign wizard slider animated selections.
  233. @method _initContentPage
  234. **/
  235. _initContentPage: function () {
  236. var self = this;
  237. self.m_navigationView = new NavigationView({
  238. el: Elements.FILE_MENU
  239. });
  240.  
  241. self.m_campaignManagerView = new CampaignManagerView({
  242. el: Elements.CAMPAIGN_MANAGER_VIEW
  243. });
  244.  
  245. self.m_campaignSliderStackView = new CampaignSliderStackView({
  246. el: Elements.CAMPAIGN_SLIDER
  247. });
  248.  
  249. self.m_ResourcesLoaderView = new ResourcesLoaderView({
  250. el: Elements.RESOURCES_PANEL,
  251. stackView: self.m_appContentFaderView
  252. });
  253.  
  254. self.m_stationsViewLoader = new StationsViewLoader({
  255. el: Elements.STATIONS_PANEL,
  256. stackView: self.m_appContentFaderView
  257. });
  258.  
  259. self.m_sceneLoaderView = new SceneLoaderView({
  260. el: Elements.SCENES_PANEL,
  261. stackView: self.m_appContentFaderView
  262. });
  263.  
  264. self.m_settingsView = new SettingView({
  265. el: Elements.SETTINGS_PANEL,
  266. stackView: self.m_appContentFaderView
  267. });
  268.  
  269. self.m_fasterQLoaderView = new FQLoaderView({
  270. el: Elements.FASTERQ_PANEL,
  271. stackView: self.m_appContentFaderView
  272. });
  273.  
  274. self.m_adStatsLoaderView = new AdStatsLoaderView({
  275. el: Elements.AD_STATS_PANEL,
  276. stackView: self.m_appContentFaderView
  277. });
  278.  
  279. self.m_proStudioView = new ProStudioView({
  280. el: Elements.PRO_STUDIO_PANEL,
  281. stackView: self.m_appContentFaderView
  282. });
  283.  
  284. self.m_helpView = new HelpView({
  285. el: Elements.HELP_PANEL,
  286. stackView: this.m_appContentFaderView
  287. });
  288.  
  289. self.m_installView = new InstallView({
  290. el: Elements.INSTALL_PANEL,
  291. stackView: this.m_appContentFaderView
  292. });
  293.  
  294. this.m_logoutView = new LogoutView({
  295. el: Elements.LOGOUT_PANEL,
  296. stackView: self.m_appContentFaderView
  297. });
  298.  
  299. self.m_appContentFaderView.addView(self.m_campaignManagerView);
  300. self.m_appContentFaderView.addView(self.m_ResourcesLoaderView);
  301. self.m_appContentFaderView.addView(self.m_stationsViewLoader);
  302. self.m_appContentFaderView.addView(self.m_sceneLoaderView);
  303. self.m_appContentFaderView.addView(self.m_settingsView);
  304. self.m_appContentFaderView.addView(self.m_fasterQLoaderView);
  305. self.m_appContentFaderView.addView(self.m_adStatsLoaderView);
  306. self.m_appContentFaderView.addView(self.m_proStudioView);
  307. self.m_appContentFaderView.addView(self.m_helpView);
  308. self.m_appContentFaderView.addView(self.m_installView);
  309. self.m_appContentFaderView.addView(self.m_logoutView);
  310. // self.m_appContentFaderView.selectView(self.m_fasterQLoaderView); // debug mode
  311. self.m_appContentFaderView.selectView(self.m_campaignManagerView);
  312.  
  313. BB.comBroker.setService(BB.SERVICES['NAVIGATION_VIEW'], self.m_navigationView);
  314. },
  315.  
  316. /**
  317. Use the previously created CampaignSliderStackView to add new views for campaign wizard slider animation which include
  318. CampaignSelector, Screen Orientation, Screen Resolution and Campaign
  319. @method _initCampaignWizardPage
  320. **/
  321. _initCampaignWizardPage: function () {
  322. var self = this;
  323.  
  324. require(['CampaignSelectorView', 'OrientationSelectorView', 'ResolutionSelectorView', 'CampaignView', 'CampaignNameSelectorView', 'AddBlockView', 'AddBlockLocationView', 'ScreenLayoutEditorView'], function (CampaignSelectorView, OrientationSelectorView, ResolutionSelectorView, CampaignView, CampaignNameSelectorView, AddBlockView, AddBlockLocationView, ScreenLayoutEditorView) {
  325.  
  326. self.m_campaignSelectorView = new CampaignSelectorView({
  327. stackView: self.m_campaignSliderStackView,
  328. from: Elements.CAMPAIGN,
  329. el: Elements.CAMPAIGN_SELECTOR,
  330. to: Elements.CAMPAIGN_NAME_SELECTOR_VIEW
  331. });
  332. BB.comBroker.setService(BB.SERVICES.CAMPAIGN_SELECTOR, self.m_campaignSelectorView);
  333.  
  334. self.m_campaignNameSelectorView = new CampaignNameSelectorView({
  335. stackView: self.m_campaignSliderStackView,
  336. from: Elements.CAMPAIGN_SELECTOR,
  337. el: Elements.CAMPAIGN_NAME_SELECTOR_VIEW,
  338. to: Elements.ORIENTATION_SELECTOR
  339. });
  340. BB.comBroker.setService(BB.SERVICES.CAMPAIGN_NAME_SELECTOR_VIEW, self.m_campaignNameSelectorView);
  341.  
  342. self.m_orientationSelectorView = new OrientationSelectorView({
  343. stackView: self.m_campaignSliderStackView,
  344. from: Elements.CAMPAIGN_NAME_SELECTOR_VIEW,
  345. el: Elements.ORIENTATION_SELECTOR,
  346. to: Elements.RESOLUTION_SELECTOR,
  347. model: new BB.Model({screenOrientation: null})
  348. });
  349. BB.comBroker.setService(BB.SERVICES.ORIENTATION_SELECTOR_VIEW, self.m_orientationSelectorView);
  350.  
  351. self.m_resolutionSelectorView = new ResolutionSelectorView({
  352. stackView: self.m_campaignSliderStackView,
  353. from: Elements.ORIENTATION_SELECTOR,
  354. el: Elements.RESOLUTION_SELECTOR,
  355. to: Elements.SCREEN_LAYOUT_SELECTOR,
  356. model: new BB.Model({screenResolution: null})
  357. });
  358. BB.comBroker.setService(BB.SERVICES.RESOLUTION_SELECTOR_VIEW, self.m_resolutionSelectorView);
  359.  
  360. self.m_screenLayoutSelectorView = new ScreenLayoutSelectorView({
  361. stackView: self.m_campaignSliderStackView,
  362. from: Elements.RESOLUTION_SELECTOR,
  363. el: Elements.SCREEN_LAYOUT_SELECTOR,
  364. to: Elements.CAMPAIGN,
  365. model: new BB.Model({screenLayout: null})
  366. });
  367. BB.comBroker.setService(BB.SERVICES.SCREEN_LAYOUT_SELECTOR_VIEW, self.m_screenLayoutSelectorView);
  368.  
  369. self.m_campaignView = new CampaignView({
  370. stackView: self.m_campaignSliderStackView,
  371. from: Elements.SCREEN_LAYOUT_SELECTOR,
  372. el: Elements.CAMPAIGN,
  373. to: Elements.ADD_BLOCK_ELEM_VIEW
  374. });
  375. BB.comBroker.setService(BB.SERVICES.CAMPAIGN_VIEW, self.m_campaignView);
  376.  
  377. self.m_addBlockView = new AddBlockView({
  378. stackView: self.m_campaignSliderStackView,
  379. from: Elements.CAMPAIGN,
  380. el: Elements.ADD_BLOCK_ELEM_VIEW,
  381. to: Elements.CAMPAIGN_SELECTOR,
  382. placement: BB.CONSTS.PLACEMENT_CHANNEL
  383. });
  384. BB.comBroker.setService(BB.SERVICES.ADD_BLOCK_VIEW, self.m_addBlockView);
  385.  
  386. self.m_addBlockLocationView = new AddBlockLocationView({
  387. stackView: self.m_campaignSliderStackView,
  388. from: Elements.CAMPAIGN,
  389. el: Elements.GOOGLE_MAPS_LOCATION,
  390. to: Elements.CAMPAIGN_SELECTOR,
  391. placement: BB.CONSTS.PLACEMENT_CHANNEL
  392. });
  393. BB.comBroker.setService(BB.SERVICES.ADD_BLOCK_LOCATION_VIEW, self.m_addBlockLocationView);
  394.  
  395. self.m_screenLayoutEditorView = new ScreenLayoutEditorView({
  396. stackView: self.m_campaignSliderStackView,
  397. from: Elements.CAMPAIGN,
  398. el: Elements.SCREEN_LAYOUT_EDITOR_VIEW,
  399. to: Elements.CAMPAIGN_SELECTOR
  400. });
  401.  
  402. self.m_campaignSliderStackView.addView(self.m_campaignSelectorView);
  403. self.m_campaignSliderStackView.addView(self.m_campaignNameSelectorView);
  404. self.m_campaignSliderStackView.addView(self.m_orientationSelectorView);
  405. self.m_campaignSliderStackView.addView(self.m_resolutionSelectorView);
  406. self.m_campaignSliderStackView.addView(self.m_screenLayoutSelectorView);
  407. self.m_campaignSliderStackView.addView(self.m_campaignView);
  408. self.m_campaignSliderStackView.addView(self.m_addBlockView);
  409. //self.m_campaignSliderStackView.addView(self.m_addBlockListsView);
  410. self.m_campaignSliderStackView.selectView(self.m_campaignSelectorView);
  411. });
  412.  
  413. this.m_appEntryFaderView.selectView(this.m_appContentFaderView);
  414. },
  415.  
  416. /**
  417. Create properties panel view
  418. @method _initProperties
  419. **/
  420. _initProperties: function () {
  421. require(['PropertiesView', 'bootstrapselect'], function (PropertiesView, bootstrapselect) {
  422.  
  423. // enable bootstrap enhanced dropdown selection
  424. $('.selectpicker').selectpicker({width: '90%'});
  425.  
  426. this.m_propertiesView = new PropertiesView({
  427. el: Elements.PROP_PANEL,
  428. duration: 300
  429. });
  430.  
  431. this.m_dashboardPropView = new DashboardView({
  432. el: Elements.DASHBOARD_PROPERTIES
  433. });
  434.  
  435. self.m_propertiesView.addView(this.m_dashboardPropView);
  436. self.m_propertiesView.selectView(this.m_dashboardPropView);
  437. BB.comBroker.setService(BB.SERVICES.PROPERTIES_VIEW, this.m_propertiesView);
  438. });
  439. },
  440.  
  441. /**
  442. Create a popup modal view that's used for About Us and properties content on small screens
  443. @method _initModal
  444. **/
  445. _initModal: function () {
  446. var self = this;
  447. require(['PopModalView'], function (PopModalView) {
  448. var popModalView = new PopModalView({
  449. el: Elements.POP_MODAL,
  450. animation: 'slide_top', //or 'fade'
  451. bgColor: 'white'
  452. });
  453. self.m_popUpProperties = new BB.View({el: Elements.POPUP_PROPERTIES});
  454. popModalView.addView(self.m_popUpProperties);
  455.  
  456. self.m_popUpAboutUs = new BB.View({el: Elements.ABOUT_US});
  457. popModalView.addView(self.m_popUpAboutUs);
  458.  
  459. self.m_popUpWait = new BB.View({el: Elements.STACK_WAIT_MODAL_VIEW});
  460. popModalView.addView(self.m_popUpWait);
  461.  
  462. BB.comBroker.setService(BB.SERVICES.POP_MODAL_VIEW, popModalView);
  463. });
  464. },
  465.  
  466. /**
  467. Listen logo mouse hover
  468. @method _listenLogoHover
  469. **/
  470. _listenLogoHover: function () {
  471. $('.flip').mouseenter(function () {
  472. $(this).find('.card').addClass('flipped').mouseleave(function () {
  473. $(this).removeClass('flipped');
  474. });
  475. return false;
  476. });
  477. },
  478.  
  479. /**
  480. Listen to application size changes and lazy update when so
  481. @method _listenSizeChanges
  482. **/
  483. _listenSizeChanges: function () {
  484. var self = this;
  485. if (BB.lib.isMobile()) {
  486. $(window).one('resize', self._updateLayout);
  487. $(window).bind('orientationchange', function (e) {
  488. // log(window.orientation); // 0 = portrait; 90 = landscape left; -90 = landscape right
  489. self._updateLayoutDelay();
  490. });
  491. } else {
  492. var lazyLayout = _.debounce(self._updateLayout, 150);
  493. $(window).resize(lazyLayout);
  494. self._updateLayoutDelay();
  495. }
  496. },
  497.  
  498. _updateLayoutDelay: function () {
  499. var self = this;
  500. setTimeout(function () {
  501. self._updateLayout();
  502. }, 1500);
  503. },
  504.  
  505. /**
  506. Update key element height changes on size change and notify event subscribers
  507. @method _updateLayout
  508. **/
  509. _updateLayout: function () {
  510. var self = BB.comBroker.getService(BB.SERVICES['LAYOUT_ROUTER']);
  511. var b = $('body');
  512. self._appHeight = parseInt(b.css('height').replace('px', ''));
  513. self._appWidth = parseInt(b.css('width').replace('px', ''));
  514. var h = self._appHeight - 115; // reduce footer
  515.  
  516. $(Elements.PROP_PANEL_WRAP).height(h);
  517. $(Elements.MAIN_PANEL_WRAP).height(h);
  518. $(Elements.APP_NAVIGATOR).height(h);
  519. $(Elements.RESOURCE_LIB_LIST_WRAP).height(h - 40);
  520. $(Elements.PRICING_TABLE_WRAP).height(h - 200);
  521. $(Elements.BLOCK_SUBPROPERTIES).height(h - 200);
  522. $(Elements.BLOCK_COMMON_PROPERTIES).height(h - 200);
  523. $(Elements.BLOCK_COMMON_SETTINGS).height(h - 200);
  524. $(Elements.CLASS_ADD_NEW_BLOCK_LIST_WRAP).height(h);
  525. $(Elements.IFRAME_PREVIEW).height(h - 40);
  526. $(Elements.DASHBOARD_PROPERTIES).height(h - 30);
  527. $(Elements.SCENE_SELECTOR_LIST).height(h - 40);
  528. $(Elements.SCENE_CANVAS_CONTAINER).height(h - 150);
  529. $(Elements.CAMPAIGN_SELECTOR_LIST).height(h - 150);
  530. $(Elements.STATION_LIST_VIEW).height(h - 150);
  531. $(Elements.STATION_PROPERTIES).height(h - 50);
  532. $(Elements.FASTERQ_LINES_CONTAINER).height(h - 180);
  533. $(Elements.SCENE_CREATOR).height(h - 40);
  534. $(Elements.SELECT_SCENE_TYPE_CREATE_TEMPLATE).height(h - 40);
  535.  
  536. BB.comBroker.fire(BB.EVENTS.APP_SIZED, this, null, {width: self._appWidth, height: self._appHeight});
  537. },
  538.  
  539. /**
  540. Disable browser back button
  541. @method disableBack
  542. **/
  543. _disableBack: function () {
  544. var self = this;
  545. window.location.hash = "start_";
  546. window.location.hash = "Again-start_";//for google chrome
  547. window.onhashchange = function () {
  548. window.location.hash = "start_";
  549. }
  550. },
  551.  
  552. /**
  553. Get latest registered app width
  554. @return {Number} width
  555. **/
  556. getAppWidth: function () {
  557. return this._appWidth;
  558. },
  559.  
  560. /**
  561. Get latest registered app height
  562. @return {Number} height
  563. **/
  564. getAppHeight: function () {
  565. return this._appHeight;
  566. }
  567. });
  568.  
  569. return LayoutRouter;
  570. });