Skip to content

Commit 1bb7a03

Browse files
Merge branch '2.4-develop' into LYNX-199
2 parents c64fe58 + 0cdd86b commit 1bb7a03

File tree

214 files changed

+8638
-9573
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

214 files changed

+8638
-9573
lines changed

app/code/Magento/Backend/view/adminhtml/web/js/dashboard/chart.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ define([
1717
$.widget('mage.dashboardChart', {
1818
options: {
1919
updateUrl: '',
20+
responsive: true,
21+
maintainAspectRatio: false,
2022
periodSelect: null,
2123
periodUnits: [],
2224
precision: 0,

app/code/Magento/Catalog/Test/Mftf/ActionGroup/DeleteCategoryActionGroup.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<amOnPage url="{{AdminCategoryPage.url}}" stepKey="goToCategoryPage"/>
2020
<waitForPageLoad time="60" stepKey="waitForCategoryPageLoad"/>
2121
<click selector="{{AdminCategorySidebarTreeSection.categoryInTree(categoryEntity.name)}}" stepKey="clickCategoryLink"/>
22+
<waitForElementClickable selector="{{AdminCategoryMainActionsSection.DeleteButton}}" stepKey="waitForDeleteButtonClickable" />
2223
<click selector="{{AdminCategoryMainActionsSection.DeleteButton}}" stepKey="clickDelete"/>
2324
<waitForElementVisible selector="{{AdminCategoryModalSection.message}}" stepKey="waitForConfirmationModal"/>
2425
<see selector="{{AdminCategoryModalSection.message}}" userInput="Are you sure you want to delete this category?" stepKey="seeDeleteConfirmationMessage"/>

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@
4747
<argument name="keyword" value="api-simple-product"/>
4848
</actionGroup>
4949
<actionGroup ref="SortProductsByIdDescendingActionGroup" stepKey="sortProductsByIdDescending"/>
50+
<waitForElementClickable selector="{{AdminProductGridSection.productGridCheckboxOnRow('1')}}" stepKey="waitForFirstCheckboxClickable" />
5051
<checkOption selector="{{AdminProductGridSection.productGridCheckboxOnRow('1')}}" stepKey="clickCheckbox1"/>
5152
<checkOption selector="{{AdminProductGridSection.productGridCheckboxOnRow('2')}}" stepKey="clickCheckbox2"/>
5253
<!-- Mass update attributes -->
54+
<waitForElementClickable selector="{{AdminProductGridSection.bulkActionDropdown}}" stepKey="waitForDropdownClickable" />
5355
<click selector="{{AdminProductGridSection.bulkActionDropdown}}" stepKey="clickDropdown"/>
56+
<waitForElementClickable selector="{{AdminProductGridSection.bulkActionOption('Update attributes')}}" stepKey="waitForOptionClickable" />
5457
<click selector="{{AdminProductGridSection.bulkActionOption('Update attributes')}}" stepKey="clickOption"/>
5558
<waitForPageLoad stepKey="waitForBulkUpdatePage"/>
5659
<seeInCurrentUrl stepKey="seeInUrl" url="catalog/product_action_attribute/edit/"/>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
</before>
3030
<after>
3131
<!-- Reset the window size to its original state -->
32-
<resizeWindow width="1280" height="1024" stepKey="resizeWindowToDesktop"/>
32+
<resizeWindow width="1920" height="1080" stepKey="resizeWindowToDesktop"/>
3333
<deleteData createDataKey="createSubCategory" stepKey="deleteSubCategory"/>
3434
<deleteData createDataKey="createParentCategory" stepKey="deleteParentCategory"/>
3535
</after>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,6 @@
187187

188188
<!-- Scroll so that the description is visible and More info tab is on the upper middle of the page -->
189189
<scrollTo selector="{{StorefrontProductInfoDetailsSection.detailsTab}}" stepKey="scrollToMoreInfoTab"/>
190-
<resizeWindow width="1280" height="1024" stepKey="resizeWindowToDesktop"/>
190+
<resizeWindow width="1920" height="1080" stepKey="resizeWindowToDesktop"/>
191191
</test>
192192
</tests>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
2424
</before>
2525
<after>
26-
<resizeWindow width="1280" height="1024" stepKey="resizeWindowToDesktop"/>
26+
<resizeWindow width="1920" height="1080" stepKey="resizeWindowToDesktop"/>
2727
<actionGroup ref="DeleteProductBySkuActionGroup" stepKey="deleteProduct">
2828
<argument name="sku" value="{{SimpleProduct.sku}}"/>
2929
</actionGroup>
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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+
namespace Magento\CatalogGraphQl\Model\Resolver\Cache\Product\MediaGallery;
9+
10+
use Magento\Catalog\Model\Product;
11+
use Magento\Framework\EntityManager\HydratorPool;
12+
use Magento\Framework\EntityManager\TypeResolver;
13+
use Magento\GraphQlResolverCache\Model\Resolver\Result\DehydratorInterface;
14+
15+
/**
16+
* MediaGallery resolver data dehydrator to create snapshot data necessary to restore model.
17+
*/
18+
class ProductModelDehydrator implements DehydratorInterface
19+
{
20+
/**
21+
* @var TypeResolver
22+
*/
23+
private TypeResolver $typeResolver;
24+
25+
/**
26+
* @var HydratorPool
27+
*/
28+
private HydratorPool $hydratorPool;
29+
30+
/**
31+
* @param HydratorPool $hydratorPool
32+
* @param TypeResolver $typeResolver
33+
*/
34+
public function __construct(
35+
HydratorPool $hydratorPool,
36+
TypeResolver $typeResolver
37+
) {
38+
$this->typeResolver = $typeResolver;
39+
$this->hydratorPool = $hydratorPool;
40+
}
41+
42+
/**
43+
* @inheritdoc
44+
*/
45+
public function dehydrate(array &$resolvedValue): void
46+
{
47+
if (count($resolvedValue) > 0) {
48+
$firstKey = array_key_first($resolvedValue);
49+
$this->dehydrateMediaGalleryEntity($resolvedValue[$firstKey]);
50+
foreach ($resolvedValue as $key => &$value) {
51+
if ($key !== $firstKey) {
52+
unset($value['model']);
53+
}
54+
}
55+
}
56+
}
57+
58+
/**
59+
* Dehydrate the resolved value of a media gallery entity.
60+
*
61+
* @param array $mediaGalleryEntityResolvedValue
62+
* @return void
63+
* @throws \Exception
64+
*/
65+
private function dehydrateMediaGalleryEntity(array &$mediaGalleryEntityResolvedValue): void
66+
{
67+
if (array_key_exists('model', $mediaGalleryEntityResolvedValue)
68+
&& $mediaGalleryEntityResolvedValue['model'] instanceof Product) {
69+
/** @var Product $model */
70+
$model = $mediaGalleryEntityResolvedValue['model'];
71+
$entityType = $this->typeResolver->resolve($model);
72+
$mediaGalleryEntityResolvedValue['model_info']['model_data'] = $this->hydratorPool->getHydrator($entityType)
73+
->extract($model);
74+
$mediaGalleryEntityResolvedValue['model_info']['model_entity_type'] = $entityType;
75+
$mediaGalleryEntityResolvedValue['model_info']['model_id'] = $model->getId();
76+
unset($mediaGalleryEntityResolvedValue['model']);
77+
}
78+
}
79+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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+
namespace Magento\CatalogGraphQl\Model\Resolver\Cache\Product\MediaGallery;
9+
10+
use Magento\Catalog\Model\Product;
11+
use Magento\Catalog\Model\ProductFactory;
12+
use Magento\Framework\EntityManager\HydratorPool;
13+
use Magento\GraphQlResolverCache\Model\Resolver\Result\HydratorInterface;
14+
use Magento\GraphQlResolverCache\Model\Resolver\Result\PrehydratorInterface;
15+
16+
/**
17+
* Product resolver data hydrator to rehydrate propagated model.
18+
*/
19+
class ProductModelHydrator implements HydratorInterface, PrehydratorInterface
20+
{
21+
/**
22+
* @var ProductFactory
23+
*/
24+
private ProductFactory $productFactory;
25+
26+
/**
27+
* @var Product[]
28+
*/
29+
private array $products = [];
30+
31+
/**
32+
* @var HydratorPool
33+
*/
34+
private HydratorPool $hydratorPool;
35+
36+
/**
37+
* @param ProductFactory $productFactory
38+
* @param HydratorPool $hydratorPool
39+
*/
40+
public function __construct(
41+
ProductFactory $productFactory,
42+
HydratorPool $hydratorPool
43+
) {
44+
$this->hydratorPool = $hydratorPool;
45+
$this->productFactory = $productFactory;
46+
}
47+
48+
/**
49+
* @inheritdoc
50+
*/
51+
public function hydrate(array &$resolverData): void
52+
{
53+
if (array_key_exists('model_info', $resolverData)) {
54+
if (isset($this->products[$resolverData['model_info']['model_id']])) {
55+
$resolverData['model'] = $this->products[$resolverData['model_info']['model_id']];
56+
} else {
57+
$hydrator = $this->hydratorPool->getHydrator($resolverData['model_info']['model_entity_type']);
58+
$model = $this->productFactory->create();
59+
$hydrator->hydrate($model, $resolverData['model_info']['model_data']);
60+
$this->products[$resolverData['model_info']['model_id']] = $model;
61+
$resolverData['model'] = $this->products[$resolverData['model_info']['model_id']];
62+
}
63+
unset($resolverData['model_info']);
64+
}
65+
}
66+
67+
/**
68+
* @inheritDoc
69+
*/
70+
public function prehydrate(array &$resolverData): void
71+
{
72+
$firstKey = array_key_first($resolverData);
73+
foreach ($resolverData as &$value) {
74+
$value['model_info'] = &$resolverData[$firstKey]['model_info'];
75+
}
76+
}
77+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
namespace Magento\CatalogGraphQl\Model\Resolver\Cache\Product\MediaGallery;
9+
10+
use Magento\Catalog\Model\Product;
11+
use Magento\GraphQlResolverCache\Model\Resolver\Result\Cache\IdentityInterface;
12+
13+
/**
14+
* Identity for resolved media gallery for resolver cache type
15+
*/
16+
class ResolverCacheIdentity implements IdentityInterface
17+
{
18+
/**
19+
* @var string
20+
*/
21+
public const CACHE_TAG = 'gql_media_gallery';
22+
23+
/**
24+
* @inheritDoc
25+
*/
26+
public function getIdentities($resolvedData, ?array $parentResolvedData = null): array
27+
{
28+
if (empty($resolvedData)) {
29+
return [];
30+
}
31+
/** @var Product $mediaGalleryEntryProduct */
32+
$mediaGalleryEntryProduct = array_pop($resolvedData)['model'];
33+
return [
34+
sprintf('%s_%s', self::CACHE_TAG, $mediaGalleryEntryProduct->getId())
35+
];
36+
}
37+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
namespace Magento\CatalogGraphQl\Model\Resolver\Cache\Product\MediaGallery;
9+
10+
use Magento\Catalog\Model\Product;
11+
use Magento\CatalogGraphQl\Model\Resolver\Product\MediaGallery\ChangeDetector;
12+
use Magento\Framework\App\Cache\Tag\StrategyInterface;
13+
14+
class TagsStrategy implements StrategyInterface
15+
{
16+
/**
17+
* @var ChangeDetector
18+
*/
19+
private $mediaGalleryChangeDetector;
20+
21+
/**
22+
* @param ChangeDetector $mediaGalleryChangeDetector
23+
*/
24+
public function __construct(ChangeDetector $mediaGalleryChangeDetector)
25+
{
26+
$this->mediaGalleryChangeDetector = $mediaGalleryChangeDetector;
27+
}
28+
29+
/**
30+
* @inheritDoc
31+
*/
32+
public function getTags($object)
33+
{
34+
if ($object instanceof Product &&
35+
!$object->isObjectNew() &&
36+
$this->mediaGalleryChangeDetector->isChanged($object)
37+
) {
38+
return [
39+
sprintf('%s_%s', ResolverCacheIdentity::CACHE_TAG, $object->getId())
40+
];
41+
}
42+
43+
return [];
44+
}
45+
}

0 commit comments

Comments
 (0)