Skip to content

Commit 3723b61

Browse files
authored
Merge branch '2.4-develop' into ui-fix-for-time-component--task-29496
2 parents 23b5a24 + cc6286a commit 3723b61

33 files changed

+2513
-745
lines changed

app/code/Magento/Catalog/Test/Mftf/Test/AdminProductGridUrlFilterApplierTest.xml

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,24 @@
1818
<testCaseId value="https://studio.cucumber.io/projects/131313/test-plan/folders/1320712/scenarios/4931106"/>
1919
<group value="product"/>
2020
</annotations>
21+
2122
<before>
2223
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
23-
<createData entity="simpleProductWithShortNameAndSku" stepKey="createSimpleProduct"/>
24+
<createData entity="SimpleProduct2" stepKey="createSimpleProduct"/>
2425
</before>
26+
2527
<after>
26-
<actionGroup ref="ClearFiltersAdminDataGridActionGroup" stepKey="clearGridFilter"/>
2728
<deleteData createDataKey="createSimpleProduct" stepKey="deleteProduct"/>
29+
<actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="navigateToProductIndex"/>
30+
<actionGroup ref="ClearFiltersAdminDataGridActionGroup" stepKey="clearGridFilter"/>
2831
<actionGroup ref="AdminLogoutActionGroup" stepKey="logoutOfAdmin"/>
2932
</after>
30-
<amOnPage url="{{AdminProductIndexPage.url}}?filters[name]=$$createSimpleProduct.name$$" stepKey="navigateToProductGridWithFilters"/>
33+
34+
<amOnPage url="{{AdminProductIndexPage.url}}?filters[name]=$createSimpleProduct.name$" stepKey="navigateToProductGridWithFilters"/>
3135
<waitForPageLoad stepKey="waitForProductGrid"/>
32-
<see selector="{{AdminProductGridSection.productGridNameProduct($$createSimpleProduct.name$$)}}" userInput="$$createSimpleProduct.name$$" stepKey="seeProduct"/>
36+
<see selector="{{AdminProductGridSection.productGridNameProduct($createSimpleProduct.name$)}}" userInput="$createSimpleProduct.name$" stepKey="seeProduct"/>
37+
<waitForElementVisible selector="{{AdminProductGridFilterSection.enabledFilters}}" stepKey="waitForEnabledFilters"/>
3338
<seeElement selector="{{AdminProductGridFilterSection.enabledFilters}}" stepKey="seeEnabledFilters"/>
34-
<see selector="{{AdminProductGridFilterSection.enabledFilters}}" userInput="Name: $$createSimpleProduct.name$$" stepKey="seeProductNameFilter"/>
39+
<see selector="{{AdminProductGridFilterSection.enabledFilters}}" userInput="Name: $createSimpleProduct.name$" stepKey="seeProductNameFilter"/>
3540
</test>
3641
</tests>

app/code/Magento/Config/Block/System/Config/Form/Fieldset.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ protected function _getChildrenElementsHtml(AbstractElement $element)
9696
. '<td colspan="4">' . $field->toHtml() . '</td></tr>';
9797
} else {
9898
$elements .= $field->toHtml();
99+
$styleTag = $this->addVisibilityTag($field);
100+
$elements .= $styleTag;
99101
}
100102
}
101103

@@ -168,11 +170,13 @@ protected function _getFrontendClass($element)
168170
*/
169171
protected function _getHeaderTitleHtml($element)
170172
{
173+
$styleTag = $this->addVisibilityTag($element);
171174
return '<a id="' .
172175
$element->getHtmlId() .
173176
'-head" href="#' .
174177
$element->getHtmlId() .
175178
'-link">' . $element->getLegend() . '</a>' .
179+
$styleTag .
176180
/* @noEscape */ $this->secureRenderer->renderEventListenerAsTag(
177181
'onclick',
178182
'event.preventDefault();' .
@@ -270,10 +274,70 @@ protected function _isCollapseState($element)
270274
return true;
271275
}
272276

277+
if ($this->isCollapseStateByDependentField($element)) {
278+
return false;
279+
}
280+
273281
$extra = $this->_authSession->getUser()->getExtra();
282+
274283
if (isset($extra['configState'][$element->getId()])) {
275284
return $extra['configState'][$element->getId()];
276285
}
277286
return $this->isCollapsedDefault;
278287
}
288+
289+
/**
290+
* Check if element should be collapsed by dependent field value.
291+
*
292+
* @param AbstractElement $element
293+
* @return bool
294+
*/
295+
private function isCollapseStateByDependentField(AbstractElement $element): bool
296+
{
297+
if (!empty($element->getGroup()['depends']['fields'])) {
298+
foreach ($element->getGroup()['depends']['fields'] as $dependFieldData) {
299+
if (is_array($dependFieldData) && isset($dependFieldData['value'], $dependFieldData['id'])) {
300+
$fieldSetForm = $this->getForm();
301+
$dependentFieldConfigValue = $this->_scopeConfig->getValue(
302+
$dependFieldData['id'],
303+
$fieldSetForm->getScope(),
304+
$fieldSetForm->getScopeCode()
305+
);
306+
307+
if ($dependFieldData['value'] !== $dependentFieldConfigValue) {
308+
return true;
309+
}
310+
}
311+
}
312+
}
313+
314+
return false;
315+
}
316+
317+
/**
318+
* If element or it's parent depends on other element we hide it during page load.
319+
*
320+
* @param AbstractElement $field
321+
* @return string
322+
*/
323+
private function addVisibilityTag(AbstractElement $field): string
324+
{
325+
$elementId = '';
326+
$styleTag = '';
327+
328+
if (!empty($field->getFieldConfig()['depends']['fields'])) {
329+
$elementId = '#row_' . $field->getHtmlId();
330+
} elseif (!empty($field->getGroup()['depends']['fields'])) {
331+
$elementId = '#' . $field->getHtmlId() . '-head';
332+
}
333+
334+
if (!empty($elementId)) {
335+
$styleTag .= $this->secureRenderer->renderStyleAsTag(
336+
'display: none;',
337+
$elementId
338+
);
339+
}
340+
341+
return $styleTag;
342+
}
279343
}

dev/tests/integration/testsuite/Magento/Checkout/_files/ValidatorFileMock.php renamed to dev/tests/integration/framework/Magento/TestFramework/Catalog/Model/Product/Option/Type/File/ValidatorFileMock.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,22 @@
55
*/
66
declare(strict_types=1);
77

8-
namespace Magento\Checkout\_files;
8+
namespace Magento\TestFramework\Catalog\Model\Product\Option\Type\File;
99

1010
use Magento\Catalog\Model\Product\Option\Type\File\ValidatorFile;
11+
use PHPUnit\Framework\MockObject\MockObject;
12+
use PHPUnit\Framework\TestCase;
1113

1214
/**
1315
* Creates mock for ValidatorFile to replace real instance in fixtures.
1416
*/
15-
class ValidatorFileMock extends \PHPUnit\Framework\TestCase
17+
class ValidatorFileMock extends TestCase
1618
{
1719
/**
1820
* Returns mock.
21+
*
1922
* @param array|null $fileData
20-
* @return ValidatorFile|\PHPUnit_Framework_MockObject_MockObject
23+
* @return ValidatorFile|MockObject
2124
*/
2225
public function getInstance($fileData = null)
2326
{

dev/tests/integration/testsuite/Magento/Catalog/_files/products_with_multiselect_attribute_with_source_model.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
99

1010
Resolver::getInstance()->requireDataFixture('Magento/Catalog/_files/multiselect_attribute_with_source_model.php');
11-
Resolver::getInstance()->requireDataFixture('Magento/Checkout/_files/ValidatorFileMock.php');
1211

1312
/** Create product with options and multiselect attribute */
1413

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Catalog\Api\Data\ProductInterfaceFactory;
10+
use Magento\Catalog\Model\Product\Attribute\Source\Status;
11+
use Magento\Catalog\Model\Product\Type;
12+
use Magento\Catalog\Model\Product\Visibility;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
15+
$objectManager = Bootstrap::getObjectManager();
16+
/** @var ProductInterfaceFactory ProductInterfaceFactory */
17+
$productFactory = $objectManager->get(ProductInterfaceFactory::class);
18+
/** @var ProductRepositoryInterface $productRepositoryFactory */
19+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
20+
$productRepository->cleanCache();
21+
22+
$product = $productFactory->create();
23+
$product->setTypeId(Type::TYPE_SIMPLE)
24+
->setStatus(Status::STATUS_ENABLED)
25+
->setAttributeSetId($product->getDefaultAttributeSetId())
26+
->setWebsiteIds([1])
27+
->setName('Simple Product min and max sale qty')
28+
->setSku('simple_product_min_max_sale_qty')
29+
->setPrice(10)
30+
->setWeight(1)
31+
->setVisibility(Visibility::VISIBILITY_BOTH)
32+
->setStockData(
33+
[
34+
'use_config_manage_stock' => 1,
35+
'qty' => 100,
36+
'is_qty_decimal' => 0,
37+
'is_in_stock' => 1,
38+
'min_sale_qty' => 5,
39+
'max_sale_qty' => 20,
40+
]
41+
)
42+
->setCanSaveCustomOptions(true)
43+
->setHasOptions(true);
44+
$productRepository->save($product);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Framework\Exception\NoSuchEntityException;
10+
use Magento\Framework\Registry;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
13+
$objectManager = Bootstrap::getObjectManager();
14+
/** @var Registry $registry */
15+
$registry = $objectManager->get(Registry::class);
16+
/** @var ProductRepositoryInterface $productRepository */
17+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
18+
19+
$registry->unregister('isSecureArea');
20+
$registry->register('isSecureArea', true);
21+
22+
try {
23+
$productRepository->deleteById('simple_product_min_max_sale_qty');
24+
} catch (NoSuchEntityException $e) {
25+
//product already deleted
26+
}
27+
28+
$registry->unregister('isSecureArea');
29+
$registry->register('isSecureArea', false);
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Catalog\Api\Data\ProductInterfaceFactory;
10+
use Magento\Catalog\Model\Product\Attribute\Source\Status;
11+
use Magento\Catalog\Model\Product\Type;
12+
use Magento\Catalog\Model\Product\Visibility;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
15+
$objectManager = Bootstrap::getObjectManager();
16+
/** @var ProductInterfaceFactory ProductInterfaceFactory */
17+
$productFactory = $objectManager->get(ProductInterfaceFactory::class);
18+
/** @var ProductRepositoryInterface $productRepositoryFactory */
19+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
20+
$productRepository->cleanCache();
21+
22+
$product = $productFactory->create();
23+
$product->setTypeId(Type::TYPE_SIMPLE)
24+
->setStatus(Status::STATUS_ENABLED)
25+
->setAttributeSetId($product->getDefaultAttributeSetId())
26+
->setWebsiteIds([1])
27+
->setName('Simple Product with qty increments')
28+
->setSku('simple_product_with_qty_increments')
29+
->setPrice(10)
30+
->setWeight(1)
31+
->setVisibility(Visibility::VISIBILITY_BOTH)
32+
->setStockData(
33+
[
34+
'use_config_manage_stock' => 1,
35+
'qty' => 100,
36+
'is_qty_decimal' => 0,
37+
'is_in_stock' => 1,
38+
'enable_qty_increments' => 1,
39+
'qty_increments' => 3,
40+
]
41+
)
42+
->setCanSaveCustomOptions(true)
43+
->setHasOptions(true);
44+
$productRepository->save($product);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Framework\Exception\NoSuchEntityException;
10+
use Magento\Framework\Registry;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
13+
$objectManager = Bootstrap::getObjectManager();
14+
/** @var Registry $registry */
15+
$registry = $objectManager->get(Registry::class);
16+
/** @var ProductRepositoryInterface $productRepository */
17+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
18+
19+
$registry->unregister('isSecureArea');
20+
$registry->register('isSecureArea', true);
21+
22+
try {
23+
$productRepository->deleteById('simple_product_with_qty_increments');
24+
} catch (NoSuchEntityException $e) {
25+
//product already deleted
26+
}
27+
28+
$registry->unregister('isSecureArea');
29+
$registry->register('isSecureArea', false);

0 commit comments

Comments
 (0)