Toolbar.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <template>
  2. <md-toolbar id="toolbar" class="md-dense">
  3. <span v-if="currentPath == 'user'">
  4. <md-button class="md-icon-button" @click="goBack()">
  5. <md-icon>backspace</md-icon>&nbsp;
  6. </md-button>
  7. </span>
  8. <span v-else class="button-spacer">&nbsp;</span>
  9. <h2 id="toolbar-title" class="md-title"><router-link :to="{name: 'home'}" class="home-link">ibt2</router-link></h2>
  10. <span v-if="loggedInUser.username">
  11. <md-button v-if="loggedInUser.isAdmin" id="users-icon" class="md-icon-button" @click="toUsersPage()">
  12. <md-icon>people_outline</md-icon>
  13. </md-button>
  14. <md-button id="logged-in-icon" class="md-icon-button" @click="toUserPage()">
  15. <md-icon>person_pin</md-icon>
  16. </md-button>
  17. <span id="logged-in" class="md-subheading">
  18. <router-link :to="userUrl" class="username-link">{{ loggedInUser.username }}</router-link>
  19. </span>
  20. <md-button id="logout-icon" class="md-icon-button" @click="logout()">
  21. <md-icon>exit_to_app</md-icon>
  22. </md-button>
  23. </span>
  24. <span v-else>
  25. <md-button v-show="!showLoginForm" class="md-icon-button" @click="focusToLoginForm()">
  26. <md-icon>power_settings_new</md-icon>
  27. </md-button>
  28. <span v-show="showLoginForm" id="login-form">
  29. <md-input-container id="username-input" class="login-input" md-inline>
  30. <md-input ref="usernameInput" @keyup.enter.native="focusToPassword()" v-model="username" placeholder="username" md-inline />
  31. </md-input-container>&nbsp;
  32. <span id="password-block">
  33. <md-input-container id="password-input" class="login-input" md-has-password md-inline>
  34. <md-input ref="passwordInput" @keyup.enter.native="login()" v-model="password" placeholder="password" type="password" md-line />
  35. </md-input-container>
  36. <md-button id="login-button" class="md-icon-button" @click="login()">
  37. <md-icon>play_circle_outline</md-icon>
  38. </md-button>
  39. </span>
  40. </span>
  41. </span>
  42. </md-toolbar>
  43. </template>
  44. <script>
  45. export default {
  46. data () {
  47. return {
  48. username: '',
  49. password: '',
  50. showLoginForm: false
  51. }
  52. },
  53. computed: {
  54. userUrl: function() {
  55. var id = this.loggedInUser._id;
  56. if (!id) {
  57. return '';
  58. }
  59. return '/user/' + this.loggedInUser._id;
  60. },
  61. loggedInUser() {
  62. return this.$store.state.loggedInUser;
  63. },
  64. currentPath() {
  65. return this.$route.name;
  66. }
  67. },
  68. beforeCreate: function() {
  69. this.usersUrl = this.$resource('users');
  70. this.currentUserUrl = this.$resource('users/current');
  71. this.loginUrl = this.$resource('login');
  72. this.logoutUrl = this.$resource('logout');
  73. },
  74. mounted: function() {
  75. this.getUserInfo();
  76. },
  77. methods: {
  78. goBack() {
  79. this.$router.back();
  80. },
  81. toUserPage() {
  82. this.$router.push(this.userUrl);
  83. },
  84. toUsersPage() {
  85. this.$router.push('/user/');
  86. },
  87. focusToLoginForm() {
  88. this.showLoginForm = true;
  89. var that = this;
  90. setTimeout(function() { that.$refs.usernameInput.$el.focus(); }, 400);
  91. },
  92. focusToPassword() {
  93. this.$refs.passwordInput.$el.focus();
  94. },
  95. login(opt) {
  96. opt = opt || {};
  97. var user_data = {username: this.username, password: this.password};
  98. this.loginUrl.save(user_data).then((response) => {
  99. return response.json();
  100. }, (response) => {
  101. // Unable to login? Let's try to create the user!
  102. if (response.status == 401) {
  103. if (opt.stopHere) {
  104. alert('login: failed to get resource');
  105. } else {
  106. this.createUser(user_data);
  107. }
  108. }
  109. }).then((data) => {
  110. this.showLoginForm = false;
  111. this.getUserInfo();
  112. });
  113. },
  114. logout() {
  115. this.logoutUrl.get().then((response) => {
  116. return response.json();
  117. }, (response) => {
  118. alert('logout: failed to get resource');
  119. }).then((json) => {
  120. this.$store.commit('clearLoggedInUser');
  121. });
  122. },
  123. createUser(user_data) {
  124. user_data.username = user_data.username || {};
  125. user_data.username = user_data.username || this.username;
  126. user_data.password = user_data.password || this.password;
  127. this.usersUrl.save(user_data).then((response) => {
  128. return response.json();
  129. }, (response) => {
  130. }).then((json) => {
  131. this.login({stopHere: true});
  132. });
  133. },
  134. getUserInfo(callback) {
  135. this.currentUserUrl.get().then((response) => {
  136. return response.json();
  137. }, (response) => {
  138. alert('getUserInfo: failed to get resource');
  139. }).then((data) => {
  140. data = data || {};
  141. this.$store.commit('setLoggedInUser', data);
  142. if (callback) {
  143. callback(data);
  144. }
  145. });
  146. }
  147. }
  148. }
  149. </script>
  150. <style>
  151. #toolbar-title {
  152. flex: 1;
  153. }
  154. .login-input {
  155. width: 200px;
  156. margin: 0px 0px 0px;
  157. padding-top: 0px;
  158. padding-left: 4px;
  159. min-height: 24px;
  160. line-height: 0px;
  161. background-color: white;
  162. }
  163. #username-input {
  164. display: inline;
  165. float: left;
  166. margin-right: 20px;
  167. }
  168. #password-input {
  169. display: inline;
  170. float: left;
  171. }
  172. #password-block {
  173. display: inline;
  174. float: right;
  175. }
  176. #login-button {
  177. height: 32px;
  178. }
  179. #logged-in-icon {
  180. margin-right: 0px;
  181. padding-right: 0px;
  182. color: #f6f72f !important;
  183. }
  184. #logged-in {
  185. position: relative;
  186. top: 10px;
  187. }
  188. #logout-icon {
  189. margin-left: 0px;
  190. padding-left: 0px;
  191. }
  192. .username-link {
  193. font-weight: bold;
  194. color: #f6f72f !important;
  195. }
  196. .button-spacer {
  197. width: 52px;
  198. }
  199. .home-link {
  200. font-weight: bold;
  201. color: white !important;
  202. }
  203. </style>