Skip to content

Commit 5894db0

Browse files
committed
Merge remote-tracking branch 'tango-ce/MAGETWO-50600' into MAGETWO-52578
2 parents 8d2d644 + 94b9ba9 commit 5894db0

File tree

8 files changed

+396
-18
lines changed

8 files changed

+396
-18
lines changed

app/code/Magento/CatalogInventory/Test/Unit/Ui/DataProvider/Product/Form/Modifier/AdvancedInventoryTest.php

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
*/
66
namespace Magento\CatalogInventory\Test\Unit\Ui\DataProvider\Product\Form\Modifier;
77

8+
use Magento\Store\Model\Store;
89
use Magento\Catalog\Test\Unit\Ui\DataProvider\Product\Form\Modifier\AbstractModifierTest;
910
use Magento\CatalogInventory\Api\StockRegistryInterface;
1011
use Magento\CatalogInventory\Api\Data\StockItemInterface;
11-
use Magento\Store\Model\Store;
12+
use Magento\CatalogInventory\Api\StockConfigurationInterface;
1213
use Magento\CatalogInventory\Ui\DataProvider\Product\Form\Modifier\AdvancedInventory;
1314

1415
/**
@@ -31,6 +32,11 @@ class AdvancedInventoryTest extends AbstractModifierTest
3132
*/
3233
protected $storeMock;
3334

35+
/**
36+
* @var StockConfigurationInterface|\PHPUnit_Framework_MockObject_MockObject
37+
*/
38+
protected $stockConfigurationMock;
39+
3440
protected function setUp()
3541
{
3642
parent::setUp();
@@ -43,6 +49,9 @@ protected function setUp()
4349
$this->stockItemMock = $this->getMockBuilder(StockItemInterface::class)
4450
->setMethods(['getData'])
4551
->getMockForAbstractClass();
52+
$this->stockConfigurationMock = $this->getMockBuilder(StockConfigurationInterface::class)
53+
->disableOriginalConstructor()
54+
->getMockForAbstractClass();
4655

4756
$this->stockRegistryMock->expects($this->any())
4857
->method('getStockItem')
@@ -59,7 +68,9 @@ protected function createModel()
5968
{
6069
return $this->objectManager->getObject(AdvancedInventory::class, [
6170
'locator' => $this->locatorMock,
62-
'stockRegistry' => $this->stockRegistryMock
71+
'stockRegistry' => $this->stockRegistryMock,
72+
'stockConfiguration' => $this->stockConfigurationMock,
73+
'arrayManager' => $this->arrayManagerMock,
6374
]);
6475
}
6576

@@ -73,9 +84,10 @@ public function testModifyData()
7384
$modelId = 1;
7485
$someData = 1;
7586

76-
$this->productMock->expects($this->any())
77-
->method('getId')
78-
->willReturn($modelId);
87+
$this->productMock->expects($this->any())->method('getId')->willReturn($modelId);
88+
89+
$this->stockConfigurationMock->expects($this->any())->method('getDefaultConfigValue')->willReturn("a:0:{}");
90+
7991
$this->stockItemMock->expects($this->once())->method('getData')->willReturn(['someData']);
8092
$this->stockItemMock->expects($this->once())->method('getManageStock')->willReturn($someData);
8193
$this->stockItemMock->expects($this->once())->method('getQty')->willReturn($someData);
@@ -90,6 +102,11 @@ public function testModifyData()
90102
$this->stockItemMock->expects($this->once())->method('getQtyIncrements')->willReturn($someData);
91103
$this->stockItemMock->expects($this->once())->method('getIsInStock')->willReturn($someData);
92104

105+
$this->arrayManagerMock->expects($this->once())
106+
->method('set')
107+
->with('1/product/stock_data/min_qty_allowed_in_shopping_cart')
108+
->willReturnArgument(1);
109+
93110
$this->assertArrayHasKey($modelId, $this->getModel()->modifyData([]));
94111
}
95112
}

app/code/Magento/CatalogInventory/Ui/Component/Product/Form/Element/UseConfigSettings.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ public function prepare()
2626
&& isset($config['valueFromConfig'])
2727
&& $config['valueFromConfig'] instanceof ValueSourceInterface
2828
) {
29-
$config['valueFromConfig'] = $config['valueFromConfig']->getValue($config['keyInConfiguration']);
29+
$keyInConfiguration = $config['valueFromConfig']->getValue($config['keyInConfiguration']);
30+
if (!empty($config['unserialized']) && strpos($keyInConfiguration, 'a:') === 0) {
31+
$config['valueFromConfig'] = unserialize($keyInConfiguration);
32+
} else {
33+
$config['valueFromConfig'] = $keyInConfiguration;
34+
}
3035
}
3136
$this->setData('config', (array)$config);
3237

app/code/Magento/CatalogInventory/Ui/DataProvider/Product/Form/Modifier/AdvancedInventory.php

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Magento\CatalogInventory\Api\StockRegistryInterface;
1111
use Magento\Framework\Stdlib\ArrayManager;
1212
use Magento\CatalogInventory\Api\Data\StockItemInterface;
13+
use Magento\CatalogInventory\Api\StockConfigurationInterface;
1314

1415
/**
1516
* Data provider for advanced inventory form
@@ -33,6 +34,11 @@ class AdvancedInventory extends AbstractModifier
3334
*/
3435
private $arrayManager;
3536

37+
/**
38+
* @var StockConfigurationInterface
39+
*/
40+
private $stockConfiguration;
41+
3642
/**
3743
* @var array
3844
*/
@@ -42,15 +48,18 @@ class AdvancedInventory extends AbstractModifier
4248
* @param LocatorInterface $locator
4349
* @param StockRegistryInterface $stockRegistry
4450
* @param ArrayManager $arrayManager
51+
* @param StockConfigurationInterface $stockConfiguration
4552
*/
4653
public function __construct(
4754
LocatorInterface $locator,
4855
StockRegistryInterface $stockRegistry,
49-
ArrayManager $arrayManager
56+
ArrayManager $arrayManager,
57+
StockConfigurationInterface $stockConfiguration
5058
) {
5159
$this->locator = $locator;
5260
$this->stockRegistry = $stockRegistry;
5361
$this->arrayManager = $arrayManager;
62+
$this->stockConfiguration = $stockConfiguration;
5463
}
5564

5665
/**
@@ -78,6 +87,28 @@ public function modifyData(array $data)
7887
(int)$stockData['is_in_stock'];
7988
}
8089

90+
if (!empty($this->stockConfiguration->getDefaultConfigValue(StockItemInterface::MIN_SALE_QTY))) {
91+
$minSaleQtyData = null;
92+
$defaultConfigValue = $this->stockConfiguration->getDefaultConfigValue(StockItemInterface::MIN_SALE_QTY);
93+
94+
if (strpos($defaultConfigValue, 'a:') === 0) {
95+
// Set data source for dynamicRows Minimum Qty Allowed in Shopping Cart
96+
$minSaleQtyValue = unserialize($defaultConfigValue);
97+
98+
foreach ($minSaleQtyValue as $group => $qty) {
99+
$minSaleQtyData[] = [
100+
StockItemInterface::CUSTOMER_GROUP_ID => $group,
101+
StockItemInterface::MIN_SALE_QTY => $qty
102+
];
103+
}
104+
} else {
105+
$minSaleQtyData = $defaultConfigValue;
106+
}
107+
108+
$path = $modelId . '/' . self::DATA_SOURCE_DEFAULT . '/stock_data/min_qty_allowed_in_shopping_cart';
109+
$data = $this->arrayManager->set($path, $data, $minSaleQtyData);
110+
}
111+
81112
return $data;
82113
}
83114

app/code/Magento/CatalogInventory/view/adminhtml/ui_component/product_form.xml

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,10 @@
161161
</field>
162162
</container>
163163

164-
<container name="container_min_sale_qty">
164+
<fieldset name="container_min_sale_qty">
165165
<argument name="data" xsi:type="array">
166166
<item name="config" xsi:type="array">
167-
<item name="formElement" xsi:type="string">container</item>
168-
<item name="component" xsi:type="string">Magento_Ui/js/form/components/group</item>
169-
<item name="label" xsi:type="string" translate="true">Minimum Qty Allowed in Shopping Cart</item>
167+
<item name="label" xsi:type="string" translate="true"/>
170168
<item name="dataScope" xsi:type="string">stock_data</item>
171169
<item name="sortOrder" xsi:type="number">400</item>
172170
<item name="scopeLabel" xsi:type="string">[GLOBAL]</item>
@@ -184,10 +182,13 @@
184182
<item name="validate-number" xsi:type="boolean">true</item>
185183
<item name="validate-digits" xsi:type="boolean">true</item>
186184
</item>
185+
<item name="sortOrder" xsi:type="string">0</item>
187186
<item name="value" xsi:type="object">Magento\CatalogInventory\Model\Source\StockConfiguration</item>
188187
<item name="imports" xsi:type="array">
189188
<item name="handleChanges" xsi:type="string">${$.provider}:data.product.stock_data.is_qty_decimal</item>
190189
</item>
190+
<item name="scopeLabel" xsi:type="string">[GLOBAL]</item>
191+
<item name="visible" xsi:type="boolean">false</item>
191192
</item>
192193
</argument>
193194
</field>
@@ -202,20 +203,72 @@
202203
<item name="false" xsi:type="string">0</item>
203204
</item>
204205
<item name="value" xsi:type="string">1</item>
205-
<item name="exports" xsi:type="array">
206-
<item name="checked" xsi:type="string">${$.parentName}.min_sale_qty:disabled</item>
207-
</item>
208-
<item name="component" xsi:type="string">Magento_CatalogInventory/js/components/use-config-settings</item>
206+
<item name="inputField" xsi:type="string">ns = ${ $.ns }, index=min_sale_qty</item>
207+
<item name="dynamicRowsField" xsi:type="string">ns = ${ $.ns }, index=min_qty_allowed_in_shopping_cart</item>
208+
<item name="sortOrder" xsi:type="string">2</item>
209+
<item name="component" xsi:type="string">Magento_CatalogInventory/js/components/use-config-min-sale-qty</item>
209210
<item name="class" xsi:type="string">Magento\CatalogInventory\Ui\Component\Product\Form\Element\UseConfigSettings</item>
210211
<item name="valueFromConfig" xsi:type="object">Magento\CatalogInventory\Model\Source\StockConfiguration</item>
211212
<item name="keyInConfiguration" xsi:type="string">min_sale_qty</item>
212-
<item name="links" xsi:type="array">
213-
<item name="linkedValue" xsi:type="string">${$.provider}:data.product.stock_data.min_sale_qty</item>
213+
<item name="unserialized" xsi:type="boolean">true</item>
214+
<item name="additionalClasses" xsi:type="array">
215+
<item name="admin__field-no-label" xsi:type="boolean">true</item>
216+
<item name="admin__field-use-config" xsi:type="boolean">true</item>
214217
</item>
215218
</item>
216219
</argument>
217220
</field>
218-
</container>
221+
<dynamicRows name="min_qty_allowed_in_shopping_cart">
222+
<argument name="data" xsi:type="array">
223+
<item name="config" xsi:type="array">
224+
<item name="componentType" xsi:type="string">dynamicRows</item>
225+
<item name="sortOrder" xsi:type="string">1</item>
226+
<item name="addButton" xsi:type="boolean">false</item>
227+
<item name="label" xsi:type="string" translate="true">Minimum Qty Allowed in Shopping Cart</item>
228+
<item name="scopeLabel" xsi:type="string">[GLOBAL]</item>
229+
<item name="visible" xsi:type="boolean">false</item>
230+
<item name="dndConfig" xsi:type="array">
231+
<item name="enabled" xsi:type="boolean">false</item>
232+
</item>
233+
</item>
234+
</argument>
235+
<container name="record">
236+
<argument name="data" xsi:type="array">
237+
<item name="config" xsi:type="array">
238+
<item name="isTemplate" xsi:type="boolean">true</item>
239+
<item name="is_collection" xsi:type="boolean">true</item>
240+
<item name="component" xsi:type="string">Magento_Ui/js/dynamic-rows/record</item>
241+
<item name="componentType" xsi:type="string">container</item>
242+
</item>
243+
</argument>
244+
<field name="customer_group_id">
245+
<argument name="data" xsi:type="array">
246+
<item name="options" xsi:type="object">Magento\Customer\Model\Customer\Source\Group</item>
247+
<item name="config" xsi:type="array">
248+
<item name="dataType" xsi:type="string">text</item>
249+
<item name="formElement" xsi:type="string">select</item>
250+
<item name="component" xsi:type="string">Magento_Ui/js/form/element/select</item>
251+
<item name="label" xsi:type="string" translate="true">Customer Group</item>
252+
<item name="dataScope" xsi:type="string">customer_group_id</item>
253+
<item name="disabled" xsi:type="boolean">true</item>
254+
</item>
255+
</argument>
256+
</field>
257+
<field name="min_sale_qty">
258+
<argument name="data" xsi:type="array">
259+
<item name="config" xsi:type="array">
260+
<item name="dataType" xsi:type="string">number</item>
261+
<item name="formElement" xsi:type="string">input</item>
262+
<item name="visible" xsi:type="boolean">true</item>
263+
<item name="label" xsi:type="string" translate="true">Minimum Qty</item>
264+
<item name="dataScope" xsi:type="string">min_sale_qty</item>
265+
<item name="disabled" xsi:type="boolean">true</item>
266+
</item>
267+
</argument>
268+
</field>
269+
</container>
270+
</dynamicRows>
271+
</fieldset>
219272

220273
<container name="container_max_sale_qty">
221274
<argument name="data" xsi:type="array">
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/**
2+
* Copyright © 2016 Magento. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
define([
7+
'Magento_Ui/js/form/element/single-checkbox',
8+
'underscore',
9+
'uiRegistry'
10+
], function (checkbox, _, registry) {
11+
'use strict';
12+
13+
return checkbox.extend({
14+
defaults: {
15+
valueFromConfig: ''
16+
},
17+
18+
/**
19+
* @returns {Element}
20+
*/
21+
initObservable: function () {
22+
return this
23+
._super()
24+
.observe(['valueFromConfig']);
25+
},
26+
27+
/**
28+
* @inheritdoc
29+
*/
30+
initialize: function () {
31+
this._super();
32+
this.onCheckedChanged(this.checked());
33+
34+
return this;
35+
},
36+
37+
/**
38+
* @inheritdoc
39+
*/
40+
'onCheckedChanged': function (newChecked) {
41+
var valueFromConfig = this.valueFromConfig();
42+
43+
if (newChecked && (_.isArray(valueFromConfig) && valueFromConfig.length === 0 || valueFromConfig === 1)) {
44+
this.changeVisibleDisabled(this.inputField, true, true, 1);
45+
} else if (newChecked && _.isObject(valueFromConfig)) {
46+
this.changeVisibleDisabled(this.inputField, false, true, null);
47+
this.changeVisibleDisabled(this.dynamicRowsField, true, true, null);
48+
} else if (newChecked && _.isNumber(valueFromConfig)) {
49+
this.changeVisibleDisabled(this.inputField, true, true, null);
50+
this.changeVisibleDisabled(this.dynamicRowsField, false, true, null);
51+
} else {
52+
this.changeVisibleDisabled(this.inputField, true, false, null);
53+
this.changeVisibleDisabled(this.dynamicRowsField, false, true, null);
54+
}
55+
56+
this._super(newChecked);
57+
},
58+
59+
/**
60+
* Change visible and disabled
61+
*
62+
* @param {String} filter
63+
* @param {Boolean} visible
64+
* @param {Boolean} disabled
65+
* @param {Null|Number} valueFromConfig
66+
*/
67+
changeVisibleDisabled: function (filter, visible, disabled, valueFromConfig) {
68+
registry.async(filter)(
69+
function (currentComponent) {
70+
var initialValue = currentComponent.initialValue;
71+
72+
if (_.isString(initialValue) || initialValue === 0 || valueFromConfig === 1) {
73+
currentComponent.value(1);
74+
} else if (initialValue) {
75+
currentComponent.value(initialValue);
76+
}
77+
78+
currentComponent.visible(visible);
79+
currentComponent.disabled(disabled);
80+
}
81+
);
82+
}
83+
});
84+
});

0 commit comments

Comments
 (0)