ViewportController.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. Ext.define('saas.view.viewport.ViewportController', {
  2. extend: 'Ext.app.ViewController',
  3. alias: 'controller.viewport',
  4. listen: {
  5. controller: {
  6. '*': {
  7. login: 'onLogin',
  8. logout: 'onLogout',
  9. selectCompany: 'onSelectCompany',
  10. unmatchedroute: 'handleUnmatchedRoute'
  11. }
  12. }
  13. },
  14. routes: {
  15. 'login': 'handleLoginRoute'
  16. },
  17. init: function() {
  18. this.originalRoute = saas.getApplication().getDefaultToken();
  19. this.restoreSession();
  20. },
  21. mainviewboxready: function() {
  22. if(!Ext.isChrome && !Ext.isFirefox) {
  23. saas.util.BaseUtil.showConfirm('温馨提示', '为了更好地呈现页面效果,推荐使用Chrome浏览器或火狐浏览器');
  24. }
  25. },
  26. showView: function(xtype) {
  27. var view = this.lookup(xtype),
  28. viewport = this.getView();
  29. if (!view) {
  30. viewport.removeAll(true);
  31. view = viewport.add({
  32. xtype: xtype,
  33. reference: xtype
  34. });
  35. }
  36. viewport.getLayout().setActiveItem(view);
  37. },
  38. showAuth: function() {
  39. this.showView('login');
  40. },
  41. showMain: function() {
  42. var me = this;
  43. me.showView('main');
  44. },
  45. // ROUTING
  46. handleLoginRoute: function() {
  47. var session = this.session;
  48. if (session && session.isValid()) {
  49. this.redirectTo('', {replace: true});
  50. return;
  51. }
  52. this.showAuth();
  53. },
  54. handleUnmatchedRoute: function(route) {
  55. var me = this;
  56. if (!me.session || !me.session.isValid()) {
  57. // There is no authenticated user, let's redirect to the login page but keep track
  58. // of the original route to restore the requested route after user authentication.
  59. me.originalRoute = route;
  60. me.redirectTo('login', {replace: true});
  61. return;
  62. }
  63. // There is an authenticated user, so let's simply redirect to the default token.
  64. var target = saas.getApplication().getDefaultToken();
  65. Ext.log.warn('Route unknown: ', route);
  66. if (route !== target) {
  67. me.redirectTo(target, {replace: true});
  68. }
  69. },
  70. setRequestToken: function(token) {
  71. var headers = Ext.Ajax.getDefaultHeaders() || {};
  72. if (token) {
  73. headers['Authorization'] = token;
  74. } else {
  75. delete headers['Authorization'];
  76. }
  77. Ext.Ajax.setDefaultHeaders(headers);
  78. },
  79. // SESSION MANAGEMENT
  80. restoreSession: function() {
  81. var data = saas.util.State.get('session'),
  82. session = data? saas.model.Session.loadData(data) : null;
  83. if (session && session.isValid()) {
  84. this.initiateSession(session);
  85. } else {
  86. this.terminateSession();
  87. }
  88. return session;
  89. },
  90. initiateSession: function(session) {
  91. this.setRequestToken(session.get('token'));
  92. this.saveSession(session);
  93. this.showMain();
  94. },
  95. terminateSession: function() {
  96. this.setRequestToken(null);
  97. this.saveSession(null);
  98. this.showAuth();
  99. },
  100. saveSession: function(session) {
  101. saas.util.State.set('session', session && session.getData(true));
  102. this.getViewModel().set('account', session && session.get('account'));
  103. this.session = session;
  104. },
  105. // AUTHENTICATION
  106. onLogin: function(session) {
  107. if (!session || !session.isValid()) {
  108. return false;
  109. }
  110. this.initiateSession(session);
  111. this.redirectTo(this.originalRoute, {replace: true});
  112. },
  113. onLogout: function() {
  114. var me = this,
  115. view = me.getView(),
  116. session = me.session;
  117. if (!session || !session.isValid()) {
  118. return false;
  119. }
  120. view.mask();
  121. session.logout().catch(function(error) {
  122. saas.util.BaseUtil.showErrorToast(error.message);
  123. }).then(function() {
  124. me.originalRoute = Ext.History.getToken();
  125. me.terminateSession();
  126. view.unmask();
  127. me.redirectTo('login', {replace: true});
  128. });
  129. },
  130. onSelectCompany: function(companyId) {
  131. var me = this, view = me.getView(), viewModel = me.getViewModel(),
  132. oldSession = me.session, company = viewModel.get('company');
  133. if (company.id != companyId) {
  134. view.mask('请稍等...');
  135. saas.model.Session.switchCompany(oldSession, companyId)
  136. .then(function(newSession) {
  137. newSession.get('account').companyId = companyId;
  138. me.initiateSession(newSession);
  139. })
  140. .catch(function(error) {
  141. saas.util.BaseUtil.showErrorToast(error.message);
  142. })
  143. .then(function() {
  144. view.isMasked() && view.unmask();
  145. window.location.reload();
  146. });
  147. }
  148. }
  149. });