Skip to content

Commit 70223c0

Browse files
🔃 [Magento Community Engineering] Community Contributions - 2.4-develop
Accepted Community Pull Requests: - #29967: The "three dots" context menu is not closed after unsuccessful licensing from Media Gallery (by @joweecaquicla) - #29929: [MFTF] add new AdminDeleteTaxRateActionGroup (by @Usik2203) - #29895: #1794: [MFTF] Unskip AdminMediaGalleryCatalogUiVerifyUsedInLinkCategoryGridTest (by @joweecaquicla) - #27446: Convert MSRP currency of configurable product options (by @ashokadewit) - #26527: issue/26526 Fix orderRepository does not check if there are no extens… (by @PascalBrouwers) Fixed GitHub Issues: - #29940: [Issue] [MFTF] add new AdminDeleteTaxRateActionGroup (reported by @m2-assistant[bot]) has been fixed in #29929 by @Usik2203 in 2.4-develop branch Related commits: 1. d0ba337 2. caaf469 3. 03932b5 4. 204c4d9 5. b919939 6. 9a5688d - #29603: [Issue] Convert MSRP currency of configurable product options (reported by @m2-assistant[bot]) has been fixed in #27446 by @ashokadewit in 2.4-develop branch Related commits: 1. 3f616ad 2. a93dbd8 3. d07e0a9 - #26526: orderRepository does not check if there are no extensionAttributes (reported by @PascalBrouwers) has been fixed in #26527 by @PascalBrouwers in 2.4-develop branch Related commits: 1. 7a04c04 2. 6ee28c8 3. bb40898 4. ff12e39
2 parents 468128c + c3b95fd commit 70223c0

21 files changed

+361
-59
lines changed

app/code/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ protected function getOptionPrices()
326326
'tierPrices' => $tierPrices,
327327
'msrpPrice' => [
328328
'amount' => $this->localeFormat->getNumber(
329-
$product->getMsrp()
329+
$this->priceCurrency->convertAndRound($product->getMsrp())
330330
),
331331
],
332332
];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
10+
<test name="StorefrontConfigurableProductMSRPCovertTest">
11+
<annotations>
12+
<features value="ConfigurableProduct"/>
13+
<stories value="View configurable product options, verify convert MSRP currency on storefront."/>
14+
<title value="Verify convert MSRP currency of configurable product options"/>
15+
<description value="Check convert MSRP currency of configurable product options."/>
16+
<testCaseId value="MC-37575"/>
17+
<severity value="MAJOR"/>
18+
<group value="ConfigurableProduct"/>
19+
</annotations>
20+
21+
<before>
22+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
23+
24+
<createData entity="SimpleSubCategory" stepKey="createCategory"/>
25+
26+
<createData entity="ApiConfigurableProduct" stepKey="createConfigProduct">
27+
<requiredEntity createDataKey="createCategory"/>
28+
</createData>
29+
30+
<createData entity="productAttributeWithTwoOptions" stepKey="createConfigProductAttribute"/>
31+
<createData entity="productAttributeOption1" stepKey="createConfigProductAttributeOption1">
32+
<requiredEntity createDataKey="createConfigProductAttribute"/>
33+
</createData>
34+
<createData entity="productAttributeOption2" stepKey="createConfigProductAttributeOption2">
35+
<requiredEntity createDataKey="createConfigProductAttribute"/>
36+
</createData>
37+
<createData entity="AddToDefaultSet" stepKey="createConfigAddToAttributeSet">
38+
<requiredEntity createDataKey="createConfigProductAttribute"/>
39+
</createData>
40+
<getData entity="ProductAttributeOptionGetter" index="1" stepKey="getConfigAttributeOption1">
41+
<requiredEntity createDataKey="createConfigProductAttribute"/>
42+
</getData>
43+
<getData entity="ProductAttributeOptionGetter" index="2" stepKey="getConfigAttributeOption2">
44+
<requiredEntity createDataKey="createConfigProductAttribute"/>
45+
</getData>
46+
47+
<createData entity="ApiSimpleProductWithPrice50" stepKey="createConfigChildProduct1">
48+
<requiredEntity createDataKey="createConfigProductAttribute"/>
49+
<requiredEntity createDataKey="getConfigAttributeOption1"/>
50+
</createData>
51+
<createData entity="ApiSimpleProductWithPrice60" stepKey="createConfigChildProduct2">
52+
<requiredEntity createDataKey="createConfigProductAttribute"/>
53+
<requiredEntity createDataKey="getConfigAttributeOption2"/>
54+
</createData>
55+
56+
<createData entity="ConfigurableProductTwoOptions" stepKey="createConfigProductOption">
57+
<requiredEntity createDataKey="createConfigProduct"/>
58+
<requiredEntity createDataKey="createConfigProductAttribute"/>
59+
<requiredEntity createDataKey="getConfigAttributeOption1"/>
60+
<requiredEntity createDataKey="getConfigAttributeOption2"/>
61+
</createData>
62+
<createData entity="ConfigurableProductAddChild" stepKey="createConfigProductAddChild1">
63+
<requiredEntity createDataKey="createConfigProduct"/>
64+
<requiredEntity createDataKey="createConfigChildProduct1"/>
65+
</createData>
66+
<createData entity="ConfigurableProductAddChild" stepKey="createConfigProductAddChild2">
67+
<requiredEntity createDataKey="createConfigProduct"/>
68+
<requiredEntity createDataKey="createConfigChildProduct2"/>
69+
</createData>
70+
71+
<createData entity="MsrpEnableMAP" stepKey="enableMAP"/>
72+
<magentoCLI command="config:set currency/options/allow EUR,USD" stepKey="setCurrencyAllow"/>
73+
</before>
74+
<after>
75+
76+
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
77+
<deleteData createDataKey="createConfigProduct" stepKey="deleteConfigProduct"/>
78+
<deleteData createDataKey="createConfigChildProduct1" stepKey="deleteConfigChildProduct1"/>
79+
<deleteData createDataKey="createConfigChildProduct2" stepKey="deleteConfigChildProduct2"/>
80+
<deleteData createDataKey="createConfigProductAttribute" stepKey="deleteConfigProductAttribute"/>
81+
<createData entity="MsrpDisableMAP" stepKey="disableMAP"/>
82+
<magentoCLI command="config:set currency/options/allow USD" stepKey="setCurrencyAllow"/>
83+
<actionGroup ref="AdminLogoutActionGroup" stepKey="logoutOfAdmin"/>
84+
</after>
85+
86+
<actionGroup ref="AdminProductPageOpenByIdActionGroup" stepKey="goToFirstChildProductEditPage">
87+
<argument name="productId" value="$$createConfigChildProduct1.id$$"/>
88+
</actionGroup>
89+
<waitForPageLoad stepKey="waitForProductPageLoad"/>
90+
<actionGroup ref="AdminSetAdvancedPricingActionGroup" stepKey="setAdvancedPricingFirst">
91+
<argument name="advancedPrice" value="100"/>
92+
</actionGroup>
93+
94+
<actionGroup ref="AdminProductPageOpenByIdActionGroup" stepKey="goToSecondChildProductEditPage">
95+
<argument name="productId" value="$$createConfigChildProduct2.id$$"/>
96+
</actionGroup>
97+
<waitForPageLoad stepKey="waitForProductPageLoad1"/>
98+
<actionGroup ref="AdminSetAdvancedPricingActionGroup" stepKey="setAdvancedPricingSecond">
99+
<argument name="advancedPrice" value="100"/>
100+
</actionGroup>
101+
102+
<actionGroup ref="CliCacheFlushActionGroup" stepKey="flushCache">
103+
<argument name="tags" value=""/>
104+
</actionGroup>
105+
106+
<actionGroup ref="OpenStoreFrontProductPageActionGroup" stepKey="navigateToProduct">
107+
<argument name="productUrlKey" value="$$createConfigProduct.custom_attributes[url_key]$$"/>
108+
</actionGroup>
109+
110+
<actionGroup ref="StorefrontSwitchCurrencyActionGroup" stepKey="switchEURCurrency">
111+
<argument name="currency" value="EUR"/>
112+
</actionGroup>
113+
114+
<selectOption selector="{{StorefrontProductInfoMainSection.productAttributeOptionsSelectButton}}" userInput="$$getConfigAttributeOption1.value$$" stepKey="selectFirstOption"/>
115+
<waitForElement selector="{{StorefrontProductInfoMainSection.mapPrice}}" stepKey="waitForLoad"/>
116+
<grabTextFrom selector="{{StorefrontProductInfoMainSection.mapPrice}}" stepKey="grabProductMapPrice"/>
117+
<assertNotEquals stepKey="assertProductMapPrice">
118+
<actualResult type="const">($grabProductMapPrice)</actualResult>
119+
<expectedResult type="string">€100.00</expectedResult>
120+
</assertNotEquals>
121+
</test>
122+
</tests>

app/code/Magento/MediaGalleryCatalogUi/Test/Mftf/ActionGroup/AssertAdminCategoryGridPageImageColumnActionGroup.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
<description>Assert category grid page image column a specific category</description>
1616
</annotations>
1717

18-
<seeElement selector="{{AdminMediaGalleryCatalogUiCategoryGridSection.image(file)}}" stepKey="assertImageColumn"/>
18+
<grabAttributeFrom selector="{{AdminMediaGalleryCatalogUiCategoryGridSection.image}}" userInput="src"
19+
stepKey="getImageSrc"/>
20+
<assertStringContainsString stepKey="assertImageSrc">
21+
<actualResult type="string">{$getImageSrc}</actualResult>
22+
<expectedResult type="string">{{file}}</expectedResult>
23+
</assertStringContainsString>
1924
</actionGroup>
2025
</actionGroups>

app/code/Magento/MediaGalleryCatalogUi/Test/Mftf/Section/AdminMediaGalleryCatalogUiCategoryGridSection.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<section name="AdminMediaGalleryCatalogUiCategoryGridSection">
1212
<element name="clearFilters" type="button" selector=".admin__data-grid-header [data-action='grid-filter-reset']" timeout="30"/>
1313
<element name="activeFilterPlaceholder" type="text" selector="//div[@class='admin__current-filters-list-wrap']//li//span[contains(text(), '{{filterPlaceholder}}')]" parameterized="true"/>
14-
<element name="image" type="text" selector="//tr//td[count(//div[@data-role='grid-wrapper']//tr//th[contains(., 'Image')]/preceding-sibling::th) +1]//img[contains(@src, '{{file}}')]" parameterized="true"/>
14+
<element name="image" type="text" selector="//tr//td[count(//div[@data-role='grid-wrapper']//tr//th[contains(., 'Image')]/preceding-sibling::th) +1]//img"/>
1515
<element name="columnValue" type="text" selector="//tr//td[count(//div[@data-role='grid-wrapper']//tr//th[contains(., '{{columnName}}')]/preceding-sibling::th) +1 ]//div" parameterized="true"/>
1616
<element name="edit" type="button" selector="//tr[td//text()[contains(., '{{categoryName}}')]]//td[count(//div[@data-role='grid-wrapper']//tr//th[contains(., 'Action')]/preceding-sibling::th) +1 ]//*[text()='{{actionButton}}']" parameterized="true"/>
1717
</section>

app/code/Magento/MediaGalleryCatalogUi/Test/Mftf/Test/AdminMediaGalleryCatalogUiVerifyUsedInLinkCategoryGridTest.xml

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@
99
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
1010
<test name="AdminMediaGalleryCatalogUiVerifyUsedInLinkCategoryGridTest">
1111
<annotations>
12-
<skip>
13-
<issueId value="https://github.com/magento/adobe-stock-integration/issues/1794"/>
14-
</skip>
1512
<features value="AdminMediaGalleryCategoryGrid"/>
1613
<useCaseId value="https://github.com/magento/adobe-stock-integration/issues/1503"/>
1714
<title value="User can open each entity the asset is associated with in a separate tab to manage association"/>
@@ -26,19 +23,30 @@
2623
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
2724
</before>
2825
<after>
29-
<actionGroup ref="AdminEnhancedMediaGalleryEnableMassActionModeActionGroup" stepKey="enableMassActionToDeleteImages"/>
30-
<actionGroup ref="AdminEnhancedMediaGallerySelectImageForMassActionActionGroup" stepKey="selectSecondImageToDelete">
31-
<argument name="imageName" value="{{UpdatedImageDetails.title}}"/>
26+
<actionGroup ref="ResetAdminDataGridToDefaultViewActionGroup" stepKey="resetAdminDataGridToDefaultView"/>
27+
<actionGroup ref="AdminMediaGalleryFolderSelectActionGroup" stepKey="selectFolderForDelete">
28+
<argument name="name" value="categoryImage"/>
29+
</actionGroup>
30+
<actionGroup ref="AdminMediaGalleryFolderDeleteActionGroup" stepKey="deleteFolder"/>
31+
<actionGroup ref="AdminMediaGalleryAssertFolderDoesNotExistActionGroup" stepKey="assertFolderWasDeleted">
32+
<argument name="name" value="categoryImage"/>
3233
</actionGroup>
33-
<actionGroup ref="AdminEnhancedMediaGalleryClickDeleteImagesButtonActionGroup" stepKey="clikDeleteSelectedButton"/>
34-
<actionGroup ref="AdminEnhancedMediaGalleryConfirmDeleteImagesActionGroup" stepKey="deleteImages"/>
3534
</after>
36-
3735
<actionGroup ref="AdminOpenCategoryPageActionGroup" stepKey="openCategoryPage"/>
3836
<actionGroup ref="AdminCategoriesOpenCategoryActionGroup" stepKey="openCategory">
3937
<argument name="category" value="$$category$$"/>
4038
</actionGroup>
4139
<actionGroup ref="AdminOpenMediaGalleryFromCategoryImageUploaderActionGroup" stepKey="openMediaGalleryFromImageUploader"/>
40+
<waitForLoadingMaskToDisappear stepKey="waitForLoadingMaskToDisappear" />
41+
<actionGroup ref="ResetAdminDataGridToDefaultViewActionGroup" stepKey="resetCategoryImageGalleryGridToDefaultView"/>
42+
<actionGroup ref="ClearFiltersAdminDataGridActionGroup" stepKey="clearFilter"/>
43+
<actionGroup ref="AdminMediaGalleryOpenNewFolderFormActionGroup" stepKey="openNewFolderForm"/>
44+
<actionGroup ref="AdminMediaGalleryCreateNewFolderActionGroup" stepKey="createCategoryImageFolder">
45+
<argument name="name" value="categoryImage"/>
46+
</actionGroup>
47+
<actionGroup ref="AdminMediaGalleryAssertFolderNameActionGroup" stepKey="assertCategoryImageFolderCreated">
48+
<argument name="name" value="categoryImage"/>
49+
</actionGroup>
4250
<actionGroup ref="AdminEnhancedMediaGalleryUploadImageActionGroup" stepKey="uploadImage">
4351
<argument name="image" value="ImageUpload"/>
4452
</actionGroup>
@@ -51,6 +59,10 @@
5159
<actionGroup ref="AdminMediaGalleryClickAddSelectedActionGroup" stepKey="clickAddSelectedCategoryImage"/>
5260
<actionGroup ref="AdminSaveCategoryActionGroup" stepKey="saveCategory"/>
5361
<actionGroup ref="AdminOpenMediaGalleryFromCategoryImageUploaderActionGroup" stepKey="openMediaGalleryFromImageUploaderToVerifyLink"/>
62+
<actionGroup ref="AdminMediaGalleryFolderSelectActionGroup" stepKey="selectCategoryImageFolder">
63+
<argument name="name" value="categoryImage"/>
64+
</actionGroup>
65+
<waitForLoadingMaskToDisappear stepKey="waitForLoadingMaskToDisappear2"/>
5466
<actionGroup ref="AdminEnhancedMediaGalleryViewImageDetails" stepKey="openViewImageDetails"/>
5567
<actionGroup ref="AdminEnhancedMediaGalleryClickEntityUsedInActionGroup" stepKey="clickUsedInCategories">
5668
<argument name="entityName" value="Categories"/>
@@ -80,13 +92,15 @@
8092
<actionGroup ref="AssertAdminMediaGalleryAssetFilterPlaceHolderActionGroup" stepKey="assertFilterAppliedAfterUrlFilterApplier">
8193
<argument name="filterPlaceholder" value="{{UpdatedImageDetails.title}}"/>
8294
</actionGroup>
83-
<actionGroup ref="ResetAdminDataGridToDefaultViewActionGroup" stepKey="resetAdminDataGridToDefaultView"/>
95+
<actionGroup ref="ResetAdminDataGridToDefaultViewActionGroup" stepKey="secondResetAdminDataGridToDefaultView"/>
8496

8597
<deleteData createDataKey="category" stepKey="deleteCategory"/>
8698
<actionGroup ref="AdminOpenStandaloneMediaGalleryActionGroup" stepKey="openMediaGallery"/>
87-
<actionGroup ref="AdminEnhancedMediaGalleryViewImageDetails" stepKey="openViewImageDetailsToVerfifyEmptyUsedIn"/>
99+
<actionGroup ref="AdminMediaGalleryFolderSelectActionGroup" stepKey="openCategoryImageFolder">
100+
<argument name="name" value="categoryImage"/>
101+
</actionGroup>
102+
<actionGroup ref="AdminEnhancedMediaGalleryViewImageDetails" stepKey="openViewImageDetailsToVerifyEmptyUsedIn"/>
88103
<actionGroup ref="AssertAdminEnhancedMediaGalleryUsedInSectionNotDisplayedActionGroup" stepKey="assertThereIsNoUsedInSection"/>
89104
<actionGroup ref="AdminEnhancedMediaGalleryCloseViewDetailsActionGroup" stepKey="closeDetails"/>
90-
91105
</test>
92106
</tests>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
10+
<actionGroup name="AssertAdminMediaGalleryContextMenuOpenedActionGroup">
11+
<annotations>
12+
<description>Verify that context menu is closed in Media Gallery.</description>
13+
</annotations>
14+
<dontSeeElement selector="{{AdminEnhancedMediaGalleryImageActionsSection.contextMenuItem}}" stepKey="verifyContextMenuIsClosed" />
15+
</actionGroup>
16+
</actionGroups>

app/code/Magento/MediaGalleryUi/Test/Mftf/Data/AdminEnhancedMediaGalleryImageData.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<data key="fileName">png</data>
2525
<data key="extension">png</data>
2626
</entity>
27-
<entity name="ImageUploadGif" type="uploadImage">
27+
<entity name="ImageUploadGif" type="uploadImage">
2828
<data key="title" unique="suffix">Image1</data>
2929
<data key="file_type">Upload File</data>
3030
<data key="value">gif.gif</data>

app/code/Magento/MediaGalleryUi/Test/Mftf/Section/AdminEnhancedMediaGalleryImageActionsSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd">
1010
<section name="AdminEnhancedMediaGalleryImageActionsSection">
1111
<element name="openContextMenu" type="button" selector=".three-dots"/>
12+
<element name="contextMenuItem" type="block" selector="//div[@class='media-gallery-image']//ul[@class='action-menu _active']//li//a[@class='action-menu-item']"/>
1213
<element name="viewDetails" type="button" selector="[data-ui-id='action-image-details']"/>
1314
<element name="delete" type="button" selector="[data-ui-id='action-delete']"/>
1415
<element name="edit" type="button" selector="[data-ui-id='action-edit']"/>

app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/grid/columns/image.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ define([
1818
deleteImageUrl: 'media_gallery/image/delete',
1919
addSelectedBtnSelector: '#add_selected',
2020
deleteSelectedBtnSelector: '#delete_selected',
21+
gridSelector: '[data-id="media-gallery-masonry-grid"]',
2122
selected: null,
2223
allowedActions: [],
2324
fields: {
@@ -281,6 +282,7 @@ define([
281282
*/
282283
addMessage: function (code, message) {
283284
this.messages().add(code, message);
285+
this.closeContextMenu();
284286
this.scrollToMessageContent();
285287
this.messages().scheduleCleanup();
286288
},
@@ -298,6 +300,13 @@ define([
298300
}
299301
},
300302

303+
/**
304+
* Action to close the context menu in media gallery.
305+
*/
306+
closeContextMenu: function () {
307+
$(this.gridSelector).click();
308+
},
309+
301310
/**
302311
* Scroll to the top of media gallery page
303312
*/
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="AdminSetAdvancedPricingActionGroup">
12+
<annotations>
13+
<description>Set advanced pricing and Save product on the Admin Product creation/edit page.</description>
14+
</annotations>
15+
<arguments>
16+
<argument name="advancedPrice" type="string"/>
17+
</arguments>
18+
19+
<click selector="{{AdminProductFormSection.advancedPricingLink}}" stepKey="clickOnAdvancedPricingButton"/>
20+
<waitForElement selector="{{AdminProductFormAdvancedPricingSection.msrp}}" stepKey="waitForMsrp"/>
21+
<fillField selector="{{AdminProductFormAdvancedPricingSection.msrp}}" userInput="{{advancedPrice}}" stepKey="setMsrpForFirstChildProduct"/>
22+
<click selector="{{AdminProductFormAdvancedPricingSection.doneButton}}" stepKey="clickDoneButton"/>
23+
<scrollToTopOfPage stepKey="scrollTopPageProduct"/>
24+
<waitForElementVisible selector="{{AdminProductFormActionSection.saveButton}}" stepKey="waitForSaveProductButton"/>
25+
<click selector="{{AdminProductFormActionSection.saveButton}}" stepKey="clickSaveProduct"/>
26+
<waitForElementVisible selector="{{AdminMessagesSection.success}}" stepKey="waitProductSaveSuccessMessage"/>
27+
<see selector="{{AdminMessagesSection.success}}" userInput="You saved the product." stepKey="seeSaveConfirmation"/>
28+
</actionGroup>
29+
</actionGroups>

0 commit comments

Comments
 (0)