Skip to content

Commit 719111f

Browse files
committed
Merge branch '2.2-develop-mainline' into ISSUE-11963
2 parents 2025c55 + 79d8e9a commit 719111f

File tree

22 files changed

+221
-72
lines changed

22 files changed

+221
-72
lines changed

app/bootstrap.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
if (!defined('PHP_VERSION_ID') || !(PHP_VERSION_ID === 70002 || PHP_VERSION_ID === 70004 || PHP_VERSION_ID >= 70006)) {
1515
if (PHP_SAPI == 'cli') {
1616
echo 'Magento supports 7.0.2, 7.0.4, and 7.0.6 or later. ' .
17-
'Please read http://devdocs.magento.com/guides/v1.0/install-gde/system-requirements.html';
17+
'Please read http://devdocs.magento.com/guides/v2.2/install-gde/system-requirements.html';
1818
} else {
1919
echo <<<HTML
2020
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
2121
<p>Magento supports PHP 7.0.2, 7.0.4, and 7.0.6 or later. Please read
22-
<a target="_blank" href="http://devdocs.magento.com/guides/v1.0/install-gde/system-requirements.html">
22+
<a target="_blank" href="http://devdocs.magento.com/guides/v2.2/install-gde/system-requirements.html">
2323
Magento System Requirements</a>.
2424
</div>
2525
HTML;

app/code/Magento/Braintree/view/frontend/web/js/view/payment/method-renderer/cc-form.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ define(
7979
*/
8080
onError: function (response) {
8181
braintree.showError($t('Payment ' + this.getTitle() + ' can\'t be initialized'));
82+
this.isPlaceOrderActionAllowed(true);
8283
throw response.message;
8384
},
8485

app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/options.phtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ $stores = $block->getStoresSortedBySortOrder();
5757
<input type="hidden" id="option-count-check" value="" />
5858
</div>
5959
<script id="row-template" type="text/x-magento-template">
60-
<tr>
60+
<tr <% if (data.rowClasses) { %>class="<%- data.rowClasses %>"<% } %>>
6161
<td class="col-draggable">
6262
<?php if (!$block->getReadOnly() && !$block->canManageOptionDefaultOnly()): ?>
6363
<div data-role="draggable-handle" class="draggable-handle"

app/code/Magento/Catalog/view/adminhtml/web/js/options.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ define([
2424
totalItems: 0,
2525
rendered: 0,
2626
template: mageTemplate('#row-template'),
27+
newOptionClass: 'new-option',
2728
isReadOnly: config.isReadOnly,
2829
add: function (data, render) {
2930
var isNewOption = false,
@@ -32,7 +33,8 @@ define([
3233
if (typeof data.id == 'undefined') {
3334
data = {
3435
'id': 'option_' + this.itemCount,
35-
'sort_order': this.itemCount + 1
36+
'sort_order': this.itemCount + 1,
37+
'rowClasses': this.newOptionClass
3638
};
3739
isNewOption = true;
3840
}
@@ -84,6 +86,10 @@ define([
8486
this.totalItems--;
8587
this.updateItemsCountField();
8688
}
89+
90+
if (element.hasClassName(this.newOptionClass)) {
91+
element.remove();
92+
}
8793
},
8894
updateItemsCountField: function () {
8995
$('option-count-check').value = this.totalItems > 0 ? '1' : '';

app/code/Magento/Catalog/view/base/web/template/product/link.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* See COPYING.txt for license details.
55
*/
66
-->
7-
<a class="product-item-link"
7+
<a if="isAllowed()"
8+
class="product-item-link"
89
attr="href: $row().url"
910
text="label"/>

app/code/Magento/ConfigurableProduct/view/adminhtml/web/js/variations/variations.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,12 +357,12 @@ define([
357357
var element;
358358

359359
_.each(this.disabledAttributes, function (attribute) {
360-
registry.get('index = ' + attribute).disabled(false);
360+
registry.get('code = ' + attribute, 'index = ' + attribute).disabled(false);
361361
});
362362
this.disabledAttributes = [];
363363

364364
_.each(attributes, function (attribute) {
365-
element = registry.get('index = ' + attribute.code);
365+
element = registry.get('code = ' + attribute.code, 'index = ' + attribute.code);
366366

367367
if (!_.isUndefined(element)) {
368368
element.disabled(true);

app/code/Magento/Paypal/Model/Express.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -669,14 +669,19 @@ public function getApi()
669669
public function assignData(\Magento\Framework\DataObject $data)
670670
{
671671
parent::assignData($data);
672-
672+
673673
$additionalData = $data->getData(PaymentInterface::KEY_ADDITIONAL_DATA);
674674

675675
if (!is_array($additionalData)) {
676676
return $this;
677677
}
678678

679679
foreach ($additionalData as $key => $value) {
680+
// Skip extension attributes
681+
if ($key === \Magento\Framework\Api\ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY) {
682+
continue;
683+
}
684+
680685
$this->getInfoInstance()->setAdditionalInformation($key, $value);
681686
}
682687
return $this;

app/code/Magento/Paypal/Test/Unit/Model/ExpressTest.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,21 @@ public function testAssignData()
161161
{
162162
$transportValue = 'something';
163163

164+
$extensionAttribute = $this->getMockForAbstractClass(
165+
\Magento\Quote\Api\Data\PaymentExtensionInterface::class,
166+
[],
167+
'',
168+
false,
169+
false
170+
);
171+
164172
$data = new DataObject(
165173
[
166174
PaymentInterface::KEY_ADDITIONAL_DATA => [
167175
Express\Checkout::PAYMENT_INFO_TRANSPORT_BILLING_AGREEMENT => $transportValue,
168176
Express\Checkout::PAYMENT_INFO_TRANSPORT_PAYER_ID => $transportValue,
169-
Express\Checkout::PAYMENT_INFO_TRANSPORT_TOKEN => $transportValue
177+
Express\Checkout::PAYMENT_INFO_TRANSPORT_TOKEN => $transportValue,
178+
\Magento\Framework\Api\ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY => $extensionAttribute
170179
]
171180
]
172181
);

app/code/Magento/Paypal/view/frontend/web/js/action/set-payment-method.js

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,48 +4,12 @@
44
*/
55

66
define([
7-
'jquery',
87
'Magento_Checkout/js/model/quote',
9-
'Magento_Checkout/js/model/url-builder',
10-
'mage/storage',
11-
'Magento_Checkout/js/model/error-processor',
12-
'Magento_Customer/js/model/customer',
13-
'Magento_Checkout/js/model/full-screen-loader'
14-
], function ($, quote, urlBuilder, storage, errorProcessor, customer, fullScreenLoader) {
8+
'Magento_Checkout/js/action/set-payment-information'
9+
], function (quote, setPaymentInformation) {
1510
'use strict';
1611

1712
return function (messageContainer) {
18-
var serviceUrl,
19-
payload,
20-
paymentData = quote.paymentMethod();
21-
22-
/**
23-
* Checkout for guest and registered customer.
24-
*/
25-
if (!customer.isLoggedIn()) {
26-
serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/set-payment-information', {
27-
cartId: quote.getQuoteId()
28-
});
29-
payload = {
30-
cartId: quote.getQuoteId(),
31-
email: quote.guestEmail,
32-
paymentMethod: paymentData
33-
};
34-
} else {
35-
serviceUrl = urlBuilder.createUrl('/carts/mine/set-payment-information', {});
36-
payload = {
37-
cartId: quote.getQuoteId(),
38-
paymentMethod: paymentData
39-
};
40-
}
41-
fullScreenLoader.startLoader();
42-
43-
return storage.post(
44-
serviceUrl, JSON.stringify(payload)
45-
).fail(function (response) {
46-
errorProcessor.process(response, messageContainer);
47-
}).always(function () {
48-
fullScreenLoader.stopLoader();
49-
});
13+
return setPaymentInformation(messageContainer, quote.paymentMethod());
5014
};
5115
});

app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,14 +191,7 @@ public function execute()
191191
}
192192
$transactionSave->save();
193193

194-
if (isset($shippingResponse) && $shippingResponse->hasErrors()) {
195-
$this->messageManager->addError(
196-
__(
197-
'The invoice and the shipment have been created. ' .
198-
'The shipping label cannot be created now.'
199-
)
200-
);
201-
} elseif (!empty($data['do_shipment'])) {
194+
if (!empty($data['do_shipment'])) {
202195
$this->messageManager->addSuccess(__('You created the invoice and shipment.'));
203196
} else {
204197
$this->messageManager->addSuccess(__('The invoice has been created.'));

app/code/Magento/Sales/i18n/en_US.csv

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,6 @@ Sales,Sales
233233
"You can't create an invoice without products.","You can't create an invoice without products."
234234
"New Invoice","New Invoice"
235235
"We can't save the invoice right now.","We can't save the invoice right now."
236-
"The invoice and the shipment have been created. The shipping label cannot be created now.","The invoice and the shipment have been created. The shipping label cannot be created now."
237236
"You created the invoice and shipment.","You created the invoice and shipment."
238237
"The invoice has been created.","The invoice has been created."
239238
"We can't send the invoice email right now.","We can't send the invoice email right now."

app/code/Magento/Ui/Controller/Adminhtml/Index/Render.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public function execute()
8888
} catch (\Exception $e) {
8989
$this->logger->critical($e);
9090
$result = [
91-
'error' => _('UI component could not be rendered because of system exception'),
91+
'error' => __('UI component could not be rendered because of system exception'),
9292
'errorcode' => $this->escaper->escapeHtml($e->getCode())
9393
];
9494
/** @var \Magento\Framework\Controller\Result\Json $resultJson */

app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/main/actions-bar/_store-switcher.less

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@
4242
max-height: 250px;
4343
overflow-y: auto;
4444
padding-top: .25em;
45+
&::-webkit-scrollbar {
46+
-webkit-appearance: none;
47+
width: 7px;
48+
}
49+
&::-webkit-scrollbar-thumb {
50+
border-radius: 4px;
51+
background-color: rgba(0, 0, 0, .5);
52+
}
4553

4654
li {
4755
border: 0;

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
"ext-dom": "*",
6060
"ext-simplexml": "*",
6161
"ext-mcrypt": "*",
62+
"ext-bcmath": "*",
6263
"ext-hash": "*",
6364
"ext-curl": "*",
6465
"ext-iconv": "*",

composer.lock

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dev/tests/integration/etc/di/preferences/ce.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
\Magento\Framework\App\Response\Http::class => \Magento\TestFramework\Response::class,
1717
\Magento\Framework\Interception\PluginListInterface::class =>
1818
\Magento\TestFramework\Interception\PluginList::class,
19+
\Magento\Framework\Interception\ObjectManager\ConfigInterface::class =>
20+
\Magento\TestFramework\ObjectManager\Config::class,
1921
\Magento\Framework\Interception\ObjectManager\Config\Developer::class =>
2022
\Magento\TestFramework\ObjectManager\Config::class,
2123
\Magento\Framework\View\LayoutInterface::class => \Magento\TestFramework\View\Layout::class,

dev/tests/js/jasmine/tests/app/code/Magento/Braintree/frontend/js/view/payment/method-renderer/cc-form.test.js

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ define([
2727
),
2828
'Magento_Braintree/js/view/payment/adapter': jasmine.createSpyObj(
2929
'adapter',
30-
['setup', 'setConfig']
30+
['setup', 'setConfig', 'showError']
3131
)
3232
},
3333
braintreeCcForm;
@@ -43,14 +43,17 @@ define([
4343
};
4444
injector.mock(mocks);
4545
injector.require(['Magento_Braintree/js/view/payment/method-renderer/cc-form'], function (Constr) {
46-
braintreeCcForm = new Constr({
47-
provider: 'provName',
48-
name: 'test',
49-
index: 'test'
50-
});
51-
52-
done();
46+
braintreeCcForm = new Constr({
47+
provider: 'provName',
48+
name: 'test',
49+
index: 'test',
50+
item: {
51+
title: 'Braintree'
52+
}
5353
});
54+
55+
done();
56+
});
5457
});
5558

5659
it('Check if payment code and message container are restored after onActiveChange call.', function () {
@@ -65,5 +68,21 @@ define([
6568
expect(braintreeCcForm.getCode()).toEqual(expectedCode);
6669
expect(braintreeCcForm.messageContainer).toEqual(expectedMessageContainer);
6770
});
71+
72+
it('Check if form validation fails when "Place Order" button should be active.', function () {
73+
var errorMessage = 'Something went wrong.',
74+
75+
/**
76+
* Anonymous wrapper
77+
*/
78+
func = function () {
79+
braintreeCcForm.clientConfig.onError({
80+
'message': errorMessage
81+
});
82+
};
83+
84+
expect(func).toThrow(errorMessage);
85+
expect(braintreeCcForm.isPlaceOrderActionAllowed()).toBeTruthy();
86+
});
6887
});
6988
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
define([
7+
'squire'
8+
], function (Squire) {
9+
'use strict';
10+
11+
var injector = new Squire(),
12+
mocks = {
13+
'Magento_Checkout/js/action/place-order': jasmine.createSpy('placeOrderAction'),
14+
'Magento_CheckoutAgreements/js/model/agreements-assigner': jasmine.createSpy('agreementsAssigner')
15+
},
16+
defaultContext = require.s.contexts._,
17+
mixin,
18+
placeOrderAction;
19+
20+
beforeEach(function (done) {
21+
window.checkoutConfig = {
22+
checkoutAgreements: {
23+
isEnabled: true
24+
}
25+
};
26+
injector.mock(mocks);
27+
injector.require([
28+
'Magento_CheckoutAgreements/js/model/place-order-mixin',
29+
'Magento_Checkout/js/action/place-order'
30+
], function (Mixin, placeOrder) {
31+
mixin = Mixin;
32+
placeOrderAction = placeOrder;
33+
done();
34+
});
35+
});
36+
37+
describe('Magento_CheckoutAgreements/js/model/place-order-mixin', function () {
38+
it('mixin is applied to Magento_Checkout/js/action/place-order', function () {
39+
var placeOrderMixins = defaultContext.config.config.mixins['Magento_Checkout/js/action/place-order'];
40+
41+
expect(placeOrderMixins['Magento_CheckoutAgreements/js/model/place-order-mixin']).toBe(true);
42+
});
43+
44+
it('Magento_CheckoutAgreements/js/model/agreements-assigner is called', function () {
45+
var messageContainer = jasmine.createSpy('messageContainer'),
46+
paymentData = {};
47+
48+
mixin(placeOrderAction)(paymentData, messageContainer);
49+
expect(mocks['Magento_CheckoutAgreements/js/model/agreements-assigner'])
50+
.toHaveBeenCalledWith(paymentData);
51+
expect(mocks['Magento_Checkout/js/action/place-order'])
52+
.toHaveBeenCalledWith(paymentData, messageContainer);
53+
});
54+
});
55+
});

0 commit comments

Comments
 (0)