| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| cr.define('options', function() { |
| var Page = cr.ui.pageManager.Page; |
| var PageManager = cr.ui.pageManager.PageManager; |
| var ArrayDataModel = cr.ui.ArrayDataModel; |
| |
| /** |
| * SupervisedUserImportOverlay class. |
| * Encapsulated handling of the 'Import existing supervised user' overlay |
| * page. |
| * @constructor |
| * @class |
| */ |
| function SupervisedUserImportOverlay() { |
| var title = loadTimeData.getString('supervisedUserImportTitle'); |
| Page.call(this, 'supervisedUserImport', title, 'supervised-user-import'); |
| }; |
| |
| cr.addSingletonGetter(SupervisedUserImportOverlay); |
| |
| SupervisedUserImportOverlay.prototype = { |
| // Inherit from Page. |
| __proto__: Page.prototype, |
| |
| /** @override */ |
| canShowPage: function() { |
| return !BrowserOptions.getCurrentProfile().isSupervised; |
| }, |
| |
| /** @override */ |
| initializePage: function() { |
| Page.prototype.initializePage.call(this); |
| |
| var supervisedUserList = $('supervised-user-list'); |
| options.supervisedUserOptions.SupervisedUserList.decorate( |
| supervisedUserList); |
| |
| var avatarGrid = $('select-avatar-grid'); |
| options.ProfilesIconGrid.decorate(avatarGrid); |
| var avatarIcons = loadTimeData.getValue('avatarIcons'); |
| avatarGrid.dataModel = new ArrayDataModel(avatarIcons); |
| |
| supervisedUserList.addEventListener('change', function(event) { |
| var supervisedUser = supervisedUserList.selectedItem; |
| if (!supervisedUser) |
| return; |
| |
| $('supervised-user-import-ok').disabled = |
| supervisedUserList.selectedItem.onCurrentDevice; |
| }); |
| |
| var self = this; |
| $('supervised-user-import-cancel').onclick = function(event) { |
| if (self.inProgress_) { |
| self.updateImportInProgress_(false); |
| |
| // 'cancelCreateProfile' is handled by CreateProfileHandler. |
| chrome.send('cancelCreateProfile'); |
| } |
| PageManager.closeOverlay(); |
| }; |
| |
| $('supervised-user-import-ok').onclick = |
| this.showAvatarGridOrSubmit_.bind(this); |
| $('supervised-user-select-avatar-ok').onclick = |
| this.showAvatarGridOrSubmit_.bind(this); |
| }, |
| |
| /** |
| * @override |
| */ |
| didShowPage: function() { |
| // When the import link is clicked to open this overlay, it is hidden in |
| // order to trigger a cursor update. We can show the import link again |
| // now. TODO(akuegel): Remove this temporary fix when crbug/246304 is |
| // resolved. |
| $('import-existing-supervised-user-link').hidden = false; |
| |
| options.SupervisedUserListData.requestExistingSupervisedUsers().then( |
| this.receiveExistingSupervisedUsers_, this.onSigninError_.bind(this)); |
| options.SupervisedUserListData.addObserver(this); |
| |
| this.updateImportInProgress_(false); |
| $('supervised-user-import-error-bubble').hidden = true; |
| $('supervised-user-import-ok').disabled = true; |
| this.showAppropriateElements_(/* isSelectAvatarMode */ false); |
| }, |
| |
| /** |
| * @override |
| */ |
| didClosePage: function() { |
| options.SupervisedUserListData.removeObserver(this); |
| }, |
| |
| /** |
| * Shows either the supervised user import dom elements or the select avatar |
| * dom elements. |
| * @param {boolean} isSelectAvatarMode True if the overlay should show the |
| * select avatar grid, and false if the overlay should show the |
| * supervised user list. |
| * @private |
| */ |
| showAppropriateElements_: function(isSelectAvatarMode) { |
| var avatarElements = |
| this.pageDiv.querySelectorAll('.supervised-user-select-avatar'); |
| for (var i = 0; i < avatarElements.length; i++) |
| avatarElements[i].hidden = !isSelectAvatarMode; |
| var importElements = |
| this.pageDiv.querySelectorAll('.supervised-user-import'); |
| for (var i = 0; i < importElements.length; i++) |
| importElements[i].hidden = isSelectAvatarMode; |
| }, |
| |
| /** |
| * Called when the user clicks the "OK" button. In case the supervised |
| * user being imported has no avatar in sync, it shows the avatar |
| * icon grid. In case the avatar grid is visible or the supervised user |
| * already has an avatar stored in sync, it proceeds with importing |
| * the supervised user. |
| * @private |
| */ |
| showAvatarGridOrSubmit_: function() { |
| var supervisedUser = $('supervised-user-list').selectedItem; |
| if (!supervisedUser) |
| return; |
| |
| $('supervised-user-import-error-bubble').hidden = true; |
| |
| if ($('select-avatar-grid').hidden && supervisedUser.needAvatar) { |
| this.showAvatarGridHelper_(); |
| return; |
| } |
| |
| var avatarUrl = supervisedUser.needAvatar ? |
| $('select-avatar-grid').selectedItem : supervisedUser.iconURL; |
| |
| this.updateImportInProgress_(true); |
| |
| // 'createProfile' is handled by CreateProfileHandler. |
| chrome.send('createProfile', [supervisedUser.name, avatarUrl, |
| false, true, supervisedUser.id]); |
| }, |
| |
| /** |
| * Hides the 'supervised user list' and shows the avatar grid instead. |
| * It also updates the overlay text and title to instruct the user |
| * to choose an avatar for the supervised user. |
| * @private |
| */ |
| showAvatarGridHelper_: function() { |
| this.showAppropriateElements_(/* isSelectAvatarMode */ true); |
| $('select-avatar-grid').redraw(); |
| $('select-avatar-grid').selectedItem = |
| loadTimeData.getValue('avatarIcons')[0]; |
| }, |
| |
| /** |
| * Updates the UI according to the importing state. |
| * @param {boolean} inProgress True to indicate that |
| * importing is in progress and false otherwise. |
| * @private |
| */ |
| updateImportInProgress_: function(inProgress) { |
| this.inProgress_ = inProgress; |
| $('supervised-user-import-ok').disabled = inProgress; |
| $('supervised-user-select-avatar-ok').disabled = inProgress; |
| $('supervised-user-list').disabled = inProgress; |
| $('select-avatar-grid').disabled = inProgress; |
| $('supervised-user-import-throbber').hidden = !inProgress; |
| }, |
| |
| /** |
| * Sets the data model of the supervised user list to |supervisedUsers|. |
| * @param {Array.<Object>} supervisedUsers Array of supervised user objects. |
| * Each object is of the form: |
| * supervisedUser = { |
| * id: "Supervised User ID", |
| * name: "Supervised User Name", |
| * iconURL: "chrome://path/to/icon/image", |
| * onCurrentDevice: true or false, |
| * needAvatar: true or false |
| * } |
| * @private |
| */ |
| receiveExistingSupervisedUsers_: function(supervisedUsers) { |
| supervisedUsers.sort(function(a, b) { |
| if (a.onCurrentDevice != b.onCurrentDevice) |
| return a.onCurrentDevice ? 1 : -1; |
| return a.name.localeCompare(b.name); |
| }); |
| |
| $('supervised-user-list').dataModel = new ArrayDataModel(supervisedUsers); |
| if (supervisedUsers.length == 0) { |
| this.onError_(loadTimeData.getString('noExistingSupervisedUsers')); |
| $('supervised-user-import-ok').disabled = true; |
| } else { |
| // Hide the error bubble. |
| $('supervised-user-import-error-bubble').hidden = true; |
| } |
| }, |
| |
| onSigninError_: function() { |
| $('supervised-user-list').dataModel = null; |
| this.onError_(loadTimeData.getString('supervisedUserImportSigninError')); |
| }, |
| |
| /** |
| * Displays an error message if an error occurs while |
| * importing a supervised user. |
| * Called by BrowserOptions via the BrowserOptionsHandler. |
| * @param {string} error The error message to display. |
| * @private |
| */ |
| onError_: function(error) { |
| var errorBubble = $('supervised-user-import-error-bubble'); |
| errorBubble.hidden = false; |
| errorBubble.textContent = error; |
| this.updateImportInProgress_(false); |
| }, |
| |
| /** |
| * Closes the overlay if importing the supervised user was successful. Also |
| * reset the cached list of supervised users in order to get an updated list |
| * when the overlay is reopened. |
| * @private |
| */ |
| onSuccess_: function() { |
| this.updateImportInProgress_(false); |
| options.SupervisedUserListData.resetPromise(); |
| PageManager.closeAllOverlays(); |
| }, |
| }; |
| |
| // Forward public APIs to private implementations. |
| [ |
| 'onSuccess', |
| ].forEach(function(name) { |
| SupervisedUserImportOverlay[name] = function() { |
| var instance = SupervisedUserImportOverlay.getInstance(); |
| return instance[name + '_'].apply(instance, arguments); |
| }; |
| }); |
| |
| // Export |
| return { |
| SupervisedUserImportOverlay: SupervisedUserImportOverlay, |
| }; |
| }); |