From 9bb82a1d0d30c144b6dd17d4f33c91fc61f0c758 Mon Sep 17 00:00:00 2001
From: Stanislav Idolov <sidolov@ebay.com>
Date: Wed, 1 Jul 2015 18:12:59 +0300
Subject: [PATCH] MAGETWO-39446: "Place Order" button should be disabled until
 billing address is set

---
 .../view/frontend/web/js/view/billing-address.js   | 14 +++++++++++++-
 .../view/frontend/web/js/view/payment/default.js   |  6 ++++++
 .../web/template/payment/banktransfer.html         |  7 ++++++-
 .../web/template/payment/cashondelivery.html       |  7 ++++++-
 .../frontend/web/template/payment/checkmo.html     |  7 ++++++-
 .../web/template/payment/purchaseorder-form.html   |  7 ++++++-
 .../view/frontend/web/template/payment/free.html   |  6 +++++-
 .../view/frontend/web/template/payment/iframe.html |  4 +++-
 8 files changed, 51 insertions(+), 7 deletions(-)

diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js b/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js
index 2ca86001d72..5f6dbfed0b8 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js
@@ -18,7 +18,8 @@ define(
     function (ko, Component, customer, addressList, quote, createBillingAddress, selectBillingAddress, $t) {
         "use strict";
 
-        var newAddressOption = {
+        var lastSelectedBillingAddress = null,
+            newAddressOption = {
             getAddressInline: function() {
                 return $t('New Address');
             },
@@ -71,6 +72,8 @@ define(
                     selectBillingAddress(quote.shippingAddress());
                     this.isAddressDetailsVisible(true);
                 } else {
+                    lastSelectedBillingAddress = quote.billingAddress();
+                    quote.billingAddress(null);
                     this.isAddressDetailsVisible(false);
                 }
                 return true;
@@ -97,10 +100,13 @@ define(
             },
 
             editAddress: function () {
+                lastSelectedBillingAddress = quote.billingAddress();
+                quote.billingAddress(null);
                 this.isAddressDetailsVisible(false);
             },
 
             cancelAddressEdit: function () {
+                this.restoreBillingAddress();
                 if (quote.billingAddress()) {
                     // restore 'Same As Shipping' checkbox state
                     this.isAddressSameAsShipping(
@@ -110,6 +116,12 @@ define(
                 }
             },
 
+            restoreBillingAddress: function() {
+                if (lastSelectedBillingAddress != null) {
+                    selectBillingAddress(lastSelectedBillingAddress);
+                }
+            },
+
             onAddressChange: function (address) {
                 this.isAddressFormVisible(address == newAddressOption);
             }
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/payment/default.js b/app/code/Magento/Checkout/view/frontend/web/js/view/payment/default.js
index 7fa9e10b69a..1734a79d09f 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/payment/default.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/payment/default.js
@@ -17,6 +17,7 @@ define(
         'use strict';
         return Component.extend({
             redirectAfterPlaceOrder: true,
+            isPlaceOrderActionAllowed: ko.observable(true),
             /**
              * Initialize view.
              *
@@ -24,6 +25,11 @@ define(
              */
             initialize: function () {
                 this._super().initChildren();
+
+                quote.billingAddress.subscribe(function(address) {
+                    this.isPlaceOrderActionAllowed((address !== null));
+                }, this);
+
                 return this;
             },
 
diff --git a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/banktransfer.html b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/banktransfer.html
index dfcbf313197..66cf873c311 100644
--- a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/banktransfer.html
+++ b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/banktransfer.html
@@ -29,7 +29,12 @@
             <div class="primary">
                 <button class="action primary checkout"
                         type="submit"
-                        data-bind="click: placeOrder, attr: {'title': $t('Place Order')}, enable: (getCode() == isChecked())"
+                        data-bind="
+                        click: placeOrder,
+                        attr: {'title': $t('Place Order')},
+                        enable: (getCode() == isChecked()),
+                        css: {disabled: !isPlaceOrderActionAllowed()}
+                        "
                         disabled>
                     <span data-bind="text: $t('Place Order')"></span>
                 </button>
diff --git a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/cashondelivery.html b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/cashondelivery.html
index 569d5b0a48e..10287d8090d 100644
--- a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/cashondelivery.html
+++ b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/cashondelivery.html
@@ -29,7 +29,12 @@
             <div class="primary">
                 <button class="action primary checkout"
                         type="submit"
-                        data-bind="click: placeOrder, attr: {title: $t('Place Order')}, enable: (getCode() == isChecked())"
+                        data-bind="
+                        click: placeOrder,
+                        attr: {title: $t('Place Order')},
+                        enable: (getCode() == isChecked()),
+                        css: {disabled: !isPlaceOrderActionAllowed()}
+                        "
                         disabled>
                     <span data-bind="text: $t('Place Order')"></span>
                 </button>
diff --git a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html
index 58f85845434..ba6c374417b 100644
--- a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html
+++ b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html
@@ -41,7 +41,12 @@
             <div class="primary">
                 <button class="action primary checkout"
                         type="submit"
-                        data-bind="click: placeOrder, attr: {title: $t('Place Order')}, enable: (getCode() == isChecked())"
+                        data-bind="
+                        click: placeOrder,
+                        attr: {title: $t('Place Order')},
+                        css: {disabled: !isPlaceOrderActionAllowed()},
+                        enable: (getCode() == isChecked())
+                        "
                         disabled>
                     <span data-bind="text: $t('Place Order')"></span>
                 </button>
diff --git a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/purchaseorder-form.html b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/purchaseorder-form.html
index 585d61feae7..ab531080cdf 100644
--- a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/purchaseorder-form.html
+++ b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/purchaseorder-form.html
@@ -49,7 +49,12 @@
                     <div class="primary">
                         <button class="action primary checkout"
                                 type="submit"
-                                data-bind="click: placeOrder, attr: {title: $t('Place Order')}, enable: (getCode() == isChecked())"
+                                data-bind="
+                                click: placeOrder,
+                                attr: {title: $t('Place Order')},
+                                enable: (getCode() == isChecked()),
+                                css: {disabled: !isPlaceOrderActionAllowed()}
+                                "
                                 data-role="review-save">
                             <span data-bind="text: $t('Place Order')"></span>
                         </button>
diff --git a/app/code/Magento/Payment/view/frontend/web/template/payment/free.html b/app/code/Magento/Payment/view/frontend/web/template/payment/free.html
index fb33eafd3cf..483920bbe98 100644
--- a/app/code/Magento/Payment/view/frontend/web/template/payment/free.html
+++ b/app/code/Magento/Payment/view/frontend/web/template/payment/free.html
@@ -27,7 +27,11 @@
             <div class="primary">
                 <button class="action primary checkout"
                         type="submit"
-                        data-bind="click: placeOrder, attr: {title: $t('Place Order')}">
+                        data-bind="
+                        click: placeOrder,
+                        attr: {title: $t('Place Order')},
+                        css: {disabled: !isPlaceOrderActionAllowed()}
+                        ">
                     <span data-bind="text: $t('Place Order')"></span>
                 </button>
             </div>
diff --git a/app/code/Magento/Payment/view/frontend/web/template/payment/iframe.html b/app/code/Magento/Payment/view/frontend/web/template/payment/iframe.html
index 2fec488a491..9e4d53bda73 100644
--- a/app/code/Magento/Payment/view/frontend/web/template/payment/iframe.html
+++ b/app/code/Magento/Payment/view/frontend/web/template/payment/iframe.html
@@ -30,7 +30,9 @@
     <div class="primary">
         <button data-role="review-save" type="submit"
                 data-bind="attr: {title: $t('Place order')}"
-                class="button action primary checkout"><span data-bind="text: $t('Place order')"></span></button>
+                class="button action primary checkout">
+            <span data-bind="text: $t('Place order')"></span>
+        </button>
         <button type="submit" id="originalPlaceOrder" class="hidden"
                 data-bind="click: originalPlaceOrder($parents[1])"></button>
     </div>
-- 
GitLab