Skip to content

Commit b946550

Browse files
committed
Merge branch 'PB-107' of github.com:magento-obsessive-owls/magento2-page-builder into PB-107
# Conflicts: # app/code/Magento/PageBuilder/Controller/Adminhtml/Form/Element/ProductTotals.php # app/code/Magento/PageBuilder/view/adminhtml/web/js/form/element/product-totals.js
2 parents 8c9d8ed + 7ed89cb commit b946550

File tree

20 files changed

+600
-53
lines changed

20 files changed

+600
-53
lines changed

app/code/Magento/PageBuilder/Block/Adminhtml/Stage/Render.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
/**
1919
* Class Render
20+
*
21+
* @api
2022
*/
2123
class Render extends Template
2224
{

app/code/Magento/PageBuilder/Controller/Adminhtml/Form/Element/ProductTotals.php

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@ class ProductTotals extends \Magento\Backend\App\Action implements HttpPostActio
4141
*/
4242
private $conditionsHelper;
4343

44-
/**
45-
* @var \Magento\Catalog\Api\\CategoryRepositoryInterface
46-
*/
47-
private $categoryRepository;
48-
4944
/**
5045
* @var \Magento\Framework\Controller\Result\JsonFactory
5146
*/
@@ -62,7 +57,6 @@ class ProductTotals extends \Magento\Backend\App\Action implements HttpPostActio
6257
* @param \Magento\Rule\Model\Condition\Sql\Builder $sqlBuilder
6358
* @param \Magento\CatalogWidget\Model\Rule $rule
6459
* @param \Magento\Widget\Helper\Conditions $conditionsHelper
65-
* @param \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository
6660
* @param \Magento\Framework\Controller\Result\JsonFactory $jsonFactory
6761
* @param \Magento\CatalogInventory\Helper\Stock $stockFilter
6862
*/
@@ -72,15 +66,13 @@ public function __construct(
7266
\Magento\Rule\Model\Condition\Sql\Builder $sqlBuilder,
7367
\Magento\CatalogWidget\Model\Rule $rule,
7468
\Magento\Widget\Helper\Conditions $conditionsHelper,
75-
\Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository,
7669
\Magento\Framework\Controller\Result\JsonFactory $jsonFactory,
7770
\Magento\CatalogInventory\Helper\Stock $stockFilter
7871
) {
7972
$this->productCollectionFactory = $productCollectionFactory;
8073
$this->sqlBuilder = $sqlBuilder;
8174
$this->rule = $rule;
8275
$this->conditionsHelper = $conditionsHelper;
83-
$this->categoryRepository = $categoryRepository;
8476
$this->jsonFactory = $jsonFactory;
8577
$this->stockFilter = $stockFilter;
8678
parent::__construct($context);

app/code/Magento/PageBuilder/Controller/Adminhtml/Stage/Render.php

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

88
namespace Magento\PageBuilder\Controller\Adminhtml\Stage;
99

10+
use Magento\Backend\App\Action\Context;
1011
use Magento\Framework\App\Action\HttpGetActionInterface;
11-
use Magento\RequireJs\Block\Html\Head\Config;
12+
use Magento\Framework\View\Result\PageFactory;
1213

1314
/**
1415
* Class Render
@@ -20,30 +21,31 @@ class Render extends \Magento\Backend\App\Action implements HttpGetActionInterfa
2021
const ADMIN_RESOURCE = 'Magento_Backend::content';
2122

2223
/**
23-
* Render the RequireJS and Page Builder render blocks without any additional layout
24+
* @var \Magento\Framework\View\Result\PageFactory
25+
*/
26+
private $pageFactory;
27+
28+
/**
29+
* Render constructor.
30+
*
31+
* @param Context $context
32+
* @param PageFactory $pageFactory
33+
*/
34+
public function __construct(
35+
Context $context,
36+
PageFactory $pageFactory
37+
) {
38+
$this->pageFactory = $pageFactory;
39+
return parent::__construct($context);
40+
}
41+
42+
/**
43+
* Render route
2444
*
25-
* @return void
45+
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\ResultInterface|mixed
2646
*/
2747
public function execute()
2848
{
29-
$layout = $this->_view->getLayout();
30-
$requireJs = $layout->createBlock(
31-
\Magento\Backend\Block\Page\RequireJs::class,
32-
'require.js'
33-
);
34-
$requireJs->setTemplate('Magento_Backend::page/js/require_js.phtml');
35-
/* @var \Magento\PageBuilder\Block\Adminhtml\Stage\Render $renderBlock */
36-
$renderBlock = $layout->createBlock(
37-
\Magento\PageBuilder\Block\Adminhtml\Stage\Render::class,
38-
'stage_render'
39-
);
40-
$renderBlock->setTemplate('Magento_PageBuilder::stage/render.phtml');
41-
$babelPolyfill = $layout->createBlock(
42-
\Magento\PageBuilder\Block\Adminhtml\Html\Head\BabelPolyfill::class,
43-
'pagebuilder.babel.polyfill'
44-
);
45-
$babelPolyfill->setTemplate('Magento_PageBuilder::html/head/babel_polyfill.phtml');
46-
$this->getResponse()->setBody($requireJs->toHtml() . $babelPolyfill->toHtml() . $renderBlock->toHtml());
47-
$this->getResponse()->sendResponse();
49+
return $this->pageFactory->create();
4850
}
4951
}

app/code/Magento/PageBuilder/Test/Mftf/ActionGroup/ContentTypeProductsActionGroup.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,4 +503,17 @@
503503
<waitForElement time="2" selector="{{EditPanelForm.panelFieldControl(PageBuilderProductsTotalProductsProperty.section, PageBuilderProductsTotalProductsProperty.fieldName)}}" stepKey="waitForFieldVisible"/>
504504
<see selector="{{EditPanelForm.panelFieldControl(PageBuilderProductsTotalProductsProperty.section, PageBuilderProductsTotalProductsProperty.fieldName)}}" userInput="{{productsTotals}}" stepKey="seeProductTotals"/>
505505
</actionGroup>
506+
<actionGroup name="validateSwatchInProducts">
507+
<annotations>
508+
<description>Verify a product swatch is displayed within the Product preview within Page Builder.</description>
509+
</annotations>
510+
<arguments>
511+
<argument name="page" defaultValue="" />
512+
<argument name="productGroupIndex" defaultValue="1" type="string"/>
513+
<argument name="productIndex" defaultValue="1" type="string"/>
514+
<argument name="swatch" defaultValue="" />
515+
</arguments>
516+
<waitForElementVisible selector="{{page.product(productGroupIndex)}}" stepKey="waitForProduct"/>
517+
<seeElement selector="{{page.productSwatch(productGroupIndex, productIndex, swatch.default_label)}}" stepKey="assertSwatch"/>
518+
</actionGroup>
506519
</actionGroups>

app/code/Magento/PageBuilder/Test/Mftf/Section/PageBuilderProductsSection.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
<element name="productAddToWishList" type="text" parameterized="true" selector="(//div[contains(@class,'pagebuilder-products')]//div[contains(@data-appearance,'grid')]//ol//li[contains(@class,'product-item')])[{{indexOfProductItem}}]//a[contains(@class,'towishlist') and @title='Add to Wish List']"/>
2626
<element name="productAddToCompare" type="text" parameterized="true" selector="(//div[contains(@class,'pagebuilder-products')]//div[contains(@data-appearance,'grid')]//ol//li[contains(@class,'product-item')])[{{indexOfProductItem}}]//a[contains(@class,'tocompare') and @title='Add to Compare']"/>
2727
<element name="productActions" type="text" selector=".pagebuilder-products div[data-appearance=grid] ol li.product-item div.product-item-actions"/>
28+
<element name="productSwatch" type="button" selector="((//div[contains(@class,'pagebuilder-products')]//div[contains(@data-appearance,'grid')])[{{indexOfProductGroup}}]//ol//li[contains(@class,'product-item')])[{{indexOfProductItem}}]//div[contains(@class, 'swatch-option')][@aria-label='{{swatchLabel}}']" parameterized="true"/>
2829
<!-- Advanced Configuration -->
2930
<element name="alignment" type="text" parameterized="true" selector="(//div[contains(@class,'pagebuilder-products')]//div[contains(@data-appearance,'grid')])[{{indexOfProductGroup}}][contains(@style,'text-align: {{alignment}};')]"/>
3031
<element name="noAlignment" type="text" parameterized="true" selector="(//div[contains(@class,'pagebuilder-products')]//div[contains(@data-appearance,'grid')])[{{indexOfProductGroup}}][not(contains(@style,'text-align:'))]"/>
@@ -61,6 +62,7 @@
6162
<element name="productAddToWishList" type="text" parameterized="true" selector="(//div[contains(@class,'pagebuilder-products')]//div[contains(@data-appearance,'carousel')]//ol//li[contains(@class,'product-item')])[{{indexOfProductItem}}]//a[contains(@class,'towishlist') and @title='Add to Wish List']"/>
6263
<element name="productAddToCompare" type="text" parameterized="true" selector="(//div[contains(@class,'pagebuilder-products')]//div[contains(@data-appearance,'carousel')]//ol//li[contains(@class,'product-item')])[{{indexOfProductItem}}]//a[contains(@class,'tocompare') and @title='Add to Compare']"/>
6364
<element name="productActions" type="text" selector=".pagebuilder-products div[data-appearance=carousel] ol li.product-item div.product-item-actions"/>
65+
<element name="productSwatch" type="button" selector="((//div[contains(@class,'pagebuilder-products')]//div[contains(@data-appearance,'carousel')])[{{indexOfProductGroup}}]//ol//li[contains(@class,'product-item')])[{{indexOfProductItem}}]//div[contains(@class, 'swatch-option')][@aria-label='{{swatchLabel}}']" parameterized="true"/>
6466
<!-- Carousel Settings Configuration -->
6567
<element name="carouselMode" type="button" parameterized="true" selector="(//div[contains(@class,'pagebuilder-products')]//div[contains(@data-appearance,'carousel')])[{{indexOfProductGroup}}][@data-carousel-mode='{{carouselMode}}']"/>
6668
<element name="autoplay" type="button" parameterized="true" selector="(//div[contains(@class,'pagebuilder-products')]//div[contains(@data-appearance,'carousel')])[{{indexOfProductGroup}}][@data-autoplay='{{autoplay}}']"/>

app/code/Magento/PageBuilder/Test/Mftf/Test/AdminPageBuilderProductsCarouselTests.xml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3475,4 +3475,45 @@
34753475
<argument name="product" value="_defaultProduct"/>
34763476
</actionGroup>
34773477
</test>
3478+
<test name="AdminPageBuilderVerifySwatchDisplayedInPreviewCarousel" extends="AdminPageBuilderVerifySwatchDisplayedInPreviewGrid">
3479+
<annotations>
3480+
<features value="PageBuilder"/>
3481+
<stories value="Products"/>
3482+
<title value="Verify products display swatches within the admin for carousel appearance"/>
3483+
<description value="Verify that a product which has swatches display the swatches within the admin for carousel appearance"/>
3484+
<severity value="AVERAGE"/>
3485+
<useCaseId value="PB-76"/>
3486+
<testCaseId value="MC-22765"/>
3487+
<group value="pagebuilder"/>
3488+
<group value="pagebuilder-products"/>
3489+
<group value="pagebuilder-productsCarousel"/>
3490+
</annotations>
3491+
<actionGroup ref="chooseVisualSelectOption" stepKey="selectAppearance" after="openEditAfterDrop">
3492+
<argument name="property" value="PageBuilderProductsProductCarouselAppearance"/>
3493+
</actionGroup>
3494+
<actionGroup ref="validateProductCountInProducts" stepKey="validateProductsCountStage">
3495+
<argument name="page" value="ProductsCarouselOnStage"/>
3496+
<argument name="count" value="1"/>
3497+
</actionGroup>
3498+
<actionGroup ref="validateSwatchInProducts" stepKey="assertFirstSwatch">
3499+
<argument name="page" value="ProductsCarouselOnStage"/>
3500+
<argument name="swatch" value="visualSwatchOption1"/>
3501+
</actionGroup>
3502+
<actionGroup ref="validateSwatchInProducts" stepKey="assertSecondSwatch">
3503+
<argument name="page" value="ProductsCarouselOnStage"/>
3504+
<argument name="swatch" value="visualSwatchOption2"/>
3505+
</actionGroup>
3506+
<actionGroup ref="validateProductCountInProducts" stepKey="validateProductsCountStageAfterSave">
3507+
<argument name="page" value="ProductsCarouselOnStage"/>
3508+
<argument name="count" value="1"/>
3509+
</actionGroup>
3510+
<actionGroup ref="validateSwatchInProducts" stepKey="assertFirstSwatchAfterSave">
3511+
<argument name="page" value="ProductsCarouselOnStage"/>
3512+
<argument name="swatch" value="visualSwatchOption1"/>
3513+
</actionGroup>
3514+
<actionGroup ref="validateSwatchInProducts" stepKey="assertSecondSwatchAfterSave">
3515+
<argument name="page" value="ProductsCarouselOnStage"/>
3516+
<argument name="swatch" value="visualSwatchOption2"/>
3517+
</actionGroup>
3518+
</test>
34783519
</tests>

app/code/Magento/PageBuilder/Test/Mftf/Test/AdminPageBuilderProductsCommonTests.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,7 @@
11991199
<argument name="SKUs" value="$$createDisabledProduct.sku$$,$$createCategory1Product1.sku$$"/>
12001200
</actionGroup>
12011201
<actionGroup ref="validateProductTotals" stepKey="validateTotalProductsOnEditPanelAgain3">
1202-
<argument name="productsTotals" value="of 2 (1 disabled)"/>
1202+
<argument name="productsTotals" value="of 1 (1 disabled)"/>
12031203
</actionGroup>
12041204
<actionGroup ref="saveEditPanelSettings" stepKey="saveEditPanel3"/>
12051205
<actionGroup ref="validateProductCountInProducts" stepKey="validateTotalProductsOnStage3">
@@ -1214,7 +1214,7 @@
12141214
<argument name="property" value="PageBuilderProductsProductGridAppearance"/>
12151215
</actionGroup>
12161216
<actionGroup ref="validateProductTotals" stepKey="validateTotalProductsOnEditPanel4">
1217-
<argument name="productsTotals" value="of 2 (1 disabled)"/>
1217+
<argument name="productsTotals" value="of 1 (1 disabled)"/>
12181218
</actionGroup>
12191219
<actionGroup ref="saveEditPanelSettings" stepKey="saveEditPanel4"/>
12201220
<actionGroup ref="validateProductCountInProducts" stepKey="validateTotalProductsOnStage4">

app/code/Magento/PageBuilder/Test/Mftf/Test/AdminPageBuilderProductsGridTests.xml

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,4 +1619,92 @@
16191619
<argument name="product" value="_defaultProduct"/>
16201620
</actionGroup>
16211621
</test>
1622+
<test name="AdminPageBuilderVerifySwatchDisplayedInPreviewGrid">
1623+
<annotations>
1624+
<features value="PageBuilder"/>
1625+
<stories value="Products"/>
1626+
<title value="Verify products display swatches within the admin for grid appearance"/>
1627+
<description value="Verify that a product which has swatches display the swatches within the admin for grid appearance"/>
1628+
<severity value="AVERAGE"/>
1629+
<useCaseId value="PB-76"/>
1630+
<testCaseId value="MC-22763"/>
1631+
<group value="pagebuilder"/>
1632+
<group value="pagebuilder-products"/>
1633+
<group value="pagebuilder-productsGrid"/>
1634+
</annotations>
1635+
<before>
1636+
<createData entity="_emptyCmsPage" stepKey="createCMSPage"/>
1637+
<actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/>
1638+
</before>
1639+
<after>
1640+
<deleteData createDataKey="createCMSPage" stepKey="deleteCMSPage"/>
1641+
<actionGroup ref="deleteProductBySku" stepKey="deleteProduct">
1642+
<argument name="sku" value="{{BaseConfigurableProduct.sku}}"/>
1643+
</actionGroup>
1644+
<actionGroup ref="deleteProductAttributeByLabel" stepKey="deleteAttribute">
1645+
<argument name="ProductAttribute" value="visualSwatchAttribute"/>
1646+
</actionGroup>
1647+
<actionGroup ref="logout" stepKey="logout"/>
1648+
</after>
1649+
<!-- Create a configurable swatch product via the UI -->
1650+
<actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="goToProductIndex" />
1651+
<actionGroup ref="goToCreateProductPage" stepKey="goToCreateProductPage">
1652+
<argument name="product" value="BaseConfigurableProduct"/>
1653+
</actionGroup>
1654+
<actionGroup ref="fillMainProductForm" stepKey="fillProductForm">
1655+
<argument name="product" value="BaseConfigurableProduct"/>
1656+
</actionGroup>
1657+
<!-- Add swatch attribute to configurable product -->
1658+
<actionGroup ref="AddVisualSwatchToProductWithStorefrontConfigActionGroup" stepKey="addSwatchToProduct"/>
1659+
<actionGroup ref="saveProductForm" stepKey="saveProduct"/>
1660+
<!-- Add product to Page Builder Products content type -->
1661+
<actionGroup ref="navigateToCMSPage" stepKey="navigateToCMSPage">
1662+
<argument name="CMSPage" value="$$createCMSPage$$"/>
1663+
</actionGroup>
1664+
<actionGroup ref="switchToPageBuilderStage" stepKey="switchToPageBuilderStage"/>
1665+
<actionGroup ref="expandPageBuilderPanelMenuSection" stepKey="expandMenuSectionAddContent">
1666+
<argument name="contentType" value="PageBuilderProductsContentType"/>
1667+
</actionGroup>
1668+
<actionGroup ref="dragContentTypeToStage" stepKey="dragProductsIntoStage">
1669+
<argument name="contentType" value="PageBuilderProductsContentType"/>
1670+
</actionGroup>
1671+
<actionGroup ref="openPageBuilderEditPanel" stepKey="openEditAfterDrop">
1672+
<argument name="contentType" value="PageBuilderProductsContentType"/>
1673+
</actionGroup>
1674+
<actionGroup ref="chooseVisualSelectOption" stepKey="chooseSelectProductsBy">
1675+
<argument name="property" value="PageBuilderProductsSelectProductsBySKU"/>
1676+
</actionGroup>
1677+
<actionGroup ref="addSKUsToSelectProductsBySKU" stepKey="addProductsSKUsToInputField">
1678+
<argument name="SKUs" value="{{BaseConfigurableProduct.sku}}"/>
1679+
</actionGroup>
1680+
<actionGroup ref="saveEditPanelSettings" stepKey="saveEditPanelSettings"/>
1681+
<actionGroup ref="validateProductCountInProducts" stepKey="validateProductsCountStage">
1682+
<argument name="page" value="ProductsOnStage"/>
1683+
<argument name="count" value="1"/>
1684+
</actionGroup>
1685+
<!-- Verify displayed swatches -->
1686+
<actionGroup ref="validateSwatchInProducts" stepKey="assertFirstSwatch">
1687+
<argument name="page" value="ProductsOnStage"/>
1688+
<argument name="swatch" value="visualSwatchOption1"/>
1689+
</actionGroup>
1690+
<actionGroup ref="validateSwatchInProducts" stepKey="assertSecondSwatch">
1691+
<argument name="page" value="ProductsOnStage"/>
1692+
<argument name="swatch" value="visualSwatchOption2"/>
1693+
</actionGroup>
1694+
<!-- Save page and verify swatches display on reload -->
1695+
<actionGroup ref="saveAndContinueEditCmsPage" stepKey="saveAndContinueEditCmsPage"/>
1696+
<actionGroup ref="switchToPageBuilderStage" stepKey="switchToPageBuilderStageAfterSave"/>
1697+
<actionGroup ref="validateProductCountInProducts" stepKey="validateProductsCountStageAfterSave">
1698+
<argument name="page" value="ProductsOnStage"/>
1699+
<argument name="count" value="1"/>
1700+
</actionGroup>
1701+
<actionGroup ref="validateSwatchInProducts" stepKey="assertFirstSwatchAfterSave">
1702+
<argument name="page" value="ProductsOnStage"/>
1703+
<argument name="swatch" value="visualSwatchOption1"/>
1704+
</actionGroup>
1705+
<actionGroup ref="validateSwatchInProducts" stepKey="assertSecondSwatchAfterSave">
1706+
<argument name="page" value="ProductsOnStage"/>
1707+
<argument name="swatch" value="visualSwatchOption2"/>
1708+
</actionGroup>
1709+
</test>
16221710
</tests>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
9+
<head>
10+
<remove src="extjs/resources/css/ext-all.css"/>
11+
<remove src="extjs/resources/css/ytheme-magento.css"/>
12+
<remove src="jquery/jstree/themes/default/style.css"/>
13+
<remove src="css/styles-old.css"/>
14+
<remove src="css/styles.css"/>
15+
</head>
16+
<body>
17+
<referenceContainer name="backend.page" remove="true"/>
18+
<referenceContainer name="menu.wrapper" remove="true"/>
19+
<referenceContainer name="root">
20+
<block name="stage_render" class="Magento\PageBuilder\Block\Adminhtml\Stage\Render" template="Magento_PageBuilder::stage/render.phtml" />
21+
<block name="pagebuilder.babel.polyfill" class="Magento\PageBuilder\Block\Adminhtml\Html\Head\BabelPolyfill" template="Magento_PageBuilder::html/head/babel_polyfill.phtml" />
22+
<block class="Magento\RequireJs\Block\Html\Head\Config" name="requirejs-config"/>
23+
</referenceContainer>
24+
</body>
25+
</page>

app/code/Magento/PageBuilder/view/adminhtml/templates/stage/render.phtml

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@
66

77
/** @var \Magento\PageBuilder\Block\Adminhtml\Stage\Render $block */
88
?>
9-
<script src="<?= $block->escapeUrl($block->getRequireJsUrl()); ?>"></script>
10-
<?php if ($block->getRequireJsMinUrl()) : ?>
11-
<script src="<?= $block->escapeUrl($block->getRequireJsMinUrl()); ?>"></script>
12-
<?php endif; ?>
13-
<script src="<?= $block->escapeUrl($block->getRequireJsConfigUrl()); ?>"></script>
149
<script>
1510
<?php
1611
/**
@@ -22,9 +17,9 @@
2217
'map': {
2318
'*': {
2419
'text': 'Magento_PageBuilder/js/master-format/render/requirejs/text',
25-
'Magento_PageBuilder/js/events': 'Magento_PageBuilder/js/master-format/render/events',
20+
'Magento_PageBuilder/js/events': 'Magento_PageBuilder/js/master-format/render/events'
2621
}
27-
},
22+
}
2823
});
2924

3025
<?php
@@ -50,4 +45,4 @@
5045
listen(<?= /* @noEscape */ $block->getPageBuilderConfig(); ?>);
5146
});
5247
</script>
53-
<div>Page Builder Render Frame</div>
48+
<div>Page Builder Render Frame</div>

0 commit comments

Comments
 (0)