Skip to content

Commit e34c795

Browse files
authored
Merge pull request #5048 from magento-tsg/2.3-develop-pr96
[TSG] Fixes for 2.3 (pr96) (2.3-develop)
2 parents 121fadd + e84483d commit e34c795

File tree

33 files changed

+661
-65
lines changed

33 files changed

+661
-65
lines changed

app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/checkbox.phtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<?php $_selections = $_option->getSelections(); ?>
1111
<?php $_skipSaleableCheck = $this->helper(Magento\Catalog\Helper\Product::class)->getSkipSaleableCheck(); ?>
1212

13-
<div class="field admin__field options<?php if ($_option->getRequired()) { echo ' required _required'; } ?>">
13+
<div class="field admin__field options<?php if ($_option->getRequired()) { echo ' _required'; } ?>">
1414
<label class="label admin__field-label">
1515
<span><?= $block->escapeHtml($_option->getTitle()) ?></span>
1616
</label>

app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/multi.phtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<?php $_option = $block->getOption(); ?>
1010
<?php $_selections = $_option->getSelections(); ?>
1111
<?php $_skipSaleableCheck = $this->helper(Magento\Catalog\Helper\Product::class)->getSkipSaleableCheck(); ?>
12-
<div class="field admin__field <?php if ($_option->getRequired()) { echo ' required'; } ?><?php if ($_option->getDecoratedIsLast()) :?> last<?php endif; ?>">
12+
<div class="field admin__field <?php if ($_option->getRequired()) { echo ' _required'; } ?><?php if ($_option->getDecoratedIsLast()) :?> last<?php endif; ?>">
1313
<label class="label admin__field-label"><span><?= $block->escapeHtml($_option->getTitle()) ?></span></label>
1414
<div class="control admin__field-control">
1515
<?php if (count($_selections) == 1 && $_option->getRequired()) : ?>

app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/radio.phtml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<?php $_skipSaleableCheck = $this->helper(Magento\Catalog\Helper\Product::class)->getSkipSaleableCheck(); ?>
1313
<?php list($_defaultQty, $_canChangeQty) = $block->getDefaultValues(); ?>
1414

15-
<div class="field admin__field options<?php if ($_option->getRequired()) { echo ' required'; } ?>">
15+
<div class="field admin__field options<?php if ($_option->getRequired()) { echo ' _required'; } ?>">
1616
<label class="label admin__field-label"><span><?= $block->escapeHtml($_option->getTitle()) ?></span></label>
1717
<div class="control admin__field-control">
1818
<div class="nested<?php if ($_option->getDecoratedIsLast()) :?> last<?php endif; ?>">
@@ -39,7 +39,7 @@
3939
<?php foreach ($_selections as $_selection) : ?>
4040
<div class="field choice admin__field admin__field-option">
4141
<input type="radio"
42-
class="radio admin__control-radio <?= $_option->getRequired() ? ' validate-one-required-by-name' : '' ?> change-container-classname"
42+
class="radio admin__control-radio <?= $_option->getRequired() ? ' required-entry' : '' ?> change-container-classname"
4343
id="bundle-option-<?= $block->escapeHtmlAttr($_option->getId()) ?>-<?= $block->escapeHtmlAttr($_selection->getSelectionId()) ?>"
4444
name="bundle_option[<?= $block->escapeHtmlAttr($_option->getId()) ?>]"
4545
<?php if ($block->isSelected($_selection)) { echo ' checked="checked"'; } ?>
@@ -66,7 +66,7 @@
6666
</label>
6767
<div class="control admin__field-control"><input <?php if (!$_canChangeQty) { echo ' disabled="disabled"'; } ?>
6868
id="bundle-option-<?= $block->escapeHtmlAttr($_option->getId()) ?>-qty-input"
69-
class="input-text admin__control-text qty<?php if (!$_canChangeQty) { echo ' qty-disabled'; } ?>"
69+
class="input-text admin__control-text qty validate-greater-than-zero<?php if (!$_canChangeQty) { echo ' qty-disabled'; } ?>"
7070
type="text"
7171
name="bundle_option_qty[<?= $block->escapeHtmlAttr($_option->getId()) ?>]"
7272
value="<?= $block->escapeHtmlAttr($_defaultQty) ?>" />

app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/select.phtml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<?php $_skipSaleableCheck = $this->helper(Magento\Catalog\Helper\Product::class)->getSkipSaleableCheck(); ?>
1313
<?php list($_defaultQty, $_canChangeQty) = $block->getDefaultValues(); ?>
1414

15-
<div class="field admin__field option<?php if ($_option->getDecoratedIsLast()) :?> last<?php endif; ?><?php if ($_option->getRequired()) { echo ' required _required'; } ?>">
15+
<div class="field admin__field option<?php if ($_option->getDecoratedIsLast()) :?> last<?php endif; ?><?php if ($_option->getRequired()) { echo ' _required'; } ?>">
1616
<label class="label admin__field-label"><span><?= $block->escapeHtml($_option->getTitle()) ?></span></label>
1717
<div class="control admin__field-control">
1818
<?php if ($block->showSingle()) : ?>
@@ -49,7 +49,7 @@
4949
<div class="control admin__field-control">
5050
<input <?php if (!$_canChangeQty) { echo ' disabled="disabled"'; } ?>
5151
id="bundle-option-<?= $block->escapeHtmlAttr($_option->getId()) ?>-qty-input"
52-
class="input-text admin__control-text qty<?php if (!$_canChangeQty) { echo ' qty-disabled'; } ?>"
52+
class="input-text admin__control-text qty validate-greater-than-zero<?php if (!$_canChangeQty) { echo ' qty-disabled'; } ?>"
5353
type="text"
5454
name="bundle_option_qty[<?= $block->escapeHtmlAttr($_option->getId()) ?>]"
5555
value="<?= $block->escapeHtmlAttr($_defaultQty) ?>" />

app/code/Magento/Catalog/Model/Product/Gallery/CreateHandler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ public function execute($product, $arguments = [])
162162

163163
if (!empty($image['removed'])) {
164164
$clearImages[] = $image['file'];
165-
} elseif (empty($image['value_id'])) {
165+
} elseif (empty($image['value_id']) || !empty($image['recreate'])) {
166166
$newFile = $this->moveImageFromTmp($image['file']);
167167
$image['new_file'] = $newFile;
168168
$newImages[$image['file']] = $image;

app/code/Magento/Catalog/Model/Product/Gallery/GalleryManagement.php

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,12 @@ public function create($sku, ProductAttributeMediaGalleryEntryInterface $entry)
7171
$product->setMediaGalleryEntries($existingMediaGalleryEntries);
7272
try {
7373
$product = $this->productRepository->save($product);
74-
} catch (InputException $inputException) {
75-
throw $inputException;
7674
} catch (\Exception $e) {
77-
throw new StateException(__("The product can't be saved."));
75+
if ($e instanceof InputException) {
76+
throw $e;
77+
} else {
78+
throw new StateException(__("The product can't be saved."));
79+
}
7880
}
7981

8082
foreach ($product->getMediaGalleryEntries() as $entry) {
@@ -98,19 +100,13 @@ public function update($sku, ProductAttributeMediaGalleryEntryInterface $entry)
98100
);
99101
}
100102
$found = false;
103+
$entryTypes = (array)$entry->getTypes();
101104
foreach ($existingMediaGalleryEntries as $key => $existingEntry) {
102-
$entryTypes = (array)$entry->getTypes();
103-
$existingEntryTypes = (array)$existingMediaGalleryEntries[$key]->getTypes();
104-
$existingMediaGalleryEntries[$key]->setTypes(array_diff($existingEntryTypes, $entryTypes));
105+
$existingEntryTypes = (array)$existingEntry->getTypes();
106+
$existingEntry->setTypes(array_diff($existingEntryTypes, $entryTypes));
105107

106108
if ($existingEntry->getId() == $entry->getId()) {
107109
$found = true;
108-
109-
$file = $entry->getContent();
110-
111-
if ($file && $file->getBase64EncodedData() || $entry->getFile()) {
112-
$entry->setId(null);
113-
}
114110
$existingMediaGalleryEntries[$key] = $entry;
115111
}
116112
}

app/code/Magento/Catalog/Model/Product/Gallery/UpdateHandler.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
namespace Magento\Catalog\Model\Product\Gallery;
77

8+
use Magento\Catalog\Model\ResourceModel\Product\Gallery;
89
use Magento\Framework\EntityManager\Operation\ExtensionInterface;
910

1011
/**
@@ -75,6 +76,16 @@ protected function processNewImage($product, array &$image)
7576
$image['value_id'],
7677
$product->getData($this->metadata->getLinkField())
7778
);
79+
} elseif (!empty($image['recreate'])) {
80+
$data['value_id'] = $image['value_id'];
81+
$data['value'] = $image['file'];
82+
$data['attribute_id'] = $this->getAttribute()->getAttributeId();
83+
84+
if (!empty($image['media_type'])) {
85+
$data['media_type'] = $image['media_type'];
86+
}
87+
88+
$this->resourceModel->saveDataRow(Gallery::GALLERY_TABLE, $data);
7889
}
7990

8091
return $data;

app/code/Magento/Catalog/Model/ProductRepository/MediaGalleryProcessor.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,17 @@ public function processMediaGallery(ProductInterface $product, array $mediaGalle
9292
if ($updatedEntry['file'] === null) {
9393
unset($updatedEntry['file']);
9494
}
95-
$existingMediaGallery[$key] = array_merge($existingEntry, $updatedEntry);
95+
if (isset($updatedEntry['content'])) {
96+
//need to recreate image and reset object
97+
$existingEntry['recreate'] = true;
98+
// phpcs:ignore Magento2.Performance.ForeachArrayMerge
99+
$newEntry = array_merge($existingEntry, $updatedEntry);
100+
$newEntries[] = $newEntry;
101+
unset($existingMediaGallery[$key]);
102+
} else {
103+
// phpcs:ignore Magento2.Performance.ForeachArrayMerge
104+
$existingMediaGallery[$key] = array_merge($existingEntry, $updatedEntry);
105+
}
96106
} else {
97107
//set the removed flag
98108
$existingEntry['removed'] = true;

app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/GalleryManagementTest.php

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
namespace Magento\Catalog\Test\Unit\Model\Product\Gallery;
99

10+
/**
11+
* Tests for \Magento\Catalog\Model\Product\Gallery\GalleryManagement.
12+
*/
1013
class GalleryManagementTest extends \PHPUnit\Framework\TestCase
1114
{
1215
/**
@@ -39,19 +42,25 @@ class GalleryManagementTest extends \PHPUnit\Framework\TestCase
3942
*/
4043
protected $attributeValueMock;
4144

45+
/**
46+
* @inheritdoc
47+
*/
4248
protected function setUp()
4349
{
4450
$this->productRepositoryMock = $this->createMock(\Magento\Catalog\Api\ProductRepositoryInterface::class);
4551
$this->contentValidatorMock = $this->createMock(\Magento\Framework\Api\ImageContentValidatorInterface::class);
46-
$this->productMock = $this->createPartialMock(\Magento\Catalog\Model\Product::class, [
52+
$this->productMock = $this->createPartialMock(
53+
\Magento\Catalog\Model\Product::class,
54+
[
4755
'setStoreId',
4856
'getData',
4957
'getStoreId',
5058
'getSku',
5159
'getCustomAttribute',
5260
'getMediaGalleryEntries',
5361
'setMediaGalleryEntries',
54-
]);
62+
]
63+
);
5564
$this->mediaGalleryEntryMock =
5665
$this->createMock(\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface::class);
5766
$this->model = new \Magento\Catalog\Model\Product\Gallery\GalleryManagement(
@@ -151,6 +160,8 @@ public function testUpdateWithNonExistingImage()
151160
$existingEntryMock->expects($this->once())->method('getId')->willReturn(43);
152161
$this->productMock->expects($this->once())->method('getMediaGalleryEntries')
153162
->willReturn([$existingEntryMock]);
163+
$existingEntryMock->expects($this->once())->method('getTypes')->willReturn([]);
164+
$entryMock->expects($this->once())->method('getTypes')->willReturn([]);
154165
$entryMock->expects($this->once())->method('getId')->willReturn($entryId);
155166
$this->model->update($productSku, $entryMock);
156167
}
@@ -172,12 +183,19 @@ public function testUpdateWithCannotSaveException()
172183
$existingEntryMock->expects($this->once())->method('getId')->willReturn($entryId);
173184
$this->productMock->expects($this->once())->method('getMediaGalleryEntries')
174185
->willReturn([$existingEntryMock]);
186+
$existingEntryMock->expects($this->once())->method('getTypes')->willReturn([]);
187+
$entryMock->expects($this->once())->method('getTypes')->willReturn([]);
175188
$entryMock->expects($this->once())->method('getId')->willReturn($entryId);
176189
$this->productRepositoryMock->expects($this->once())->method('save')->with($this->productMock)
177190
->willThrowException(new \Exception());
178191
$this->model->update($productSku, $entryMock);
179192
}
180193

194+
/**
195+
* Check update gallery entry behavior.
196+
*
197+
* @return void
198+
*/
181199
public function testUpdate()
182200
{
183201
$productSku = 'testProduct';
@@ -203,14 +221,13 @@ public function testUpdate()
203221
->willReturn([$existingEntryMock, $existingSecondEntryMock]);
204222

205223
$entryMock->expects($this->exactly(2))->method('getId')->willReturn($entryId);
206-
$entryMock->expects($this->once())->method('getFile')->willReturn("base64");
207-
$entryMock->expects($this->once())->method('setId')->with(null);
208-
$entryMock->expects($this->exactly(2))->method('getTypes')->willReturn(['image']);
224+
$entryMock->expects($this->once())->method('getTypes')->willReturn(['image']);
209225

210226
$this->productMock->expects($this->once())->method('setMediaGalleryEntries')
211227
->with([$entryMock, $existingSecondEntryMock])
212228
->willReturnSelf();
213229
$this->productRepositoryMock->expects($this->once())->method('save')->with($this->productMock);
230+
214231
$this->assertTrue($this->model->update($productSku, $entryMock));
215232
}
216233

app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/composite/fieldset/options/type/date.phtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<?php /* @var $block \Magento\Catalog\Block\Product\View\Options\Type\Date */ ?>
88
<?php $_option = $block->getOption(); ?>
99
<?php $_optionId = (int)$_option->getId(); ?>
10-
<div class="admin__field field<?= $_option->getIsRequire() ? ' required _required' : '' ?>">
10+
<div class="admin__field field<?= $_option->getIsRequire() ? ' required' : '' ?>">
1111
<label class="label admin__field-label">
1212
<?= $block->escapeHtml($_option->getTitle()) ?>
1313
<?= /* @noEscape */ $block->getFormattedPrice() ?>

app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/composite/fieldset/options/type/select.phtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
?>
77
<?php /* @var $block \Magento\Catalog\Block\Product\View\Options\Type\Select */ ?>
88
<?php $_option = $block->getOption(); ?>
9-
<div class="admin__field field<?= $_option->getIsRequire() ? ' required _required' : '' ?>">
9+
<div class="admin__field field<?= $_option->getIsRequire() ? ' _required' : '' ?>">
1010
<label class="label admin__field-label">
1111
<span><?= $block->escapeHtml($_option->getTitle()) ?></span>
1212
</label>

app/code/Magento/Catalog/view/base/templates/product/composite/fieldset/options/view/checkable.phtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ if ($option) : ?>
5353
}
5454
?>
5555

56-
<div class="field choice admin__field admin__field-option <?= /* @noEscape */ $option->getIsRequire() ? 'required': '' ?>">
56+
<div class="field choice admin__field admin__field-option">
5757
<input type="<?= $block->escapeHtmlAttr($optionType) ?>"
5858
class="<?= $optionType === Option::OPTION_TYPE_RADIO
5959
? 'radio admin__control-radio'

app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/composite/fieldset/configurable.phtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</legend>
1818
<div class="product-options fieldset admin__fieldset">
1919
<?php foreach ($_attributes as $_attribute) : ?>
20-
<div class="field admin__field _required required">
20+
<div class="field admin__field required">
2121
<label class="label admin__field-label"><?=
2222
$block->escapeHtml($_attribute->getProductAttribute()->getStoreLabel($_product->getStoreId()));
2323
?></label>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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="AdminUpdateCustomerGenderInCustomersGridActionGroup">
12+
<annotations>
13+
<description>Update customer gender attribute value on customers grid page</description>
14+
</annotations>
15+
<arguments>
16+
<argument name="customerEmail" defaultValue="{{Simple_US_Customer.email}}" type="string"/>
17+
<argument name="genderValue" defaultValue="{{Gender.empty}}" type="string"/>
18+
</arguments>
19+
20+
<click selector="{{AdminDataGridTableSection.rowTemplate(customerEmail)}}" stepKey="clickCustomersGridRow"/>
21+
<waitForElementVisible selector="{{AdminCustomerGridInlineEditorSection.customerGenderEditor}}" stepKey="waitForGenderElementAppears"/>
22+
<selectOption userInput="{{genderValue}}" selector="{{AdminCustomerGridInlineEditorSection.customerGenderEditor}}" stepKey="selectGenderValue"/>
23+
<click selector="{{AdminCustomerGridInlineEditorSection.saveInGrid}}" stepKey="saveCustomer"/>
24+
</actionGroup>
25+
</actionGroups>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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="AssertAdminCustomerGenderInCustomersGridActionGroup">
12+
<annotations>
13+
<description>Assert customer "Gender" attribute value on customer grid page</description>
14+
</annotations>
15+
<arguments>
16+
<argument name="customerEmail" defaultValue="{{Simple_US_Customer.email}}" type="string"/>
17+
<argument name="expectedGenderValue" defaultValue="{{Gender.empty}}" type="string"/>
18+
</arguments>
19+
20+
<see userInput="{{expectedGenderValue}}" selector="{{AdminCustomerGridSection.customerGenderByEmail(customerEmail)}}" stepKey="assertGenderValue"/>
21+
</actionGroup>
22+
</actionGroups>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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="AssertAdminCustomerGenderOnCustomerFormActionGroup">
12+
<annotations>
13+
<description>Validates that the provided Customer Gender is selected on the Admin Customer edit page.</description>
14+
</annotations>
15+
<arguments>
16+
<argument name="customerGender" defaultValue="{{Gender.empty}}" type="string"/>
17+
</arguments>
18+
19+
<conditionalClick selector="{{AdminCustomerAccountInformationSection.accountInformationTab}}" dependentSelector="{{AdminCustomerAccountInformationSection.gender}}" visible="false" stepKey="clickOnAccountInfoTab"/>
20+
<waitForPageLoad stepKey="waitForPageLoad"/>
21+
<seeOptionIsSelected userInput="{{customerGender}}" selector="{{AdminCustomerAccountInformationSection.gender}}" stepKey="verifyNeededCustomerGenderSelected"/>
22+
</actionGroup>
23+
</actionGroups>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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+
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd">
11+
<entity name="Gender" type="gender">
12+
<data key="empty"/>
13+
<data key="male">Male</data>
14+
<data key="female">Female</data>
15+
<data key="not_specified">Not Specified</data>
16+
</entity>
17+
</entities>

app/code/Magento/Customer/Test/Mftf/Page/AdminCustomerPage.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@
1313
<section name="AdminCustomerMessagesSection"/>
1414
<section name="AdminCustomerGridSection"/>
1515
<section name="AdminCustomerFiltersSection"/>
16+
<section name="AdminCustomerGridInlineEditorSection"/>
1617
</page>
1718
</pages>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
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+
<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd">
11+
<section name="AdminCustomerGridInlineEditorSection">
12+
<element name="customerGenderEditor" type="select" selector="tr.data-grid-editable-row:not([style*='display: none']) [name='gender']"/>
13+
<element name="saveInGrid" type="button" selector="tr.data-grid-editable-row-actions button.action-primary" timeout="30"/>
14+
</section>
15+
</sections>

0 commit comments

Comments
 (0)