OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview User pod row implementation. | 6 * @fileoverview User pod row implementation. |
7 */ | 7 */ |
8 | 8 |
9 cr.define('login', function() { | 9 cr.define('login', function() { |
10 /** | 10 /** |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 function removeClass(el, cl) { | 86 function removeClass(el, cl) { |
87 el.classList.remove(cl); | 87 el.classList.remove(cl); |
88 } | 88 } |
89 | 89 |
90 /** | 90 /** |
91 * Creates a user pod. | 91 * Creates a user pod. |
92 * @constructor | 92 * @constructor |
93 * @extends {HTMLDivElement} | 93 * @extends {HTMLDivElement} |
94 */ | 94 */ |
95 var UserPod = cr.ui.define(function() { | 95 var UserPod = cr.ui.define(function() { |
96 return $('user-pod-template').cloneNode(true); | 96 var dom = $('user-pod-template').cloneNode(true); |
| 97 dom.id = ''; |
| 98 return dom; |
97 }); | 99 }); |
98 | 100 |
99 UserPod.prototype = { | 101 UserPod.prototype = { |
100 __proto__: HTMLDivElement.prototype, | 102 __proto__: HTMLDivElement.prototype, |
101 | 103 |
102 /** @override */ | 104 /** @override */ |
103 decorate: function() { | 105 decorate: function() { |
104 this.tabIndex = UserPodTabOrder.POD_INPUT; | 106 this.tabIndex = UserPodTabOrder.POD_INPUT; |
105 this.removeUserButtonElement.tabIndex = UserPodTabOrder.REMOVE_USER; | 107 this.removeUserButtonElement.tabIndex = UserPodTabOrder.REMOVE_USER; |
106 | 108 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 e.preventDefault(); | 163 e.preventDefault(); |
162 return; | 164 return; |
163 } | 165 } |
164 }, | 166 }, |
165 | 167 |
166 /** | 168 /** |
167 * Gets signed in indicator element. | 169 * Gets signed in indicator element. |
168 * @type {!HTMLDivElement} | 170 * @type {!HTMLDivElement} |
169 */ | 171 */ |
170 get signedInIndicatorElement() { | 172 get signedInIndicatorElement() { |
171 return this.firstElementChild; | 173 return this.querySelector('.signed-in-indicator'); |
172 }, | 174 }, |
173 | 175 |
174 /** | 176 /** |
175 * Gets image element. | 177 * Gets image element. |
176 * @type {!HTMLImageElement} | 178 * @type {!HTMLImageElement} |
177 */ | 179 */ |
178 get imageElement() { | 180 get imageElement() { |
179 return this.signedInIndicatorElement.nextElementSibling; | 181 return this.querySelector('.user-image'); |
180 }, | 182 }, |
181 | 183 |
182 /** | 184 /** |
183 * Gets name element. | 185 * Gets name element. |
184 * @type {!HTMLDivElement} | 186 * @type {!HTMLDivElement} |
185 */ | 187 */ |
186 get nameElement() { | 188 get nameElement() { |
187 return this.imageElement.nextElementSibling; | 189 return this.querySelector('.name'); |
188 }, | 190 }, |
189 | 191 |
190 /** | 192 /** |
191 * Gets password field. | 193 * Gets password field. |
192 * @type {!HTMLInputElement} | 194 * @type {!HTMLInputElement} |
193 */ | 195 */ |
194 get passwordElement() { | 196 get passwordElement() { |
195 return this.nameElement.nextElementSibling; | 197 return this.querySelector('.password'); |
196 }, | 198 }, |
197 | 199 |
198 /** | 200 /** |
199 * Gets Caps Lock hint image. | 201 * Gets Caps Lock hint image. |
200 * @type {!HTMLImageElement} | 202 * @type {!HTMLImageElement} |
201 */ | 203 */ |
202 get capslockHintElement() { | 204 get capslockHintElement() { |
203 return this.signinButtonElement.previousElementSibling; | 205 return this.querySelector('.capslock-hint'); |
204 }, | 206 }, |
205 | 207 |
206 /** | 208 /** |
207 * Gets user signin button. | 209 * Gets user signin button. |
208 * @type {!HTMLInputElement} | 210 * @type {!HTMLInputElement} |
209 */ | 211 */ |
210 get signinButtonElement() { | 212 get signinButtonElement() { |
211 return this.removeUserButtonElement.previousElementSibling; | 213 return this.querySelector('.signin-button'); |
212 }, | 214 }, |
213 | 215 |
214 /** | 216 /** |
215 * Gets remove user button. | 217 * Gets remove user button. |
216 * @type {!HTMLInputElement} | 218 * @type {!HTMLInputElement} |
217 */ | 219 */ |
218 get removeUserButtonElement() { | 220 get removeUserButtonElement() { |
219 return this.lastElementChild; | 221 return this.querySelector('.remove-user-button'); |
220 }, | 222 }, |
221 | 223 |
222 /** | 224 /** |
223 * Updates the user pod element. | 225 * Updates the user pod element. |
224 */ | 226 */ |
225 update: function() { | 227 update: function() { |
226 this.updateUserImage(); | 228 this.updateUserImage(); |
227 | 229 |
228 this.nameElement.textContent = this.user_.displayName; | 230 this.nameElement.textContent = this.user_.displayName; |
229 this.removeUserButtonElement.hidden = !this.user_.canRemove; | 231 this.removeUserButtonElement.hidden = !this.user_.canRemove; |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 if (this.parentNode.disabled) | 390 if (this.parentNode.disabled) |
389 return; | 391 return; |
390 if (!this.signinButtonElement.hidden) { | 392 if (!this.signinButtonElement.hidden) { |
391 this.showSigninUI(); | 393 this.showSigninUI(); |
392 // Prevent default so that we don't trigger 'focus' event. | 394 // Prevent default so that we don't trigger 'focus' event. |
393 e.preventDefault(); | 395 e.preventDefault(); |
394 } | 396 } |
395 } | 397 } |
396 }; | 398 }; |
397 | 399 |
| 400 /** |
| 401 * Creates a public account user pod. |
| 402 * @constructor |
| 403 * @extends {UserPod} |
| 404 */ |
| 405 var PublicAccountUserPod = cr.ui.define(function() { |
| 406 var dom = UserPod(); |
| 407 |
| 408 var extras = $('public-account-user-pod-extras-template').children; |
| 409 for (var i = 0; i < extras.length; ++i) { |
| 410 var el = extras[i].cloneNode(true); |
| 411 dom.appendChild(el); |
| 412 } |
| 413 |
| 414 return dom; |
| 415 }); |
| 416 |
| 417 PublicAccountUserPod.prototype = { |
| 418 __proto__: UserPod.prototype, |
| 419 |
| 420 /** |
| 421 * "Enter" button in expanded side pane. |
| 422 * @type {!HTMLButtonElement} |
| 423 */ |
| 424 get enterButtonElement() { |
| 425 return this.querySelector('.enter-button'); |
| 426 }, |
| 427 |
| 428 /** |
| 429 * Boolean flag of whether the pod is showing the side pane. The flag |
| 430 * controls whether 'expanded' class is added to the pod's class list and |
| 431 * resets tab order because main input element changes when the 'expanded' |
| 432 * state changes. |
| 433 * @type {boolean} |
| 434 */ |
| 435 get expanded() { |
| 436 return this.classList.contains('expanded'); |
| 437 }, |
| 438 set expanded(expanded) { |
| 439 if (this.expanded == expanded) |
| 440 return; |
| 441 |
| 442 this.resetTabOrder(); |
| 443 if (expanded) { |
| 444 this.classList.add('expanded'); |
| 445 } else { |
| 446 this.classList.remove('expanded'); |
| 447 } |
| 448 |
| 449 this.classList.add('animating'); |
| 450 this.addEventListener('webkitTransitionEnd', function f(e) { |
| 451 this.removeEventListener('webkitTransitionEnd', f); |
| 452 this.classList.remove('animating'); |
| 453 }.bind(this)); |
| 454 }, |
| 455 |
| 456 /** @override */ |
| 457 get needGaiaSignin() { |
| 458 return false; |
| 459 }, |
| 460 |
| 461 /** @override */ |
| 462 get mainInput() { |
| 463 if (this.expanded) |
| 464 return this.enterButtonElement; |
| 465 else |
| 466 return this.nameElement; |
| 467 }, |
| 468 |
| 469 /** @override */ |
| 470 decorate: function() { |
| 471 UserPod.prototype.decorate.call(this); |
| 472 |
| 473 this.classList.remove('need-password'); |
| 474 this.classList.add('public-account'); |
| 475 |
| 476 this.nameElement.addEventListener('keydown', (function(e) { |
| 477 if (e.keyIdentifier == 'Enter') { |
| 478 this.parentNode.activatedPod = this; |
| 479 // Stop this keydown event from bubbling up to PodRow handler. |
| 480 e.stopPropagation(); |
| 481 // Prevent default so that we don't trigger a 'click' event on the |
| 482 // newly focused "Enter" button. |
| 483 e.preventDefault(); |
| 484 } |
| 485 }).bind(this)); |
| 486 |
| 487 this.enterButtonElement.addEventListener('click', (function(e) { |
| 488 chrome.send('launchPublicAccount', [this.user.username]); |
| 489 }).bind(this)); |
| 490 }, |
| 491 |
| 492 /** |
| 493 * Updates the user pod element. |
| 494 */ |
| 495 update: function() { |
| 496 UserPod.prototype.update.call(this); |
| 497 this.querySelector('.side-pane-name').textContent = |
| 498 this.user_.displayName; |
| 499 this.querySelector('.info').textContent = |
| 500 localStrings.getStringF('publicAccountInfoFormat', |
| 501 this.user_.enterpriseDomain); |
| 502 }, |
| 503 |
| 504 /** @override */ |
| 505 focusInput: function() { |
| 506 // Move tabIndex from the whole pod to the main input. |
| 507 this.tabIndex = -1; |
| 508 this.mainInput.tabIndex = UserPodTabOrder.POD_INPUT; |
| 509 this.mainInput.focus(); |
| 510 }, |
| 511 |
| 512 /** @override */ |
| 513 reset: function(takeFocus) { |
| 514 if (!takeFocus) |
| 515 this.expanded = false; |
| 516 UserPod.prototype.reset.call(this, takeFocus); |
| 517 }, |
| 518 |
| 519 /** @override */ |
| 520 activate: function() { |
| 521 this.expanded = true; |
| 522 this.focusInput(); |
| 523 return true; |
| 524 }, |
| 525 |
| 526 /** @override */ |
| 527 handleMouseDown_: function(e) { |
| 528 if (this.parentNode.disabled) |
| 529 return; |
| 530 |
| 531 this.parentNode.focusPod(this); |
| 532 this.parentNode.activatedPod = this; |
| 533 // Prevent default so that we don't trigger 'focus' event. |
| 534 e.preventDefault(); |
| 535 } |
| 536 }; |
398 | 537 |
399 /** | 538 /** |
400 * Creates a new pod row element. | 539 * Creates a new pod row element. |
401 * @constructor | 540 * @constructor |
402 * @extends {HTMLDivElement} | 541 * @extends {HTMLDivElement} |
403 */ | 542 */ |
404 var PodRow = cr.ui.define('podrow'); | 543 var PodRow = cr.ui.define('podrow'); |
405 | 544 |
406 PodRow.prototype = { | 545 PodRow.prototype = { |
407 __proto__: HTMLDivElement.prototype, | 546 __proto__: HTMLDivElement.prototype, |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 for (var i = 0, control; control = controls[i]; ++i) { | 643 for (var i = 0, control; control = controls[i]; ++i) { |
505 control.disabled = value; | 644 control.disabled = value; |
506 } | 645 } |
507 }, | 646 }, |
508 | 647 |
509 /** | 648 /** |
510 * Creates a user pod from given email. | 649 * Creates a user pod from given email. |
511 * @param {string} email User's email. | 650 * @param {string} email User's email. |
512 */ | 651 */ |
513 createUserPod: function(user) { | 652 createUserPod: function(user) { |
514 var userPod = new UserPod({user: user}); | 653 var userPod; |
| 654 if (user.publicAccount) |
| 655 userPod = new PublicAccountUserPod({user: user}); |
| 656 else |
| 657 userPod = new UserPod({user: user}); |
| 658 |
515 userPod.hidden = false; | 659 userPod.hidden = false; |
516 return userPod; | 660 return userPod; |
517 }, | 661 }, |
518 | 662 |
519 /** | 663 /** |
520 * Add an existing user pod to this pod row. | 664 * Add an existing user pod to this pod row. |
521 * @param {!Object} user User info dictionary. | 665 * @param {!Object} user User info dictionary. |
522 * @param {boolean} animated Whether to use init animation. | 666 * @param {boolean} animated Whether to use init animation. |
523 */ | 667 */ |
524 addUserPod: function(user, animated) { | 668 addUserPod: function(user, animated) { |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 | 933 |
790 /** | 934 /** |
791 * Handler of click event. | 935 * Handler of click event. |
792 * @param {Event} e Click Event object. | 936 * @param {Event} e Click Event object. |
793 * @private | 937 * @private |
794 */ | 938 */ |
795 handleClick_: function(e) { | 939 handleClick_: function(e) { |
796 if (this.disabled) | 940 if (this.disabled) |
797 return; | 941 return; |
798 // Clears focus if not clicked on a pod and if there's more than one pod. | 942 // Clears focus if not clicked on a pod and if there's more than one pod. |
799 if (e.target.parentNode != this && | 943 var pod = findAncestorByClass(e.target, 'pod'); |
800 e.target.parentNode.parentNode != this && | 944 if ((!pod || pod.parentNode != this) && !this.isSinglePod) { |
801 !this.isSinglePod) { | |
802 this.focusPod(); | 945 this.focusPod(); |
803 } | 946 } |
804 | 947 |
805 // Return focus back to single pod. | 948 // Return focus back to single pod. |
806 if (this.isSinglePod) { | 949 if (this.isSinglePod) { |
807 this.focusPod(this.focusedPod_, true /* force */); | 950 this.focusPod(this.focusedPod_, true /* force */); |
808 } | 951 } |
809 }, | 952 }, |
810 | 953 |
811 /** | 954 /** |
812 * Handles focus event. | 955 * Handles focus event. |
813 * @param {Event} e Focus Event object. | 956 * @param {Event} e Focus Event object. |
814 * @private | 957 * @private |
815 */ | 958 */ |
816 handleFocus_: function(e) { | 959 handleFocus_: function(e) { |
817 if (this.disabled) | 960 if (this.disabled) |
818 return; | 961 return; |
819 if (e.target.parentNode == this) { | 962 if (e.target.parentNode == this) { |
820 // Focus on a pod | 963 // Focus on a pod |
821 if (e.target.classList.contains('focused')) | 964 if (e.target.classList.contains('focused')) |
822 e.target.focusInput(); | 965 e.target.focusInput(); |
823 else | 966 else |
824 this.focusPod(e.target); | 967 this.focusPod(e.target); |
825 } else if (e.target.parentNode.parentNode == this) { | 968 return; |
| 969 } |
| 970 |
| 971 var pod = findAncestorByClass(e.target, 'pod'); |
| 972 if (pod && pod.parentNode == this) { |
826 // Focus on a control of a pod but not on the Remove button. | 973 // Focus on a control of a pod but not on the Remove button. |
827 if (!e.target.parentNode.classList.contains('focused') && | 974 if (!pod.classList.contains('focused') && |
828 !e.target.classList.contains('remove-user-button')) { | 975 !e.target.classList.contains('remove-user-button')) { |
829 this.focusPod(e.target.parentNode); | 976 this.focusPod(pod); |
830 e.target.focus(); | 977 e.target.focus(); |
831 } | 978 } |
832 } else { | 979 return; |
833 // Clears pod focus when we reach here. It means new focus is neither | |
834 // on a pod nor on a button/input for a pod. | |
835 // Do not "defocus" user pod when it is a single pod. | |
836 // That means that 'focused' class will not be removed and | |
837 // input field/button will always be visible. | |
838 if (!this.isSinglePod) | |
839 this.focusPod(); | |
840 } | 980 } |
| 981 |
| 982 // Clears pod focus when we reach here. It means new focus is neither |
| 983 // on a pod nor on a button/input for a pod. |
| 984 // Do not "defocus" user pod when it is a single pod. |
| 985 // That means that 'focused' class will not be removed and |
| 986 // input field/button will always be visible. |
| 987 if (!this.isSinglePod) |
| 988 this.focusPod(); |
841 }, | 989 }, |
842 | 990 |
843 /** | 991 /** |
844 * Handler of keydown event. | 992 * Handler of keydown event. |
845 * @param {Event} e KeyDown Event object. | 993 * @param {Event} e KeyDown Event object. |
846 */ | 994 */ |
847 handleKeyDown: function(e) { | 995 handleKeyDown: function(e) { |
848 if (this.disabled) | 996 if (this.disabled) |
849 return; | 997 return; |
850 var editing = e.target.tagName == 'INPUT' && e.target.value; | 998 var editing = e.target.tagName == 'INPUT' && e.target.value; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
949 this.classList.remove('images-loading'); | 1097 this.classList.remove('images-loading'); |
950 chrome.send('userImagesLoaded'); | 1098 chrome.send('userImagesLoaded'); |
951 } | 1099 } |
952 } | 1100 } |
953 }; | 1101 }; |
954 | 1102 |
955 return { | 1103 return { |
956 PodRow: PodRow | 1104 PodRow: PodRow |
957 }; | 1105 }; |
958 }); | 1106 }); |
OLD | NEW |