summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/resources/settings/autofill_page/address_edit_dialog.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/resources/settings/autofill_page/address_edit_dialog.js')
-rw-r--r--chromium/chrome/browser/resources/settings/autofill_page/address_edit_dialog.js341
1 files changed, 341 insertions, 0 deletions
diff --git a/chromium/chrome/browser/resources/settings/autofill_page/address_edit_dialog.js b/chromium/chrome/browser/resources/settings/autofill_page/address_edit_dialog.js
new file mode 100644
index 00000000000..1ec36ce4685
--- /dev/null
+++ b/chromium/chrome/browser/resources/settings/autofill_page/address_edit_dialog.js
@@ -0,0 +1,341 @@
+// 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: {
+ /** @type {chrome.autofillPrivate.AddressEntry} */
+ address: Object,
+
+ /** @private */
+ title_: String,
+
+ /** @private {!Array<!chrome.autofillPrivate.CountryEntry>} */
+ countries_: Array,
+
+ /**
+ * Updates the address wrapper.
+ * @private {string|undefined}
+ */
+ countryCode_: {
+ type: String,
+ observer: 'onUpdateCountryCode_',
+ },
+
+ /** @private {!Array<!Array<!settings.address.AddressComponentUI>>} */
+ addressWrapper_: Object,
+
+ /** @private */
+ phoneNumber_: String,
+
+ /** @private */
+ email_: String,
+
+ /** @private */
+ canSave_: Boolean,
+ },
+
+ /** @override */
+ attached: function() {
+ this.countryInfo = settings.address.CountryDetailManagerImpl.getInstance();
+ this.countryInfo.getCountryList().then(countryList => {
+ this.countries_ = countryList;
+
+ this.title_ =
+ this.i18n(this.address.guid ? 'editAddressTitle' : 'addAddressTitle');
+
+ // |phoneNumbers| and |emailAddresses| are a single item array.
+ // See crbug.com/497934 for details.
+ this.phoneNumber_ =
+ this.address.phoneNumbers ? this.address.phoneNumbers[0] : '';
+ this.email_ =
+ this.address.emailAddresses ? this.address.emailAddresses[0] : '';
+
+ this.async(() => {
+ if (this.countryCode_ == this.address.countryCode)
+ this.updateAddressWrapper_();
+ else
+ this.countryCode_ = this.address.countryCode;
+ });
+ });
+
+ // 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() {
+ // Default to the last country used if no country code is provided.
+ const countryCode = this.countryCode_ || this.countries_[0].countryCode;
+ this.countryInfo.getAddressFormat(countryCode).then(format => {
+ this.addressWrapper_ = format.components.map(
+ component => component.row.map(
+ c => new settings.address.AddressComponentUI(this.address, c)));
+
+ // Flush dom before resize and savability updates.
+ Polymer.dom.flush();
+
+ this.updateCanSave_();
+
+ this.fire('on-update-address-wrapper'); // For easier testing.
+
+ const dialog = /** @type {HTMLDialogElement} */ (this.$.dialog);
+ if (!dialog.open)
+ dialog.showModal();
+ });
+ },
+
+ updateCanSave_: function() {
+ const inputs = this.$.dialog.querySelectorAll('.address-column, select');
+
+ for (let 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;
+ },
+
+ /** @private */
+ onCancelTap_: function() {
+ this.$.dialog.cancel();
+ },
+
+ /**
+ * Handler for tapping the save button.
+ * @private
+ */
+ onSaveButtonTap_: function() {
+ // The Enter key can call this function even if the button is disabled.
+ if (!this.canSave_)
+ return;
+
+ // Set a default country if none is set.
+ if (!this.address.countryCode)
+ this.address.countryCode = this.countries_[0].countryCode;
+
+ this.address.phoneNumbers = this.phoneNumber_ ? [this.phoneNumber_] : [];
+ this.address.emailAddresses = this.email_ ? [this.email_] : [];
+
+ 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_();
+ },
+
+ /** @private */
+ onCountryChange_: function() {
+ const countrySelect = /** @type {!HTMLSelectElement} */ (this.$$('select'));
+ this.countryCode_ = countrySelect.value;
+ },
+});
+})();
+
+cr.define('settings.address', function() {
+ /**
+ * Creates a wrapper against a single data member for an address.
+ */
+ class AddressComponentUI {
+ /**
+ * @param {!chrome.autofillPrivate.AddressEntry} address
+ * @param {!chrome.autofillPrivate.AddressComponent} component
+ */
+ constructor(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;
+ }
+
+ /**
+ * Gets the value from the address that's associated with this component.
+ * @return {string|undefined}
+ * @private
+ */
+ getValue_() {
+ const 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_(value) {
+ const 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 */
+ class CountryDetailManager {
+ /**
+ * 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() {}
+
+ /**
+ * Gets the address format for a given country code.
+ * @param {string} countryCode
+ * @return {!Promise<!chrome.autofillPrivate.AddressComponents>}
+ */
+ getAddressFormat(countryCode) {}
+ }
+
+ /**
+ * Default implementation. Override for testing.
+ * @implements {settings.address.CountryDetailManager}
+ */
+ class CountryDetailManagerImpl {
+ /** @override */
+ getCountryList() {
+ return new Promise(function(callback) {
+ chrome.autofillPrivate.getCountryList(callback);
+ });
+ }
+
+ /** @override */
+ getAddressFormat(countryCode) {
+ return new Promise(function(callback) {
+ chrome.autofillPrivate.getAddressComponents(countryCode, callback);
+ });
+ }
+ }
+
+ cr.addSingletonGetter(CountryDetailManagerImpl);
+
+ return {
+ AddressComponentUI: AddressComponentUI,
+ CountryDetailManager: CountryDetailManager,
+ CountryDetailManagerImpl: CountryDetailManagerImpl,
+ };
+});