Index: chrome/browser/resources/settings/passwords_and_forms_page/address_edit_dialog.js |
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/address_edit_dialog.js b/chrome/browser/resources/settings/passwords_and_forms_page/address_edit_dialog.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..94556a785cec233c14261e9530d7ebc675205eef |
--- /dev/null |
+++ b/chrome/browser/resources/settings/passwords_and_forms_page/address_edit_dialog.js |
@@ -0,0 +1,373 @@ |
+// Copyright 2016 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. |
+ |
+/** |
+ * @fileoverview 'password-edit-dialog' is the dialog that allows showing a |
+ * saved password. |
+ */ |
+(function() { |
+'use strict'; |
+ |
+Polymer({ |
+ is: 'settings-address-edit-dialog', |
+ |
+ behaviors: [ |
+ I18nBehavior, |
+ ], |
+ |
+ properties: { |
+ /** @private {!chrome.autofillPrivate.AddressEntry} */ |
+ address_: Object, |
+ |
+ /** @private */ |
+ title_: String, |
+ |
+ /** @private {!Array<!chrome.autofillPrivate.CountryEntry>} */ |
+ countries_: Array, |
+ |
+ /** @private {string|undefined} */ |
+ countryCode_: { |
+ type: String, |
+ observer: 'onUpdateCountryCode_', |
+ }, |
+ |
+ /** @private {!Array<!Array<!settings.address.AddressComponentUI>>} */ |
+ addressWrapper_: Object, |
+ |
+ /** @private */ |
+ phoneNumber_: { |
+ type: String, |
+ observer: 'onUpdatePhoneNumber_', |
+ }, |
+ |
+ /** @private */ |
+ email_: { |
+ type: String, |
+ observer: 'onUpdateEmail_', |
+ }, |
+ |
+ /** @private */ |
+ canSave_: Boolean, |
+ }, |
+ |
+ /** @override */ |
+ ready: function() { |
+ this.countryInfo = |
+ settings.address.CountryDetailManagerImpl.getInstance(); |
+ |
+ this.countryInfo.getCountryList().then(function(countryList) { |
+ this.countries_ = countryList; |
+ }.bind(this)); |
+ }, |
+ |
+ /** |
+ * Opens the dialog to edit |address| |
+ * @param {!chrome.autofillPrivate.AddressEntry} address |
+ */ |
+ open: function(address) { |
+ this.title_ = |
+ this.i18n(address.guid ? 'editAddressTitle' : 'addAddressTitle'); |
+ this.address_ = address; |
+ |
+ // |phoneNumbers| and |emailAddresses| are a single item array. |
+ // See crbug.com/497934 for details. |
+ this.phoneNumber_ = address.phoneNumbers ? address.phoneNumbers[0] : ''; |
+ this.email_ = address.emailAddresses ? address.emailAddresses[0] : ''; |
+ |
+ if (this.countryCode_ == address.countryCode) |
+ this.updateAddressWrapper_(); |
+ else |
+ this.countryCode_ = address.countryCode; // Updates the address wrapper. |
+ |
+ // Open is called on the dialog after the address wrapper has been updated. |
+ }, |
+ |
+ /** |
+ * Returns a class to denote how long this entry is. |
+ * @param {settings.address.AddressComponentUI} setting |
+ * @return {string} |
+ */ |
+ long_: function(setting) { |
+ return setting.component.isLongField ? 'long' : ''; |
+ }, |
+ |
+ /** |
+ * Updates the wrapper that represents this address in the country's format. |
+ * @private |
+ */ |
+ updateAddressWrapper_: function() { |
+ var self = this; |
+ |
+ // Default to the last country used if no country code is provided. |
+ var countryCode = self.countryCode_ || self.countries_[0].countryCode; |
+ self.countryInfo.getAddressFormat(countryCode).then(function(format) { |
+ /** @type {!Array<!Array<!settings.address.AddressComponentUI>>} */ |
+ var wrapper = []; |
+ format.components.forEach(function(component) { |
+ /** @type {!Array<!settings.address.AddressComponentUI>} */ |
+ var components = []; |
+ wrapper.push(components); |
+ |
+ component.row.forEach(function(component) { |
+ components.push(new settings.address.AddressComponentUI( |
+ self.address_, component)); |
+ }); |
+ }); |
+ self.addressWrapper_ = wrapper; |
+ |
+ // Flush dom before resize and savability updates. |
+ Polymer.dom.flush(); |
+ |
+/** |
+ * TODO(hcarmona): Fix closure compiler to better understand |SettingsDialog|. |
+ * @suppress {missingProperties} |
+ */ |
+(function() { |
+ self.$.dialog.notifyResize(); |
+ |
+ self.updateCanSave_(); |
+ |
+ self.fire('on-update-address-wrapper'); // For easier testing. |
+ |
+ if (!self.$.dialog.opened) |
+ self.$.dialog.open(); |
+})(); |
+ }); |
+ }, |
+ |
+ updateCanSave_: function() { |
+ var inputs = this.$.dialog.querySelectorAll('.address-column'); |
+ |
+ for (var i = 0; i < inputs.length; ++i) { |
+ if (inputs[i].value) { |
+ this.canSave_ = true; |
+ this.fire('on-update-can-save'); // For easier testing. |
+ return; |
+ } |
+ } |
+ |
+ this.canSave_ = false; |
+ this.fire('on-update-can-save'); // For easier testing. |
+ }, |
+ |
+ /** |
+ * @param {!chrome.autofillPrivate.CountryEntry} country |
+ * @return {string} |
+ * @private |
+ */ |
+ getCode_: function(country) { |
+ return country.countryCode || 'SPACER'; |
+ }, |
+ |
+ /** |
+ * @param {!chrome.autofillPrivate.CountryEntry} country |
+ * @return {string} |
+ * @private |
+ */ |
+ getName_: function(country) { |
+ return country.name || '------'; |
+ }, |
+ |
+ /** |
+ * @param {!chrome.autofillPrivate.CountryEntry} country |
+ * @return {boolean} |
+ * @private |
+ */ |
+ isDivision_: function(country) { |
+ return !country.countryCode; |
+ }, |
+ |
+ /** |
+ * Handler for tapping the save button. |
+ * @private |
+ */ |
+ onSaveButtonTap_: function() { |
+ // Set a default country if none is set. |
+ if (!this.address_.countryCode) |
+ this.address_.countryCode = this.countries_[0].countryCode; |
+ |
+ this.fire('save-address', this.address_); |
+ this.$.dialog.close(); |
+ }, |
+ |
+ /** |
+ * Syncs the country code back to the address and rebuilds the address wrapper |
+ * for the new location. |
+ * @param {string|undefined} countryCode |
+ * @private |
+ */ |
+ onUpdateCountryCode_: function(countryCode) { |
+ this.address_.countryCode = countryCode; |
+ this.updateAddressWrapper_(); |
+ }, |
+ |
+ /** |
+ * Syncs the phone number back to the address. An address can have only one |
+ * phone number. Variants are deprecated. |
+ * @param {string} phoneNumber |
+ */ |
+ onUpdatePhoneNumber_: function(phoneNumber) { |
+ if (this.address_) |
+ this.address_.phoneNumbers = [phoneNumber]; |
+ }, |
+ |
+ /** |
+ * Syncs the email back to the address. An address can have only one email. |
+ * Variants are deprecated. |
+ * @param {string} email |
+ */ |
+ onUpdateEmail_: function(email) { |
+ if (this.address_) |
+ this.address_.emailAddresses = [email]; |
+ }, |
+}); |
+})(); |
+ |
+cr.define('settings.address', function() { |
+ /** |
+ * Creates a wrapper against a single data member for an address. |
+ * @param {!chrome.autofillPrivate.AddressEntry} address |
+ * @param {!chrome.autofillPrivate.AddressComponent} component |
+ * @constructor |
+ */ |
+ function AddressComponentUI(address, component) { |
+ Object.defineProperty(this, 'value', { |
+ get: function() { |
+ return this.getValue_(); |
+ }, |
+ set: function(newValue) { |
+ this.setValue_(newValue); |
+ }, |
+ }); |
+ this.address_ = address; |
+ this.component = component; |
+ this.isTextArea = |
+ component.field == chrome.autofillPrivate.AddressField.ADDRESS_LINES; |
+ } |
+ |
+ AddressComponentUI.prototype = { |
+ /** |
+ * Gets the value from the address that's associated with this component. |
+ * @return {string|undefined} |
+ * @private |
+ */ |
+ getValue_: function() { |
+ var address = this.address_; |
+ switch (this.component.field) { |
+ case chrome.autofillPrivate.AddressField.FULL_NAME: |
+ // |fullNames| is a single item array. See crbug.com/497934 for |
+ // details. |
+ return address.fullNames ? address.fullNames[0] : undefined; |
+ case chrome.autofillPrivate.AddressField.COMPANY_NAME: |
+ return address.companyName; |
+ case chrome.autofillPrivate.AddressField.ADDRESS_LINES: |
+ return address.addressLines; |
+ case chrome.autofillPrivate.AddressField.ADDRESS_LEVEL_1: |
+ return address.addressLevel1; |
+ case chrome.autofillPrivate.AddressField.ADDRESS_LEVEL_2: |
+ return address.addressLevel2; |
+ case chrome.autofillPrivate.AddressField.ADDRESS_LEVEL_3: |
+ return address.addressLevel3; |
+ case chrome.autofillPrivate.AddressField.POSTAL_CODE: |
+ return address.postalCode; |
+ case chrome.autofillPrivate.AddressField.SORTING_CODE: |
+ return address.sortingCode; |
+ case chrome.autofillPrivate.AddressField.COUNTRY_CODE: |
+ return address.countryCode; |
+ default: |
+ assertNotReached(); |
+ } |
+ }, |
+ |
+ /** |
+ * Sets the value in the address that's associated with this component. |
+ * @param {string} value |
+ * @private |
+ */ |
+ setValue_: function(value) { |
+ var address = this.address_; |
+ switch (this.component.field) { |
+ case chrome.autofillPrivate.AddressField.FULL_NAME: |
+ address.fullNames = [value]; |
+ break; |
+ case chrome.autofillPrivate.AddressField.COMPANY_NAME: |
+ address.companyName = value; |
+ break; |
+ case chrome.autofillPrivate.AddressField.ADDRESS_LINES: |
+ address.addressLines = value; |
+ break; |
+ case chrome.autofillPrivate.AddressField.ADDRESS_LEVEL_1: |
+ address.addressLevel1 = value; |
+ break; |
+ case chrome.autofillPrivate.AddressField.ADDRESS_LEVEL_2: |
+ address.addressLevel2 = value; |
+ break; |
+ case chrome.autofillPrivate.AddressField.ADDRESS_LEVEL_3: |
+ address.addressLevel3 = value; |
+ break; |
+ case chrome.autofillPrivate.AddressField.POSTAL_CODE: |
+ address.postalCode = value; |
+ break; |
+ case chrome.autofillPrivate.AddressField.SORTING_CODE: |
+ address.sortingCode = value; |
+ break; |
+ case chrome.autofillPrivate.AddressField.COUNTRY_CODE: |
+ address.countryCode = value; |
+ break; |
+ default: |
+ assertNotReached(); |
+ } |
+ }, |
+ }; |
+ |
+ /** @interface */ |
+ function CountryDetailManager() {} |
+ CountryDetailManager.prototype = { |
+ /** |
+ * Gets the list of available countries. |
+ * The default country will be first, followed by a separator, followed by |
+ * an alphabetized list of countries available. |
+ * @return {!Promise<!Array<!chrome.autofillPrivate.CountryEntry>>} |
+ */ |
+ getCountryList: assertNotReached, |
+ |
+ /** |
+ * Gets the address format for a given country code. |
+ * @param {string} countryCode |
+ * @return {!Promise<!chrome.autofillPrivate.AddressComponents>} |
+ */ |
+ getAddressFormat: assertNotReached, |
+ }; |
+ |
+ /** |
+ * Default implementation. Override for testing. |
+ * @implements {settings.address.CountryDetailManager} |
+ * @constructor |
+ */ |
+ function CountryDetailManagerImpl() {} |
+ cr.addSingletonGetter(CountryDetailManagerImpl); |
+ CountryDetailManagerImpl.prototype = { |
+ __proto__: CountryDetailManager, |
+ |
+ /** @override */ |
+ getCountryList: function() { |
+ return new Promise(function(callback) { |
+ chrome.autofillPrivate.getCountryList(callback); |
+ }); |
+ }, |
+ |
+ /** @override */ |
+ getAddressFormat: function(countryCode) { |
+ return new Promise(function(callback) { |
+ chrome.autofillPrivate.getAddressComponents(countryCode, callback); |
+ }); |
+ }, |
+ }; |
+ |
+ return { |
+ AddressComponentUI: AddressComponentUI, |
+ CountryDetailManager: CountryDetailManager, |
+ CountryDetailManagerImpl: CountryDetailManagerImpl, |
+ }; |
+}); |