Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7271)

Unified Diff: chrome/browser/resources/settings/passwords_and_forms_page/address_edit_dialog.js

Issue 2079853002: Add Edit/Create Address Dialog to MD Settings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: spacing and rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..dc194c44ee1e11f87460824b16a90f5a692ce164
--- /dev/null
+++ b/chrome/browser/resources/settings/passwords_and_forms_page/address_edit_dialog.js
@@ -0,0 +1,409 @@
+// 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',
+
+ properties: {
+ /**
+ * @type {!chrome.autofillPrivate.AddressEntry}
+ * @private
+ */
+ address_: Object,
+
+ /** @private */
+ title_: String,
+
+ /**
+ * @type {!Array<!chrome.autofillPrivate.CountryEntry>}
+ * @private
+ */
+ countries_: Array,
+
+ /**
+ * @type {string|undefined}
+ * @private
+ */
+ countryCode_: {
+ type: String,
+ observer: 'onUpdateCountryCode_',
+ },
+
+ /**
+ * @type {!settings.AddressEditDialog.AddressWrapper}
+ * @private
+ */
+ addressWrapper_: Object,
+
+ /** @private */
+ phoneNumber_: {
+ type: String,
+ observer: 'onUpdatePhoneNumber_',
+ },
+
+ /** @private */
+ email_: {
+ type: String,
+ observer: 'onUpdateEmail_',
+ },
+
+ /** @private */
+ canSave_: Boolean,
+ },
+
+ behaviors: [
+ I18nBehavior,
+ ],
+
+ /** @override */
+ ready: function() {
+ this.countryInfo =
+ settings.AddressEditDialog.CountryInformationHelperImpl.getInstance();
+
+ this.countryInfo.getCountryList(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;
+
+ 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.AddressEditDialog.AddressSetting} setting
+ * @return {string}
+ */
+ long_: function(setting) {
+ return setting.isLongField ? 'long' : '';
+ },
+
+ /**
+ * Updates the wrapper that represents this address in the country's format.
+ * @private
+ */
+ updateAddressWrapper_: function() {
+ var self = this;
+ // Preserve the values when switching countries.
+ if (self.addressWrapper_)
+ self.addressWrapper_.writeToAddress();
+
+ // Default to the last country used if no country code is provided.
+ var countryCode = self.countryCode_ || self.countries_[0].countryCode;
+ self.countryInfo.getAddressFormat(countryCode, function(format) {
+ self.addressWrapper_ = settings.AddressEditDialog.AddressWrapper.create(
+ self.address_, format);
+ // 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() {
+ this.addressWrapper_.writeToAddress();
+
+ // 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} 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.AddressEditDialog', function() {
+ /**
+ * Creates a wrapper against a single data member for an address.
+ * @param {!chrome.autofillPrivate.AddressEntry} address
+ * @param {!chrome.autofillPrivate.AddressComponent} piece
+ * @constructor
+ */
+ function AddressSetting(address, piece) {
+ this.name = piece.fieldName;
+ this.isLongField = piece.isLongField;
+ this.value = AddressSetting.getValue_(address, piece.field);
+ this.setValue = AddressSetting.getSetter_(address, piece.field);
+ this.isTextArea =
+ piece.field == chrome.autofillPrivate.AddressField.ADDRESS_LINES;
+ }
+
+ AddressSetting.prototype = {
+ writeToAddress: function() {
+ this.setValue(this.value || '');
+ },
+ };
+
+ /**
+ * Gets the |field| value from the address.
+ * @param {!chrome.autofillPrivate.AddressEntry} address
+ * @param {string} field
+ * @return {string|undefined}
+ * @private
+ */
+ AddressSetting.getValue_ = function(address, field) {
+ switch (field) {
+ case chrome.autofillPrivate.AddressField.FULL_NAME:
+ 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:
+ return undefined;
+ }
+ };
+
+ /**
+ * Gets a setter for the |field| value from the address.
+ * @param {!chrome.autofillPrivate.AddressEntry} address
+ * @param {string} field
+ * @return {function(string):void|undefined}
+ * @private
+ */
+ AddressSetting.getSetter_ = function(address, field) {
+ switch (field) {
+ case chrome.autofillPrivate.AddressField.FULL_NAME:
+ return function(value) {
+ address.fullNames = address.fullNames || [];
+ address.fullNames[0] = value;
+ };
+ case chrome.autofillPrivate.AddressField.COMPANY_NAME:
+ return function(value) { address.companyName = value; };
+ case chrome.autofillPrivate.AddressField.ADDRESS_LINES:
+ return function(value) { address.addressLines = value; };
+ case chrome.autofillPrivate.AddressField.ADDRESS_LEVEL_1:
+ return function(value) { address.addressLevel1 = value; };
+ case chrome.autofillPrivate.AddressField.ADDRESS_LEVEL_2:
+ return function(value) { address.addressLevel2 = value; };
+ case chrome.autofillPrivate.AddressField.ADDRESS_LEVEL_3:
+ return function(value) { address.addressLevel3 = value; };
+ case chrome.autofillPrivate.AddressField.POSTAL_CODE:
+ return function(value) { address.postalCode = value; };
+ case chrome.autofillPrivate.AddressField.SORTING_CODE:
+ return function(value) { address.sortingCode = value; };
+ case chrome.autofillPrivate.AddressField.COUNTRY_CODE:
+ return function(value) { address.countryCode = value; };
+ default:
+ return undefined;
+ }
+ };
+
+ /** @constructor */
+ function AddressRow() {
+ /** @type {!Array<!settings.AddressEditDialog.AddressSetting>} */
+ this.settings = [];
+ }
+
+ AddressRow.prototype = {
+ writeToAddress: function() {
+ this.settings.forEach(function(setting) {
+ setting.writeToAddress();
+ });
+ },
+ };
+
+ /** @constructor */
+ function AddressWrapper() {
+ /** @type {!Array<!settings.AddressEditDialog.AddressRow>} */
+ this.rows = [];
+ }
+
+ AddressWrapper.prototype = {
+ writeToAddress: function() {
+ this.rows.forEach(function(row) {
+ row.writeToAddress();
+ });
+ },
+ };
+
+ AddressWrapper.create = function(address, format) {
+ var wrapper = new AddressWrapper();
+
+ format.components.forEach(function(component) {
+ var row = new AddressRow();
+ wrapper.rows.push(row);
+
+ component.row.forEach(function(piece) {
+ row.settings.push(new AddressSetting(address, piece));
+ });
+ });
+
+ return wrapper;
+ };
+
+ /** @interface */
+ function CountryInformationHelper() {}
+ CountryInformationHelper.prototype = {
+ /**
+ * Gets the list of available countries with their country code. List should
+ * have a space between the default country and an alphabetized list of
+ * countries. Country names should be internationalized.
+ * @param {function(!Array<!chrome.autofillPrivate.CountryEntry>)} callback
+ */
+ getCountryList: assertNotReached,
+
+ /**
+ * Gets the address format for a given country code.
+ * @param {string} countryCode
+ * @param {function(!chrome.autofillPrivate.AddressComponents)} callback
+ */
+ getAddressFormat: assertNotReached,
+ };
+
+ /**
+ * Default implementation. Override for testing.
+ * @implements {settings.AddressEditDialog.CountryInformationHelper}
+ * @constructor
+ */
+ function CountryInformationHelperImpl() {}
+ cr.addSingletonGetter(CountryInformationHelperImpl);
+ CountryInformationHelperImpl.prototype = {
+ __proto__: CountryInformationHelper,
+
+ /** @override */
+ getCountryList: function(callback) {
+ chrome.autofillPrivate.getCountryList(callback);
+ },
+
+ /** @override */
+ getAddressFormat: function(countryCode, callback) {
+ chrome.autofillPrivate.getAddressComponents(countryCode || '', callback);
+ },
+ };
+
+ return {
+ AddressSetting: AddressSetting,
+ AddressRow: AddressRow,
+ AddressWrapper: AddressWrapper,
+ CountryInformationHelper: CountryInformationHelper,
+ CountryInformationHelperImpl: CountryInformationHelperImpl,
+ };
+});

Powered by Google App Engine
This is Rietveld 408576698