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 cr.define('print_preview', function() { | 5 cr.define('print_preview', function() { |
6 'use strict'; | 6 'use strict'; |
7 | 7 |
8 /** | 8 /** |
9 * Component used for searching for a print destination. | 9 * Component used for searching for a print destination. |
10 * This is a modal dialog that allows the user to search and select a | 10 * This is a modal dialog that allows the user to search and select a |
11 * destination to print to. When a destination is selected, it is written to | 11 * destination to print to. When a destination is selected, it is written to |
12 * the destination store. | 12 * the destination store. |
13 * @param {!print_preview.DestinationStore} destinationStore Data store | 13 * @param {!print_preview.DestinationStore} destinationStore Data store |
14 * containing the destinations to search through. | 14 * containing the destinations to search through. |
| 15 * @param {!print_preview.InvitationStore} invitationStore Data store |
| 16 * holding printer sharing invitations. |
15 * @param {!print_preview.UserInfo} userInfo Event target that contains | 17 * @param {!print_preview.UserInfo} userInfo Event target that contains |
16 * information about the logged in user. | 18 * information about the logged in user. |
17 * @constructor | 19 * @constructor |
18 * @extends {print_preview.Overlay} | 20 * @extends {print_preview.Overlay} |
19 */ | 21 */ |
20 function DestinationSearch(destinationStore, userInfo) { | 22 function DestinationSearch(destinationStore, invitationStore, userInfo) { |
21 print_preview.Overlay.call(this); | 23 print_preview.Overlay.call(this); |
22 | 24 |
23 /** | 25 /** |
24 * Data store containing the destinations to search through. | 26 * Data store containing the destinations to search through. |
25 * @type {!print_preview.DestinationStore} | 27 * @type {!print_preview.DestinationStore} |
26 * @private | 28 * @private |
27 */ | 29 */ |
28 this.destinationStore_ = destinationStore; | 30 this.destinationStore_ = destinationStore; |
29 | 31 |
30 /** | 32 /** |
| 33 * Data store holding printer sharing invitations. |
| 34 * @type {!print_preview.DestinationStore} |
| 35 * @private |
| 36 */ |
| 37 this.invitationStore_ = invitationStore; |
| 38 |
| 39 /** |
31 * Event target that contains information about the logged in user. | 40 * Event target that contains information about the logged in user. |
32 * @type {!print_preview.UserInfo} | 41 * @type {!print_preview.UserInfo} |
33 * @private | 42 * @private |
34 */ | 43 */ |
35 this.userInfo_ = userInfo; | 44 this.userInfo_ = userInfo; |
36 | 45 |
37 /** | 46 /** |
| 47 * Currently displayed printer sharing invitation. |
| 48 * @type {print_preview.Invitation} |
| 49 * @private |
| 50 */ |
| 51 this.invitation_ = null; |
| 52 |
| 53 /** |
38 * Used to record usage statistics. | 54 * Used to record usage statistics. |
39 * @type {!print_preview.DestinationSearchMetricsContext} | 55 * @type {!print_preview.DestinationSearchMetricsContext} |
40 * @private | 56 * @private |
41 */ | 57 */ |
42 this.metrics_ = new print_preview.DestinationSearchMetricsContext(); | 58 this.metrics_ = new print_preview.DestinationSearchMetricsContext(); |
43 | 59 |
44 /** | 60 /** |
45 * Whether or not a UMA histogram for the register promo being shown was | 61 * Whether or not a UMA histogram for the register promo being shown was |
46 * already recorded. | 62 * already recorded. |
47 * @type {boolean} | 63 * @type {boolean} |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 this.searchBox_.focus(); | 147 this.searchBox_.focus(); |
132 if (getIsVisible(this.getChildElement('.cloudprint-promo'))) { | 148 if (getIsVisible(this.getChildElement('.cloudprint-promo'))) { |
133 this.metrics_.record( | 149 this.metrics_.record( |
134 print_preview.Metrics.DestinationSearchBucket.SIGNIN_PROMPT); | 150 print_preview.Metrics.DestinationSearchBucket.SIGNIN_PROMPT); |
135 } | 151 } |
136 if (this.userInfo_.initialized) | 152 if (this.userInfo_.initialized) |
137 this.onUsersChanged_(); | 153 this.onUsersChanged_(); |
138 this.reflowLists_(); | 154 this.reflowLists_(); |
139 this.metrics_.record( | 155 this.metrics_.record( |
140 print_preview.Metrics.DestinationSearchBucket.DESTINATION_SHOWN); | 156 print_preview.Metrics.DestinationSearchBucket.DESTINATION_SHOWN); |
| 157 |
| 158 this.destinationStore_.startLoadAllDestinations(); |
| 159 this.invitationStore_.startLoadingInvitations(); |
141 } else { | 160 } else { |
142 // Collapse all destination lists | 161 // Collapse all destination lists |
143 this.localList_.setIsShowAll(false); | 162 this.localList_.setIsShowAll(false); |
144 this.cloudList_.setIsShowAll(false); | 163 this.cloudList_.setIsShowAll(false); |
145 this.resetSearch_(); | 164 this.resetSearch_(); |
146 } | 165 } |
147 }, | 166 }, |
148 | 167 |
149 /** @override */ | 168 /** @override */ |
150 onCancelInternal: function() { | 169 onCancelInternal: function() { |
(...skipping 19 matching lines...) Expand all Loading... |
170 this.getChildElement('.account-select'), | 189 this.getChildElement('.account-select'), |
171 'change', | 190 'change', |
172 this.onAccountChange_.bind(this)); | 191 this.onAccountChange_.bind(this)); |
173 | 192 |
174 this.tracker.add( | 193 this.tracker.add( |
175 this.getChildElement('.sign-in'), | 194 this.getChildElement('.sign-in'), |
176 'click', | 195 'click', |
177 this.onSignInActivated_.bind(this)); | 196 this.onSignInActivated_.bind(this)); |
178 | 197 |
179 this.tracker.add( | 198 this.tracker.add( |
| 199 this.getChildElement('.invitation-accept-button'), |
| 200 'click', |
| 201 this.onInvitationProcessButtonClick_.bind(this, true /*accept*/)); |
| 202 this.tracker.add( |
| 203 this.getChildElement('.invitation-reject-button'), |
| 204 'click', |
| 205 this.onInvitationProcessButtonClick_.bind(this, false /*accept*/)); |
| 206 |
| 207 this.tracker.add( |
180 this.getChildElement('.cloudprint-promo > .close-button'), | 208 this.getChildElement('.cloudprint-promo > .close-button'), |
181 'click', | 209 'click', |
182 this.onCloudprintPromoCloseButtonClick_.bind(this)); | 210 this.onCloudprintPromoCloseButtonClick_.bind(this)); |
183 this.tracker.add( | 211 this.tracker.add( |
184 this.searchBox_, | 212 this.searchBox_, |
185 print_preview.SearchBox.EventType.SEARCH, | 213 print_preview.SearchBox.EventType.SEARCH, |
186 this.onSearch_.bind(this)); | 214 this.onSearch_.bind(this)); |
187 this.tracker.add( | 215 this.tracker.add( |
188 this, | 216 this, |
189 print_preview.DestinationListItem.EventType.SELECT, | 217 print_preview.DestinationListItem.EventType.SELECT, |
(...skipping 17 matching lines...) Expand all Loading... |
207 this.tracker.add( | 235 this.tracker.add( |
208 this.destinationStore_, | 236 this.destinationStore_, |
209 print_preview.DestinationStore.EventType.DESTINATION_SEARCH_STARTED, | 237 print_preview.DestinationStore.EventType.DESTINATION_SEARCH_STARTED, |
210 this.updateThrobbers_.bind(this)); | 238 this.updateThrobbers_.bind(this)); |
211 this.tracker.add( | 239 this.tracker.add( |
212 this.destinationStore_, | 240 this.destinationStore_, |
213 print_preview.DestinationStore.EventType.DESTINATION_SEARCH_DONE, | 241 print_preview.DestinationStore.EventType.DESTINATION_SEARCH_DONE, |
214 this.onDestinationSearchDone_.bind(this)); | 242 this.onDestinationSearchDone_.bind(this)); |
215 | 243 |
216 this.tracker.add( | 244 this.tracker.add( |
| 245 this.invitationStore_, |
| 246 print_preview.InvitationStore.EventType.INVITATION_SEARCH_DONE, |
| 247 this.updateInvitations_.bind(this)); |
| 248 this.tracker.add( |
| 249 this.invitationStore_, |
| 250 print_preview.InvitationStore.EventType.INVITATION_PROCESSED, |
| 251 this.updateInvitations_.bind(this)); |
| 252 |
| 253 this.tracker.add( |
217 this.localList_, | 254 this.localList_, |
218 print_preview.DestinationList.EventType.ACTION_LINK_ACTIVATED, | 255 print_preview.DestinationList.EventType.ACTION_LINK_ACTIVATED, |
219 this.onManageLocalDestinationsActivated_.bind(this)); | 256 this.onManageLocalDestinationsActivated_.bind(this)); |
220 this.tracker.add( | 257 this.tracker.add( |
221 this.cloudList_, | 258 this.cloudList_, |
222 print_preview.DestinationList.EventType.ACTION_LINK_ACTIVATED, | 259 print_preview.DestinationList.EventType.ACTION_LINK_ACTIVATED, |
223 this.onManageCloudDestinationsActivated_.bind(this)); | 260 this.onManageCloudDestinationsActivated_.bind(this)); |
224 | 261 |
225 this.tracker.add( | 262 this.tracker.add( |
226 this.userInfo_, | 263 this.userInfo_, |
(...skipping 25 matching lines...) Expand all Loading... |
252 /** | 289 /** |
253 * @return {number} Height available for destination lists, in pixels. | 290 * @return {number} Height available for destination lists, in pixels. |
254 * @private | 291 * @private |
255 */ | 292 */ |
256 getAvailableListsHeight_: function() { | 293 getAvailableListsHeight_: function() { |
257 var elStyle = window.getComputedStyle(this.getElement()); | 294 var elStyle = window.getComputedStyle(this.getElement()); |
258 return this.getElement().offsetHeight - | 295 return this.getElement().offsetHeight - |
259 parseInt(elStyle.getPropertyValue('padding-top')) - | 296 parseInt(elStyle.getPropertyValue('padding-top')) - |
260 parseInt(elStyle.getPropertyValue('padding-bottom')) - | 297 parseInt(elStyle.getPropertyValue('padding-bottom')) - |
261 this.getChildElement('.lists').offsetTop - | 298 this.getChildElement('.lists').offsetTop - |
| 299 this.getChildElement('.invitation-container').offsetHeight - |
262 this.getChildElement('.cloudprint-promo').offsetHeight; | 300 this.getChildElement('.cloudprint-promo').offsetHeight; |
263 }, | 301 }, |
264 | 302 |
265 /** | 303 /** |
266 * Filters all destination lists with the given query. | 304 * Filters all destination lists with the given query. |
267 * @param {RegExp} query Query to filter destination lists by. | 305 * @param {RegExp} query Query to filter destination lists by. |
268 * @private | 306 * @private |
269 */ | 307 */ |
270 filterLists_: function(query) { | 308 filterLists_: function(query) { |
271 this.recentList_.updateSearchQuery(query); | 309 this.recentList_.updateSearchQuery(query); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 this.destinationStore_.isLocalDestinationSearchInProgress); | 445 this.destinationStore_.isLocalDestinationSearchInProgress); |
408 this.cloudList_.setIsThrobberVisible( | 446 this.cloudList_.setIsThrobberVisible( |
409 this.destinationStore_.isCloudDestinationSearchInProgress); | 447 this.destinationStore_.isCloudDestinationSearchInProgress); |
410 this.recentList_.setIsThrobberVisible( | 448 this.recentList_.setIsThrobberVisible( |
411 this.destinationStore_.isLocalDestinationSearchInProgress && | 449 this.destinationStore_.isLocalDestinationSearchInProgress && |
412 this.destinationStore_.isCloudDestinationSearchInProgress); | 450 this.destinationStore_.isCloudDestinationSearchInProgress); |
413 this.reflowLists_(); | 451 this.reflowLists_(); |
414 }, | 452 }, |
415 | 453 |
416 /** | 454 /** |
| 455 * Updates printer sharing invitations UI. |
| 456 * @private |
| 457 */ |
| 458 updateInvitations_: function() { |
| 459 var invitations = this.userInfo_.activeUser ? |
| 460 this.invitationStore_.invitations(this.userInfo_.activeUser) : []; |
| 461 if (invitations.length > 0) { |
| 462 this.invitation_ = invitations[0]; |
| 463 this.showInvitation_(this.invitation_); |
| 464 } else { |
| 465 this.invitation_ = null; |
| 466 } |
| 467 setIsVisible( |
| 468 this.getChildElement('.invitation-container'), !!this.invitation_); |
| 469 this.reflowLists_(); |
| 470 }, |
| 471 |
| 472 /** |
| 473 * @param {!printe_preview.Invitation} invitation Invitation to show. |
| 474 * @private |
| 475 */ |
| 476 showInvitation_: function(invitation) { |
| 477 var invitationText = ''; |
| 478 if (invitation.asGroupManager) { |
| 479 invitationText = localStrings.getStringF( |
| 480 'groupPrinterSharingInviteText', |
| 481 invitation.sender, |
| 482 invitation.destination.displayName, |
| 483 invitation.receiver); |
| 484 } else { |
| 485 invitationText = localStrings.getStringF( |
| 486 'printerSharingInviteText', |
| 487 invitation.sender, |
| 488 invitation.destination.displayName); |
| 489 } |
| 490 this.getChildElement('.invitation-text').innerHTML = invitationText; |
| 491 |
| 492 var acceptButton = this.getChildElement('.invitation-accept-button'); |
| 493 acceptButton.textContent = localStrings.getString( |
| 494 invitation.asGroupManager ? 'acceptForGroup' : 'accept'); |
| 495 acceptButton.disabled = !!this.invitationStore_.invitationInProgress; |
| 496 this.getChildElement('.invitation-reject-button').disabled = |
| 497 !!this.invitationStore_.invitationInProgress; |
| 498 setIsVisible( |
| 499 this.getChildElement('#invitation-process-throbber'), |
| 500 !!this.invitationStore_.invitationInProgress); |
| 501 }, |
| 502 |
| 503 /** |
417 * Called when user's logged in accounts change. Updates the UI. | 504 * Called when user's logged in accounts change. Updates the UI. |
418 * @private | 505 * @private |
419 */ | 506 */ |
420 onUsersChanged_: function() { | 507 onUsersChanged_: function() { |
421 var loggedIn = this.userInfo_.loggedIn; | 508 var loggedIn = this.userInfo_.loggedIn; |
422 if (loggedIn) { | 509 if (loggedIn) { |
423 var accountSelectEl = this.getChildElement('.account-select'); | 510 var accountSelectEl = this.getChildElement('.account-select'); |
424 accountSelectEl.innerHTML = ''; | 511 accountSelectEl.innerHTML = ''; |
425 this.userInfo_.users.forEach(function(account) { | 512 this.userInfo_.users.forEach(function(account) { |
426 var option = document.createElement('option'); | 513 var option = document.createElement('option'); |
427 option.text = account; | 514 option.text = account; |
428 option.value = account; | 515 option.value = account; |
429 accountSelectEl.add(option); | 516 accountSelectEl.add(option); |
430 }); | 517 }); |
431 var option = document.createElement('option'); | 518 var option = document.createElement('option'); |
432 option.text = localStrings.getString('addAccountTitle'); | 519 option.text = localStrings.getString('addAccountTitle'); |
433 option.value = ''; | 520 option.value = ''; |
434 accountSelectEl.add(option); | 521 accountSelectEl.add(option); |
435 | 522 |
436 accountSelectEl.selectedIndex = | 523 accountSelectEl.selectedIndex = |
437 this.userInfo_.users.indexOf(this.userInfo_.activeUser); | 524 this.userInfo_.users.indexOf(this.userInfo_.activeUser); |
438 } | 525 } |
439 | 526 |
440 setIsVisible(this.getChildElement('.user-info'), loggedIn); | 527 setIsVisible(this.getChildElement('.user-info'), loggedIn); |
441 setIsVisible(this.getChildElement('.cloud-list'), loggedIn); | 528 setIsVisible(this.getChildElement('.cloud-list'), loggedIn); |
442 setIsVisible(this.getChildElement('.cloudprint-promo'), !loggedIn); | 529 setIsVisible(this.getChildElement('.cloudprint-promo'), !loggedIn); |
443 this.reflowLists_(); | 530 this.updateInvitations_(); |
444 }, | 531 }, |
445 | 532 |
446 /** | 533 /** |
447 * Called when a destination search should be executed. Filters the | 534 * Called when a destination search should be executed. Filters the |
448 * destination lists with the given query. | 535 * destination lists with the given query. |
449 * @param {Event} evt Contains the search query. | 536 * @param {Event} evt Contains the search query. |
450 * @private | 537 * @private |
451 */ | 538 */ |
452 onSearch_: function(evt) { | 539 onSearch_: function(evt) { |
453 this.filterLists_(evt.queryRegExp); | 540 this.filterLists_(evt.queryRegExp); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 | 583 |
497 /** | 584 /** |
498 * Called when destinations are inserted into the store. Rerenders | 585 * Called when destinations are inserted into the store. Rerenders |
499 * destinations. | 586 * destinations. |
500 * @private | 587 * @private |
501 */ | 588 */ |
502 onDestinationSearchDone_: function() { | 589 onDestinationSearchDone_: function() { |
503 this.updateThrobbers_(); | 590 this.updateThrobbers_(); |
504 this.renderDestinations_(); | 591 this.renderDestinations_(); |
505 this.reflowLists_(); | 592 this.reflowLists_(); |
| 593 // In case user account information was retrieved with this search |
| 594 // (knowing current user account is required to fetch invitations). |
| 595 this.invitationStore_.startLoadingInvitations(); |
506 }, | 596 }, |
507 | 597 |
508 /** | 598 /** |
509 * Called when the manage cloud printers action is activated. | 599 * Called when the manage cloud printers action is activated. |
510 * @private | 600 * @private |
511 */ | 601 */ |
512 onManageCloudDestinationsActivated_: function() { | 602 onManageCloudDestinationsActivated_: function() { |
513 cr.dispatchSimpleEvent( | 603 cr.dispatchSimpleEvent( |
514 this, | 604 this, |
515 print_preview.DestinationSearch.EventType.MANAGE_CLOUD_DESTINATIONS); | 605 print_preview.DestinationSearch.EventType.MANAGE_CLOUD_DESTINATIONS); |
(...skipping 25 matching lines...) Expand all Loading... |
541 * switch or, for 'Add account...' item, opens Google sign-in page. | 631 * switch or, for 'Add account...' item, opens Google sign-in page. |
542 * @private | 632 * @private |
543 */ | 633 */ |
544 onAccountChange_: function() { | 634 onAccountChange_: function() { |
545 var accountSelectEl = this.getChildElement('.account-select'); | 635 var accountSelectEl = this.getChildElement('.account-select'); |
546 var account = | 636 var account = |
547 accountSelectEl.options[accountSelectEl.selectedIndex].value; | 637 accountSelectEl.options[accountSelectEl.selectedIndex].value; |
548 if (account) { | 638 if (account) { |
549 this.userInfo_.activeUser = account; | 639 this.userInfo_.activeUser = account; |
550 this.destinationStore_.reloadUserCookieBasedDestinations(); | 640 this.destinationStore_.reloadUserCookieBasedDestinations(); |
| 641 this.invitationStore_.startLoadingInvitations(); |
551 this.metrics_.record( | 642 this.metrics_.record( |
552 print_preview.Metrics.DestinationSearchBucket.ACCOUNT_CHANGED); | 643 print_preview.Metrics.DestinationSearchBucket.ACCOUNT_CHANGED); |
553 } else { | 644 } else { |
554 cr.dispatchSimpleEvent(this, DestinationSearch.EventType.ADD_ACCOUNT); | 645 cr.dispatchSimpleEvent(this, DestinationSearch.EventType.ADD_ACCOUNT); |
555 // Set selection back to the active user. | 646 // Set selection back to the active user. |
556 for (var i = 0; i < accountSelectEl.options.length; i++) { | 647 for (var i = 0; i < accountSelectEl.options.length; i++) { |
557 if (accountSelectEl.options[i].value == this.userInfo_.activeUser) { | 648 if (accountSelectEl.options[i].value == this.userInfo_.activeUser) { |
558 accountSelectEl.selectedIndex = i; | 649 accountSelectEl.selectedIndex = i; |
559 break; | 650 break; |
560 } | 651 } |
561 } | 652 } |
562 this.metrics_.record( | 653 this.metrics_.record( |
563 print_preview.Metrics.DestinationSearchBucket.ADD_ACCOUNT_SELECTED); | 654 print_preview.Metrics.DestinationSearchBucket.ADD_ACCOUNT_SELECTED); |
564 } | 655 } |
565 }, | 656 }, |
566 | 657 |
567 /** | 658 /** |
| 659 * Called when the printer sharing invitation Accept/Reject button is |
| 660 * clicked. |
| 661 * @private |
| 662 */ |
| 663 onInvitationProcessButtonClick_: function(accept) { |
| 664 this.invitationStore_.processInvitation(this.invitation_, accept); |
| 665 this.updateInvitations_(); |
| 666 }, |
| 667 |
| 668 /** |
568 * Called when the close button on the cloud print promo is clicked. Hides | 669 * Called when the close button on the cloud print promo is clicked. Hides |
569 * the promo. | 670 * the promo. |
570 * @private | 671 * @private |
571 */ | 672 */ |
572 onCloudprintPromoCloseButtonClick_: function() { | 673 onCloudprintPromoCloseButtonClick_: function() { |
573 setIsVisible(this.getChildElement('.cloudprint-promo'), false); | 674 setIsVisible(this.getChildElement('.cloudprint-promo'), false); |
574 }, | 675 }, |
575 | 676 |
576 /** | 677 /** |
577 * Called when the window is resized. Reflows layout of destination lists. | 678 * Called when the window is resized. Reflows layout of destination lists. |
578 * @private | 679 * @private |
579 */ | 680 */ |
580 onWindowResize_: function() { | 681 onWindowResize_: function() { |
581 this.reflowLists_(); | 682 this.reflowLists_(); |
582 } | 683 } |
583 }; | 684 }; |
584 | 685 |
585 // Export | 686 // Export |
586 return { | 687 return { |
587 DestinationSearch: DestinationSearch | 688 DestinationSearch: DestinationSearch |
588 }; | 689 }; |
589 }); | 690 }); |
OLD | NEW |