diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fe6136eae11b77787726d44f517df9e536c0cdb..a1d98332be0d5c39a997f7ce570933320e08c8e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,42 @@ +0.74.0-beta14 +============= +* Framework improvements: + * Introduced an ability to uninstall modules which were installed via composer (bin/magento module:uninstall <moduleName>) + * Introduced an ability to uninstall themes (bin/magento theme:uninstall <themeName>) + * Introduced an ability to backup and rollback DB and Media via CLI (bin/magento setup:backup, options are --code, --db or --media) + * Introduced an ability to uninstall language packages (bin/magento i18n:uninstall <languagePack>) + * Introduced API notation for the following modules: Backend, Backup, Cron, Log, PageCache + * Added join processors to search services, joined config for services with extension attributes + * Renamed hidden_tax to discount_tax_compensation + * The customer address entity table was transformed from EAV into a flat model to minimize database operations +* Fixed bugs: + * Fixed an issue where Setup Wizard failed on readiness check when Magento was deployed by composer create-project + * Fixed the local file path disclosure when trying to browse image cache directory + * Fixed an issue where development errors resulted in too many redirects + * Fixed an integration test failure in Reports ViewedTest + * Fixed an issue where it was impossible to save existent Grouped Product with no child items + * Fixed an issue where message "We don't have as many "conf1" as you requested" appeared + * Fixed an issue where second product from bundle product was ordered as separate item after checkout + * Fixed an issue where configs for payments and shippings were not encrypted + * Fixed an issue where Table Rates shipping method did not work + * Fixed an issue where admin could not set locale properly on Account page + * Fixed incomplete generated results of single tenant compiler + * Fixed an issue with full page caching where one set of prices was cached for all customers + * Fixed incorrect urls for private content + * Fixed an issue where it was not possible to assign a product link to another product using API + * Fixed an issue where zipcode was not displayed as required field on Create New Order page + * Fixed the Sample Data re-installation + * Fixed random fails on inventory tab for test CreateSimpleProductEntityTest +* Tests: + * Covered various modules with unit tests + * Functional tests fixed and maintained +* GitHub issues: + * [#1156](https://github.com/magento/magento2/pull/1156) -- Moves common code to all auto-generated Interceptor classes into a trait + * [#1206](https://github.com/magento/magento2/pull/1206) -- Allow modules to live outside of app/code directory + * [#1245](https://github.com/magento/magento2/pull/1245) -- Unable to save product per website wise + * [#1347](https://github.com/magento/magento2/pull/1347) -- Fixed failing Install during integration tests (MAGETWO-38482) + * [#1368](https://github.com/magento/magento2/pull/1368) -- Fix typo in getCurrentCategoryKey + 0.74.0-beta13 ============= * Framework improvements: diff --git a/app/code/Magento/AdminNotification/composer.json b/app/code/Magento/AdminNotification/composer.json index d26dfd7372721000e9973b16a3ea720e1e09a6e5..5ae1d3e4e2009835a572a2c9081ee74619532b51 100644 --- a/app/code/Magento/AdminNotification/composer.json +++ b/app/code/Magento/AdminNotification/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/AdvancedPricingImportExport/composer.json b/app/code/Magento/AdvancedPricingImportExport/composer.json index c8b52c1509eb996357137da8f799be5d85c864d7..3e7abff2e19eca58d7d762c6f90932188af3aef6 100644 --- a/app/code/Magento/AdvancedPricingImportExport/composer.json +++ b/app/code/Magento/AdvancedPricingImportExport/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-catalog-import-export": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-catalog-import-export": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Authorization/composer.json b/app/code/Magento/Authorization/composer.json index 9225d004e7ce2f5753e0f21d8f95ca2fb7cbe9cf..9ce77947a0b214ceb0d0dd04c9e35f6e6c602ca2 100644 --- a/app/code/Magento/Authorization/composer.json +++ b/app/code/Magento/Authorization/composer.json @@ -3,12 +3,12 @@ "description": "Authorization module provides access to Magento ACL functionality.", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Backend/composer.json b/app/code/Magento/Backend/composer.json index b7e2b7bc15ba6f54e72cc1d6b084c18876592c52..b2b20216cf652a430d51f44492332e150011cd7d 100644 --- a/app/code/Magento/Backend/composer.json +++ b/app/code/Magento/Backend/composer.json @@ -3,27 +3,27 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-developer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-cron": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-reports": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-user": "0.74.0-beta13", - "magento/module-backup": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-translation": "0.74.0-beta13", - "magento/module-require-js": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-developer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-cron": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-reports": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-user": "0.74.0-beta14", + "magento/module-backup": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-translation": "0.74.0-beta14", + "magento/module-require-js": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Backend/etc/adminhtml/system.xml b/app/code/Magento/Backend/etc/adminhtml/system.xml index 5dbc4c0c399f25b11b39141f598afa8429b5dcde..858101e90267aa01b8fc0f75d82447955297ef10 100644 --- a/app/code/Magento/Backend/etc/adminhtml/system.xml +++ b/app/code/Magento/Backend/etc/adminhtml/system.xml @@ -253,6 +253,10 @@ <label>European Union Countries</label> <source_model>Magento\Directory\Model\Config\Source\Country</source_model> </field> + <field id="destinations" translate="label" type="multiselect" sortOrder="40" showInDefault="1" showInWebsite="0" showInStore="0"> + <label>Top destinations</label> + <source_model>Magento\Directory\Model\Config\Source\Country</source_model> + </field> </group> <group id="locale" translate="label" type="text" sortOrder="8" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Locale Options</label> diff --git a/app/code/Magento/Backup/composer.json b/app/code/Magento/Backup/composer.json index 30ca528748ce5de5d93f6cf933d2b5bc8bc24cd1..74b0a704e1de9374392c01a64e69b075fc416fde 100644 --- a/app/code/Magento/Backup/composer.json +++ b/app/code/Magento/Backup/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-cron": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-cron": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Bundle/Block/Checkout/Cart/Item/Renderer.php b/app/code/Magento/Bundle/Block/Checkout/Cart/Item/Renderer.php index 9139bd45b3e11295f712093142bdacd27981d89f..5a23f62b959ef87ff65698c3011e2e1d7840344e 100644 --- a/app/code/Magento/Bundle/Block/Checkout/Cart/Item/Renderer.php +++ b/app/code/Magento/Bundle/Block/Checkout/Cart/Item/Renderer.php @@ -30,8 +30,8 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer * @param \Magento\Framework\Url\Helper\Data $urlHelper * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param PriceCurrencyInterface $priceCurrency - * @param Configuration $bundleProductConfiguration * @param \Magento\Framework\Module\Manager $moduleManager + * @param Configuration $bundleProductConfiguration * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ diff --git a/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php b/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php index e4a7ceb99903b0987bbd38eebc3464895efe4d25..f216ecfc5b4e9f749eeac10696bcf202b83a6db6 100644 --- a/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php +++ b/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php @@ -20,7 +20,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { @@ -54,10 +54,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getBundlePriceTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_bundle_idx'); - } - return $this->getTable('catalog_product_index_price_bundle_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_bundle'); } /** @@ -67,10 +64,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getBundleSelectionTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_bundle_sel_idx'); - } - return $this->getTable('catalog_product_index_price_bundle_sel_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_bundle_sel'); } /** @@ -80,10 +74,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getBundleOptionTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_bundle_opt_idx'); - } - return $this->getTable('catalog_product_index_price_bundle_opt_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_bundle_opt'); } /** diff --git a/app/code/Magento/Bundle/composer.json b/app/code/Magento/Bundle/composer.json index ddc09411834f50f6715db4ad8103539915f34a44..f3017a3a8dda032fb32a79cff12622d3cb601bc2 100644 --- a/app/code/Magento/Bundle/composer.json +++ b/app/code/Magento/Bundle/composer.json @@ -3,28 +3,28 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-catalog-rule": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-gift-message": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-catalog-rule": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-gift-message": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-webapi": "0.74.0-beta13" + "magento/module-webapi": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Bundle/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Bundle/view/frontend/layout/checkout_cart_item_renderers.xml index 9c84f6735136c63ec0d0d78449e0d52295e3a014..94ceb9f5440cc6de01d0a7a13863b41d8b753f71 100644 --- a/app/code/Magento/Bundle/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/Bundle/view/frontend/layout/checkout_cart_item_renderers.xml @@ -8,7 +8,12 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\Bundle\Block\Checkout\Cart\Item\Renderer" as="bundle" template="Magento_Checkout::cart/item/default.phtml"/> + <block class="Magento\Bundle\Block\Checkout\Cart\Item\Renderer" as="bundle" template="Magento_Checkout::cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.bundle.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.bundle.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.bundle.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/BundleImportExport/composer.json b/app/code/Magento/BundleImportExport/composer.json index ddbc85cb67cb1d20f44a4bdb9c64ab3bf44f0127..78b23b0ff876b31caff7359c35e625ee986e6100 100755 --- a/app/code/Magento/BundleImportExport/composer.json +++ b/app/code/Magento/BundleImportExport/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-catalog-import-export": "0.74.0-beta13", - "magento/module-bundle": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-catalog-import-export": "0.74.0-beta14", + "magento/module-bundle": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CacheInvalidate/composer.json b/app/code/Magento/CacheInvalidate/composer.json index 5045f5b065cb0b6b80ecc9810dd84ed828bc7c26..5f5a8b2ce39bfa5fff3162892d333dcbd8c1659f 100644 --- a/app/code/Magento/CacheInvalidate/composer.json +++ b/app/code/Magento/CacheInvalidate/composer.json @@ -3,12 +3,12 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-page-cache": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-page-cache": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Captcha/composer.json b/app/code/Magento/Captcha/composer.json index 8e61f79ac764e5f722d5de600b515d27f5abc4be..044ade39edc271c3b8d5d1b4f9aebcb1cc740e90 100644 --- a/app/code/Magento/Captcha/composer.json +++ b/app/code/Magento/Captcha/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php b/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php index 7da80121645d24a199e980a2df32a05aa918145c..cedd7b1f845981a902617fc90a8a4896bf5642c0 100644 --- a/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php +++ b/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php @@ -46,7 +46,7 @@ class Select extends \Magento\Catalog\Block\Product\View\Options\AbstractOptions if ($_option->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_DROP_DOWN) { $select->setName('options[' . $_option->getid() . ']')->addOption('', __('-- Please Select --')); } else { - $select->setName('options[' . $_option->getid() . ']'); + $select->setName('options[' . $_option->getid() . '][]'); $select->setClass('multiselect admin__control-multiselect' . $require . ' product-custom-option'); } foreach ($_option->getValues() as $_value) { diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Price/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Product/Price/AbstractAction.php index 6e43b0666791cf26a65df23d3dbd6809bbc48b2f..c6da03c6a48ee2dd466f15ffe71f3e1d9a33c7b6 100755 --- a/app/code/Magento/Catalog/Model/Indexer/Product/Price/AbstractAction.php +++ b/app/code/Magento/Catalog/Model/Indexer/Product/Price/AbstractAction.php @@ -15,16 +15,9 @@ abstract class AbstractAction /** * Default Product Type Price indexer resource model * - * @var string + * @var \Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice */ - protected $_defaultPriceIndexer; - - /** - * Resource instance - * - * @var \Magento\Framework\App\Resource - */ - protected $_resource; + protected $_defaultIndexerResource; /** * @var \Magento\Framework\DB\Adapter\AdapterInterface @@ -78,14 +71,6 @@ abstract class AbstractAction protected $_indexers; /** - * Flag that defines if need to use "_idx" index table suffix instead of "_tmp" - * - * @var bool - */ - protected $_useIdxTable = false; - - /** - * @param \Magento\Framework\App\Resource $resource * @param \Magento\Framework\App\Config\ScopeConfigInterface $config * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Directory\Model\CurrencyFactory $currencyFactory @@ -93,10 +78,9 @@ abstract class AbstractAction * @param \Magento\Framework\Stdlib\DateTime $dateTime * @param \Magento\Catalog\Model\Product\Type $catalogProductType * @param \Magento\Catalog\Model\Resource\Product\Indexer\Price\Factory $indexerPriceFactory - * @param string $defaultPriceIndexer + * @param \Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice $defaultIndexerResource */ public function __construct( - \Magento\Framework\App\Resource $resource, \Magento\Framework\App\Config\ScopeConfigInterface $config, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Directory\Model\CurrencyFactory $currencyFactory, @@ -104,9 +88,8 @@ abstract class AbstractAction \Magento\Framework\Stdlib\DateTime $dateTime, \Magento\Catalog\Model\Product\Type $catalogProductType, \Magento\Catalog\Model\Resource\Product\Indexer\Price\Factory $indexerPriceFactory, - $defaultPriceIndexer + \Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice $defaultIndexerResource ) { - $this->_resource = $resource; $this->_config = $config; $this->_storeManager = $storeManager; $this->_currencyFactory = $currencyFactory; @@ -114,20 +97,8 @@ abstract class AbstractAction $this->_dateTime = $dateTime; $this->_catalogProductType = $catalogProductType; $this->_indexerPriceFactory = $indexerPriceFactory; - $this->_defaultPriceIndexer = $defaultPriceIndexer; - } - - /** - * Retrieve connection instance - * - * @return bool|\Magento\Framework\DB\Adapter\AdapterInterface - */ - protected function _getConnection() - { - if (null === $this->_connection) { - $this->_connection = $this->_resource->getConnection('write'); - } - return $this->_connection; + $this->_defaultIndexerResource = $defaultIndexerResource; + $this->_connection = $this->_defaultIndexerResource->getWriteConnection(); } /** @@ -147,11 +118,11 @@ abstract class AbstractAction protected function _syncData(array $processIds = []) { // delete invalid rows - $select = $this->_getConnection()->select()->from( - ['index_price' => $this->_getTable('catalog_product_index_price')], + $select = $this->_connection->select()->from( + ['index_price' => $this->_defaultIndexerResource->getTable('catalog_product_index_price')], null )->joinLeft( - ['ip_tmp' => $this->_getIdxTable()], + ['ip_tmp' => $this->_defaultIndexerResource->getIdxTable()], 'index_price.entity_id = ip_tmp.entity_id AND index_price.website_id = ip_tmp.website_id', [] )->where( @@ -161,23 +132,15 @@ abstract class AbstractAction $select->where('index_price.entity_id IN(?)', $processIds); } $sql = $select->deleteFromSelect('index_price'); - $this->_getConnection()->query($sql); + $this->_connection->query($sql); - $this->_insertFromTable($this->_getIdxTable(), $this->_getTable('catalog_product_index_price')); + $this->_insertFromTable( + $this->_defaultIndexerResource->getIdxTable(), + $this->_defaultIndexerResource->getTable('catalog_product_index_price') + ); return $this; } - /** - * Returns table name for given entity - * - * @param string $entityName - * @return string - */ - protected function _getTable($entityName) - { - return $this->_resource->getTableName($entityName); - } - /** * Prepare website current dates table * @@ -185,14 +148,13 @@ abstract class AbstractAction */ protected function _prepareWebsiteDateTable() { - $write = $this->_getConnection(); $baseCurrency = $this->_config->getValue(\Magento\Directory\Model\Currency::XML_PATH_CURRENCY_BASE); - $select = $write->select()->from( - ['cw' => $this->_getTable('store_website')], + $select = $this->_connection->select()->from( + ['cw' => $this->_defaultIndexerResource->getTable('store_website')], ['website_id'] )->join( - ['csg' => $this->_getTable('store_group')], + ['csg' => $this->_defaultIndexerResource->getTable('store_group')], 'cw.default_group_id = csg.group_id', ['store_id' => 'default_store_id'] )->where( @@ -200,7 +162,7 @@ abstract class AbstractAction ); $data = []; - foreach ($write->fetchAll($select) as $item) { + foreach ($this->_connection->fetchAll($select) as $item) { /** @var $website \Magento\Store\Model\Website */ $website = $this->_storeManager->getWebsite($item['website_id']); @@ -229,10 +191,12 @@ abstract class AbstractAction } } - $table = $this->_getTable('catalog_product_index_website'); + $table = $this->_defaultIndexerResource->getTable('catalog_product_index_website'); $this->_emptyTable($table); if ($data) { - $write->insertMultiple($table, $data); + foreach ($data as $row) { + $this->_connection->insertOnDuplicate($table, $row, array_keys($row)); + } } return $this; @@ -246,24 +210,27 @@ abstract class AbstractAction */ protected function _prepareTierPriceIndex($entityIds = null) { - $write = $this->_getConnection(); - $table = $this->_getTable('catalog_product_index_tier_price'); + $table = $this->_defaultIndexerResource->getTable('catalog_product_index_tier_price'); $this->_emptyTable($table); - $websiteExpression = $write->getCheckSql('tp.website_id = 0', 'ROUND(tp.value * cwd.rate, 4)', 'tp.value'); - $select = $write->select()->from( - ['tp' => $this->_getTable(['catalog_product_entity', 'tier_price'])], + $websiteExpression = $this->_connection->getCheckSql( + 'tp.website_id = 0', + 'ROUND(tp.value * cwd.rate, 4)', + 'tp.value' + ); + $select = $this->_connection->select()->from( + ['tp' => $this->_defaultIndexerResource->getTable(['catalog_product_entity', 'tier_price'])], ['entity_id'] )->join( - ['cg' => $this->_getTable('customer_group')], + ['cg' => $this->_defaultIndexerResource->getTable('customer_group')], 'tp.all_groups = 1 OR (tp.all_groups = 0 AND tp.customer_group_id = cg.customer_group_id)', ['customer_group_id'] )->join( - ['cw' => $this->_getTable('store_website')], + ['cw' => $this->_defaultIndexerResource->getTable('store_website')], 'tp.website_id = 0 OR tp.website_id = cw.website_id', ['website_id'] )->join( - ['cwd' => $this->_getTable('catalog_product_index_website')], + ['cwd' => $this->_defaultIndexerResource->getTable('catalog_product_index_website')], 'cw.website_id = cwd.website_id', [] )->where( @@ -279,7 +246,7 @@ abstract class AbstractAction } $query = $select->insertFromSelect($table); - $write->query($query); + $this->_connection->query($query); return $this; } @@ -292,24 +259,27 @@ abstract class AbstractAction */ protected function _prepareGroupPriceIndex($entityIds = null) { - $write = $this->_getConnection(); - $table = $this->_getTable('catalog_product_index_group_price'); + $table = $this->_defaultIndexerResource->getTable('catalog_product_index_group_price'); $this->_emptyTable($table); - $websiteExpression = $write->getCheckSql('gp.website_id = 0', 'ROUND(gp.value * cwd.rate, 4)', 'gp.value'); - $select = $write->select()->from( - ['gp' => $this->_getTable(['catalog_product_entity', 'group_price'])], + $websiteExpression = $this->_connection->getCheckSql( + 'gp.website_id = 0', + 'ROUND(gp.value * cwd.rate, 4)', + 'gp.value' + ); + $select = $this->_connection->select()->from( + ['gp' => $this->_defaultIndexerResource->getTable(['catalog_product_entity', 'group_price'])], ['entity_id'] )->join( - ['cg' => $this->_getTable('customer_group')], + ['cg' => $this->_defaultIndexerResource->getTable('customer_group')], 'gp.all_groups = 1 OR (gp.all_groups = 0 AND gp.customer_group_id = cg.customer_group_id)', ['customer_group_id'] )->join( - ['cw' => $this->_getTable('store_website')], + ['cw' => $this->_defaultIndexerResource->getTable('store_website')], 'gp.website_id = 0 OR gp.website_id = cw.website_id', ['website_id'] )->join( - ['cwd' => $this->_getTable('catalog_product_index_website')], + ['cwd' => $this->_defaultIndexerResource->getTable('catalog_product_index_website')], 'cw.website_id = cwd.website_id', [] )->where( @@ -325,7 +295,7 @@ abstract class AbstractAction } $query = $select->insertFromSelect($table); - $write->query($query); + $this->_connection->query($query); return $this; } @@ -343,7 +313,7 @@ abstract class AbstractAction foreach ($types as $typeId => $typeInfo) { $modelName = isset( $typeInfo['price_indexer'] - ) ? $typeInfo['price_indexer'] : $this->_defaultPriceIndexer; + ) ? $typeInfo['price_indexer'] : get_class($this->_defaultIndexerResource); $isComposite = !empty($typeInfo['composite']); $indexer = $this->_indexerPriceFactory->create( @@ -377,7 +347,7 @@ abstract class AbstractAction } /** - * Copy data from source table of read adapter to destination table of index adapter + * Copy data from source table to destination * * @param string $sourceTable * @param string $destTable @@ -386,47 +356,19 @@ abstract class AbstractAction */ protected function _insertFromTable($sourceTable, $destTable, $where = null) { - $connection = $this->_getConnection(); - $sourceColumns = array_keys($connection->describeTable($sourceTable)); - $targetColumns = array_keys($connection->describeTable($destTable)); - $select = $connection->select()->from($sourceTable, $sourceColumns); + $sourceColumns = array_keys($this->_connection->describeTable($sourceTable)); + $targetColumns = array_keys($this->_connection->describeTable($destTable)); + $select = $this->_connection->select()->from($sourceTable, $sourceColumns); if ($where) { $select->where($where); } - $query = $connection->insertFromSelect( + $query = $this->_connection->insertFromSelect( $select, $destTable, $targetColumns, \Magento\Framework\DB\Adapter\AdapterInterface::INSERT_ON_DUPLICATE ); - $connection->query($query); - } - - /** - * Set or get what either "_idx" or "_tmp" suffixed temporary index table need to use - * - * @param bool $value - * @return bool - */ - protected function _useIdxTable($value = null) - { - if ($value !== null) { - $this->_useIdxTable = (bool)$value; - } - return $this->_useIdxTable; - } - - /** - * Retrieve temporary index table name - * - * @return string - */ - protected function _getIdxTable() - { - if ($this->_useIdxTable()) { - return $this->_getTable('catalog_product_index_price_idx'); - } - return $this->_getTable('catalog_product_index_price_tmp'); + $this->_connection->query($query); } /** @@ -437,7 +379,7 @@ abstract class AbstractAction */ protected function _emptyTable($table) { - $this->_getConnection()->delete($table); + $this->_connection->delete($table); } /** @@ -449,11 +391,11 @@ abstract class AbstractAction */ protected function _reindexRows($changedIds = []) { - $this->_emptyTable($this->_getIdxTable()); + $this->_emptyTable($this->_defaultIndexerResource->getIdxTable()); $this->_prepareWebsiteDateTable(); $select = $this->_connection->select()->from( - $this->_getTable('catalog_product_entity'), + $this->_defaultIndexerResource->getTable('catalog_product_entity'), ['entity_id', 'type_id'] )->where( 'entity_id IN(?)', @@ -479,10 +421,10 @@ abstract class AbstractAction if (!empty($notCompositeIds)) { $select = $this->_connection->select()->from( - ['l' => $this->_getTable('catalog_product_relation')], + ['l' => $this->_defaultIndexerResource->getTable('catalog_product_relation')], 'parent_id' )->join( - ['e' => $this->_getTable('catalog_product_entity')], + ['e' => $this->_defaultIndexerResource->getTable('catalog_product_entity')], 'e.entity_id = l.parent_id', ['type_id'] )->where( @@ -525,9 +467,8 @@ abstract class AbstractAction */ protected function _copyRelationIndexData($parentIds, $excludeIds = null) { - $write = $this->_connection; - $select = $write->select()->from( - $this->_getTable('catalog_product_relation'), + $select = $this->_connection->select()->from( + $this->_defaultIndexerResource->getTable('catalog_product_relation'), ['child_id'] )->where( 'parent_id IN(?)', @@ -537,17 +478,17 @@ abstract class AbstractAction $select->where('child_id NOT IN(?)', $excludeIds); } - $children = $write->fetchCol($select); + $children = $this->_connection->fetchCol($select); if ($children) { - $select = $write->select()->from( - $this->_getTable('catalog_product_index_price') + $select = $this->_connection->select()->from( + $this->_defaultIndexerResource->getTable('catalog_product_index_price') )->where( 'entity_id IN(?)', $children ); - $query = $select->insertFromSelect($this->_getIdxTable(), [], false); - $write->query($query); + $query = $select->insertFromSelect($this->_defaultIndexerResource->getIdxTable(), [], false); + $this->_connection->query($query); } return $this; diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Full.php b/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Full.php index 61700737da9d279d805533bc4421db2bbfb18182..ac9c4391efaa1bf23198ef8ec07c16436f5666eb 100755 --- a/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Full.php +++ b/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Full.php @@ -21,8 +21,8 @@ class Full extends \Magento\Catalog\Model\Indexer\Product\Price\AbstractAction public function execute($ids = null) { try { - $this->_useIdxTable(true); - $this->_emptyTable($this->_getIdxTable()); + $this->_defaultIndexerResource->getTableStrategy()->setUseIdxTable(true); + $this->_emptyTable($this->_defaultIndexerResource->getIdxTable()); $this->_prepareWebsiteDateTable(); $this->_prepareTierPriceIndex(); $this->_prepareGroupPriceIndex(); diff --git a/app/code/Magento/Catalog/Model/Resource/Category/Flat.php b/app/code/Magento/Catalog/Model/Resource/Category/Flat.php index 01f2fa19a59ca5163d06d995796414944bb60cc5..fcc0fbf435f681062bdf3f39a0ab9e21d9dbeaad 100644 --- a/app/code/Magento/Catalog/Model/Resource/Category/Flat.php +++ b/app/code/Magento/Catalog/Model/Resource/Category/Flat.php @@ -11,6 +11,7 @@ use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator; * Category flat model * * @SuppressWarnings(PHPMD.LongVariable) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Flat extends \Magento\Indexer\Model\Resource\AbstractResource { @@ -78,7 +79,10 @@ class Flat extends \Magento\Indexer\Model\Resource\AbstractResource protected $_categoryFactory; /** + * Class constructor + * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Catalog\Model\CategoryFactory $categoryFactory * @param CollectionFactory $categoryCollectionFactory * @param \Magento\Store\Model\StoreManagerInterface $storeManager @@ -88,6 +92,7 @@ class Flat extends \Magento\Indexer\Model\Resource\AbstractResource */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Catalog\Model\CategoryFactory $categoryFactory, \Magento\Catalog\Model\Resource\Category\CollectionFactory $categoryCollectionFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, @@ -100,7 +105,7 @@ class Flat extends \Magento\Indexer\Model\Resource\AbstractResource $this->_storeManager = $storeManager; $this->_catalogConfig = $catalogConfig; $this->_eventManager = $eventManager; - parent::__construct($context, $resourcePrefix); + parent::__construct($context, $tableStrategy, $resourcePrefix); } /** diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php index 0b27b2e351936a40021478bad8332133315a2625..03a082ac070ccf8f1aec001af905968183588585 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php @@ -23,16 +23,18 @@ abstract class AbstractIndexer extends \Magento\Indexer\Model\Resource\AbstractR * Class constructor * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Eav\Model\Config $eavConfig * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Eav\Model\Config $eavConfig, $resourcePrefix = null ) { $this->_eavConfig = $eavConfig; - parent::__construct($context, $resourcePrefix); + parent::__construct($context, $tableStrategy, $resourcePrefix); } /** diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/AbstractEav.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/AbstractEav.php index 450b8207a86a2a979a0977eb079e9832e4e32c71..a156d0282926d13ad1a39ff29e3a4bdc5dbbe129 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/AbstractEav.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/AbstractEav.php @@ -23,18 +23,20 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index * Construct * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, $resourcePrefix = null ) { $this->_eventManager = $eventManager; - parent::__construct($context, $eavConfig, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $resourcePrefix); } /** @@ -45,21 +47,19 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->clearTemporaryIndexTable(); $this->_prepareIndex(); $this->_prepareRelationIndex(); $this->_removeNotVisibleEntityFromIndex(); - $this->syncData(); $this->commit(); } catch (\Exception $e) { $this->rollBack(); throw $e; } - return $this; } @@ -107,7 +107,6 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index $adapter->rollBack(); throw $e; } - return $this; } @@ -174,12 +173,12 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index } /** - * Prepare data index for product relations + * Prepare data index select for product relations * * @param array $parentIds the parent entity ids limitation - * @return $this + * @return \Magento\Framework\DB\Select */ - protected function _prepareRelationIndex($parentIds = null) + protected function _prepareRelationIndexSelect($parentIds = null) { $write = $this->_getWriteAdapter(); $idxTable = $this->getIdxTable(); @@ -215,8 +214,22 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index ] ); + return $select; + } + + /** + * Prepare data index for product relations + * + * @param array $parentIds the parent entity ids limitation + * @return $this + */ + protected function _prepareRelationIndex($parentIds = null) + { + $write = $this->_getWriteAdapter(); + $idxTable = $this->getIdxTable(); + $query = $write->insertFromSelect( - $select, + $this->_prepareRelationIndexSelect($parentIds), $idxTable, [], \Magento\Framework\DB\Adapter\AdapterInterface::INSERT_IGNORE @@ -259,10 +272,9 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index $adapter->delete($this->getMainTable(), $where); $adapter->commit(); } catch (\Exception $e) { - $adapter->rollback(); + $adapter->rollBack(); throw $e; } - return $this; } @@ -284,13 +296,11 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index // insert new index $this->insertFromTable($this->getIdxTable(), $this->getMainTable()); - $adapter->commit(); } catch (\Exception $e) { - $adapter->rollback(); + $adapter->rollBack(); throw $e; } - return $this; } } diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php index 49c694355daf768f44f156f4e91ada07ce3fe52c..f8e73ca886a6c22c3af6b5b634bd0131ae5faa8b 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php @@ -131,9 +131,6 @@ class Decimal extends AbstractEav */ public function getIdxTable($table = null) { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_eav_decimal_idx'); - } - return $this->getTable('catalog_product_index_eav_decimal_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_eav_decimal'); } } diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php index 287847f4acf445a582a4f32f80d8128cdfe9e2eb..f5899d9a55c7996ce8b2980ba865bd792724f975 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php @@ -25,6 +25,7 @@ class Source extends AbstractEav * Construct * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param \Magento\Catalog\Model\Resource\Helper $resourceHelper @@ -32,13 +33,14 @@ class Source extends AbstractEav */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Catalog\Model\Resource\Helper $resourceHelper, $resourcePrefix = null ) { $this->_resourceHelper = $resourceHelper; - parent::__construct($context, $eavConfig, $eventManager, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $eventManager, $resourcePrefix); } /** @@ -321,9 +323,6 @@ class Source extends AbstractEav */ public function getIdxTable($table = null) { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_eav_idx'); - } - return $this->getTable('catalog_product_index_eav_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_eav'); } } diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php index 7c488ecf2ec36d3bc050d1726df25a72d6d365fb..467091e3c42ed9e29542d5624ae9fc5dfdd6e1ee 100755 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php @@ -42,7 +42,10 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr protected $_eventManager = null; /** + * Class constructor + * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param \Magento\Framework\Module\Manager $moduleManager @@ -50,6 +53,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Framework\Module\Manager $moduleManager, @@ -57,7 +61,27 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr ) { $this->_eventManager = $eventManager; $this->moduleManager = $moduleManager; - parent::__construct($context, $eavConfig, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $resourcePrefix); + } + + /** + * Get Table strategy + * + * @return \Magento\Indexer\Model\Indexer\Table\StrategyInterface + */ + public function getTableStrategy() + { + return $this->tableStrategy; + } + + /** + * Get write connection + * + * @return false|\Magento\Framework\DB\Adapter\AdapterInterface + */ + public function getWriteConnection() + { + return $this->_getWriteAdapter(); } /** @@ -129,7 +153,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); @@ -176,10 +200,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ protected function _getDefaultFinalPriceTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_final_idx'); - } - return $this->getTable('catalog_product_index_price_final_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_final'); } /** @@ -330,10 +351,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ protected function _getCustomOptionAggregateTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_opt_agr_idx'); - } - return $this->getTable('catalog_product_index_price_opt_agr_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_opt_agr'); } /** @@ -343,10 +361,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ protected function _getCustomOptionPriceTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_opt_idx'); - } - return $this->getTable('catalog_product_index_price_opt_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_opt'); } /** @@ -630,10 +645,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function getIdxTable($table = null) { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_idx'); - } - return $this->getTable('catalog_product_index_price_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price'); } /** diff --git a/app/code/Magento/Catalog/composer.json b/app/code/Magento/Catalog/composer.json index 2c1ac69b4bbf736b53a62ea9d6387171ece6e7f4..7c1d49431e273833b821bae24c446d3364c6b458 100644 --- a/app/code/Magento/Catalog/composer.json +++ b/app/code/Magento/Catalog/composer.json @@ -3,37 +3,37 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-log": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-msrp": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-catalog-rule": "0.74.0-beta13", - "magento/module-product-alert": "0.74.0-beta13", - "magento/module-url-rewrite": "0.74.0-beta13", - "magento/module-catalog-url-rewrite": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-log": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-wishlist": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-msrp": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-catalog-rule": "0.74.0-beta14", + "magento/module-product-alert": "0.74.0-beta14", + "magento/module-url-rewrite": "0.74.0-beta14", + "magento/module-catalog-url-rewrite": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-cookie": "0.74.0-beta13" + "magento/module-cookie": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Catalog/etc/di.xml b/app/code/Magento/Catalog/etc/di.xml index f4aad2caa251e2efce7f66c472eb76c8e17c5c6d..40b644c226a2ae2af8135aee265bcbe473480f98 100644 --- a/app/code/Magento/Catalog/etc/di.xml +++ b/app/code/Magento/Catalog/etc/di.xml @@ -185,7 +185,7 @@ </type> <type name="Magento\Catalog\Model\Indexer\Product\Price\AbstractAction"> <arguments> - <argument name="defaultPriceIndexer" xsi:type="string">Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice</argument> + <argument name="defaultPriceIndexer" xsi:type="object">Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice</argument> </arguments> </type> <type name="Magento\Eav\Model\Entity\Attribute\Set"> diff --git a/app/code/Magento/Catalog/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Catalog/view/frontend/layout/checkout_cart_item_renderers.xml index d14cbd5b13e6e0dc0a2696e007a81e931d4d376e..8760461ac724838b80814aee5db7c635edaccf82 100644 --- a/app/code/Magento/Catalog/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/Catalog/view/frontend/layout/checkout_cart_item_renderers.xml @@ -8,7 +8,12 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="virtual" template="cart/item/default.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="virtual" template="cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.virtual.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.virtual.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.virtual.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/CatalogImportExport/composer.json b/app/code/Magento/CatalogImportExport/composer.json index fe82fc10d1355d83dbc6a71cbe7ec882504f4f0d..ca381cabc50404db10ec64a2c7e635b69124c128 100644 --- a/app/code/Magento/CatalogImportExport/composer.json +++ b/app/code/Magento/CatalogImportExport/composer.json @@ -3,21 +3,21 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "ext-ctype": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php b/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php index 92704735fe73e9978cb0f321f9058a28ff4933e1..ee34eeea325a2a439cf5b6fae82180df8ee83a8a 100644 --- a/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php +++ b/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php @@ -11,13 +11,15 @@ use Magento\CatalogInventory\Api\StockRegistryInterface; use Magento\Customer\Api\GroupManagementInterface; use Magento\Framework\Api\AttributeValueFactory; use Magento\Framework\Api\ExtensionAttributesFactory; +use Magento\Framework\Object\IdentityInterface; +use Magento\Catalog\Model\Product; /** * Catalog Inventory Stock Model for adminhtml area * @method \Magento\CatalogInventory\Api\Data\StockItemExtensionInterface getExtensionAttributes() * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ -class Item extends \Magento\CatalogInventory\Model\Stock\Item +class Item extends \Magento\CatalogInventory\Model\Stock\Item implements IdentityInterface { /** * @var GroupManagementInterface @@ -122,4 +124,17 @@ class Item extends \Magento\CatalogInventory\Model\Stock\Item { return true; } + + /** + * @inheritdoc + */ + public function getIdentities() + { + $tags = []; + if ($this->getProductId()) { + $tags[] = Product::CACHE_TAG . '_' . $this->getProductId(); + } + + return $tags; + } } diff --git a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php index 05de6b3ffe27586b7f67cf22684ea4049210db6a..8667d4765713ea38e548b44867262df173d63406 100644 --- a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php +++ b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php @@ -36,18 +36,20 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr * Class constructor * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, $resourcePrefix = null ) { $this->_scopeConfig = $scopeConfig; - parent::__construct($context, $eavConfig, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $resourcePrefix); } /** @@ -68,7 +70,7 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->_prepareIndexTable(); @@ -287,9 +289,6 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function getIdxTable($table = null) { - if ($this->useIdxTable()) { - return $this->getTable('cataloginventory_stock_status_idx'); - } - return $this->getTable('cataloginventory_stock_status_tmp'); + return $this->tableStrategy->getTableName('cataloginventory_stock_status'); } } diff --git a/app/code/Magento/CatalogInventory/Model/Resource/Stock/Item.php b/app/code/Magento/CatalogInventory/Model/Resource/Stock/Item.php index b182d738370fcf152295f199814a120ebbff8604..ee653da73580405bdb9f219ef4793e6b5adc0783 100644 --- a/app/code/Magento/CatalogInventory/Model/Resource/Stock/Item.php +++ b/app/code/Magento/CatalogInventory/Model/Resource/Stock/Item.php @@ -123,6 +123,7 @@ class Item extends \Magento\Framework\Model\Resource\Db\AbstractDb parent::_afterSave($object); /** @var StockItemInterface $object */ if ($this->processIndexEvents) { + $this->stockIndexerProcessor->markIndexerAsInvalid(); $this->stockIndexerProcessor->reindexRow($object->getProductId()); } return $this; diff --git a/app/code/Magento/CatalogInventory/Model/StockRegistry.php b/app/code/Magento/CatalogInventory/Model/StockRegistry.php index f32aeb2104b686091e06120271c462ec33542f08..059910b98b6f6b5dee0cf76426d92074e4f1a548 100644 --- a/app/code/Magento/CatalogInventory/Model/StockRegistry.php +++ b/app/code/Magento/CatalogInventory/Model/StockRegistry.php @@ -172,7 +172,7 @@ class StockRegistry implements StockRegistryInterface $criteria = $this->criteriaFactory->create(); $criteria->setLimit($currentPage, $pageSize); $criteria->setWebsiteFilter($websiteId); - $criteria->setQtyFilter('>=', $qty); + $criteria->setQtyFilter('<=', $qty); $criteria->addField('qty'); return $this->stockItemRepository->getList($criteria); } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Block/Plugin/ProductViewTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Block/Plugin/ProductViewTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4edffd7709f010ce79108f022e22a3e1c19ce03c --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Block/Plugin/ProductViewTest.php @@ -0,0 +1,82 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CatalogInventory\Test\Unit\Block\Plugin; + +class ProductViewTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\CatalogInventory\Block\Plugin\ProductView + */ + protected $block; + + /** + * @var \Magento\CatalogInventory\Api\Data\StockItemInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockItem; + + /** + * @var \Magento\CatalogInventory\Api\StockRegistryInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockRegistry; + + protected function setUp() + { + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->stockItem = $this->getMockBuilder('\Magento\CatalogInventory\Model\Stock\Item') + ->disableOriginalConstructor() + ->setMethods(['getQtyMinAllowed', 'getQtyMaxAllowed', 'getQtyIncrements']) + ->getMock(); + + $this->stockRegistry = $this->getMockBuilder('Magento\CatalogInventory\Api\StockRegistryInterface') + ->getMock(); + + $this->block = $objectManager->getObject( + 'Magento\CatalogInventory\Block\Plugin\ProductView', + [ + 'stockRegistry' => $this->stockRegistry + ] + ); + } + + public function testAfterGetQuantityValidators() + { + $result = [ + 'validate-item-quantity' => + [ + 'minAllowed' => 2, + 'maxAllowed' => 5, + 'qtyIncrements' => 3 + ] + ]; + $validators = []; + $productViewBlock = $this->getMockBuilder('Magento\Catalog\Block\Product\View') + ->disableOriginalConstructor() + ->getMock(); + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->setMethods(['_wakeup', 'getId', 'getStore']) + ->getMock(); + $storeMock = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->setMethods(['getWebsiteId', '_wakeup']) + ->getMock(); + + $productViewBlock->expects($this->any())->method('getProduct')->willReturn($productMock); + $productMock->expects($this->once())->method('getId')->willReturn('productId'); + $productMock->expects($this->once())->method('getStore')->willReturn($storeMock); + $storeMock->expects($this->once())->method('getWebsiteId')->willReturn('websiteId'); + $this->stockRegistry->expects($this->once()) + ->method('getStockItem') + ->with('productId', 'websiteId') + ->willReturn($this->stockItem); + $this->stockItem->expects($this->once())->method('getQtyMinAllowed')->willReturn(2); + $this->stockItem->expects($this->any())->method('getQtyMaxAllowed')->willReturn(5); + $this->stockItem->expects($this->any())->method('getQtyIncrements')->willReturn(3); + + $this->assertEquals($result, $this->block->afterGetQuantityValidators($productViewBlock, $validators)); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Block/Stockqty/DefaultStockqtyTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Block/Stockqty/DefaultStockqtyTest.php index a513382ecc9c08706363240c69c0e210e5e4d5cc..fd247ef871523bf14f3ee2480af22f3c648d6627 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Block/Stockqty/DefaultStockqtyTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Block/Stockqty/DefaultStockqtyTest.php @@ -30,6 +30,11 @@ class DefaultStockqtyTest extends \PHPUnit_Framework_TestCase */ protected $stockRegistryMock; + /** + * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $scopeConfigMock; + protected function setUp() { $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -44,12 +49,16 @@ class DefaultStockqtyTest extends \PHPUnit_Framework_TestCase $this->stockRegistryMock = $this->getMockBuilder('Magento\CatalogInventory\Api\StockRegistryInterface') ->disableOriginalConstructor() ->getMock(); + $this->scopeConfigMock = $this->getMockBuilder('\Magento\Framework\App\Config\ScopeConfigInterface') + ->disableOriginalConstructor() + ->getMock(); $this->block = $objectManager->getObject( 'Magento\CatalogInventory\Block\Stockqty\DefaultStockqty', [ 'registry' => $this->registryMock, 'stockState' => $this->stockState, - 'stockRegistry' => $this->stockRegistryMock + 'stockRegistry' => $this->stockRegistryMock, + 'scopeConfig' => $this->scopeConfigMock ] ); } @@ -198,4 +207,10 @@ class DefaultStockqtyTest extends \PHPUnit_Framework_TestCase $dataArray[$key] = $value; $property->setValue($this->block, $dataArray); } + + public function testGetThresholdQty() + { + $this->scopeConfigMock->expects($this->once())->method('getValue')->willReturn(5); + $this->assertEquals(5, $this->block->getThresholdQty()); + } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Adminhtml/Stock/ItemTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Adminhtml/Stock/ItemTest.php index bcf805e7260685689b0fda77d1026a91c8aa006b..096c3e60ebde0867c7288c24cec2efeb66651921 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Adminhtml/Stock/ItemTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Adminhtml/Stock/ItemTest.php @@ -58,4 +58,10 @@ class ItemTest extends \PHPUnit_Framework_TestCase $this->_model->setCustomerGroupId(2); $this->assertEquals(2, $this->_model->getCustomerGroupId()); } + + public function testGetIdentities() + { + $this->_model->setProductId(1); + $this->assertEquals(['catalog_product_1'], $this->_model->getIdentities()); + } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php index 6de9c01656aecb292c061550e65c69bc000ee0c1..14b5bebfb49f0ac812c2a283a58ac61f5632cbbe 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php @@ -259,4 +259,14 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase ]; $this->assertEquals($fields, $this->model->getConfigItemOptions()); } + + public function testGetManageStock() + { + $store = 1; + $this->scopeConfigMock->expects($this->once()) + ->method('isSetFlag') + ->with(Configuration::XML_PATH_MANAGE_STOCK, \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $store) + ->willReturn(1); + $this->assertEquals(1, $this->model->getManageStock($store)); + } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php index f6cfa8b4e7e6643d3b4df80ae83fe79bd57dd0fc..93f078e9ca11d272ef5abc37b8d2c73820cf9096 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php @@ -403,4 +403,58 @@ class ItemTest extends \PHPUnit_Framework_TestCase $this->item->setLowStockDate($date); $this->assertEquals($date, $this->item->getLowStockDate()); } + + /** + * @param array $config + * @param mixed $expected + * @dataProvider getQtyIncrementsDataProvider( + */ + public function testGetQtyIncrements($config, $expected) + { + $this->setDataArrayValue('qty_increments', $config['qty_increments']); + $this->setDataArrayValue('enable_qty_increments', $config['enable_qty_increments']); + $this->setDataArrayValue('use_config_qty_increments', $config['use_config_qty_increments']); + if ($config['use_config_qty_increments']) { + $this->stockConfiguration->expects($this->once()) + ->method('getQtyIncrements') + ->with($this->storeId) + ->willReturn($config['qty_increments']); + } else { + $this->setDataArrayValue('qty_increments', $config['qty_increments']); + } + $this->assertEquals($expected, $this->item->getQtyIncrements()); + } + + /** + * @return array + */ + public function getQtyIncrementsDataProvider() + { + return [ + [ + [ + 'qty_increments' => 1, + 'enable_qty_increments' => true, + 'use_config_qty_increments' => true + ], + 1 + ], + [ + [ + 'qty_increments' => -2, + 'enable_qty_increments' => true, + 'use_config_qty_increments' => true + ], + false + ], + [ + [ + 'qty_increments' => 3, + 'enable_qty_increments' => true, + 'use_config_qty_increments' => false + ], + 3 + ], + ]; + } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php index d01e095949ef6020c099d017e7dd15cca5a30e7f..ed72a425ea8fb2b4d67ec6a75fbf405dfb79505a 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php @@ -6,9 +6,12 @@ namespace Magento\CatalogInventory\Test\Unit\Model\Stock; use \Magento\CatalogInventory\Model\Stock\StockItemRepository; +use \Magento\CatalogInventory\Api\Data as InventoryApiData; /** * Class StockItemRepositoryTest + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase { @@ -18,7 +21,11 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase protected $model; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\CatalogInventory\Model\Stock\Item |\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockItemMock; + /** + * @var \Magento\CatalogInventory\Api\StockConfigurationInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $stockConfigurationMock; @@ -28,42 +35,42 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase protected $productMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\CatalogInventory\Model\Spi\StockStateProviderInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $stockStateProviderMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\CatalogInventory\Model\Resource\Stock\Item|\PHPUnit_Framework_MockObject_MockObject */ protected $stockItemResourceMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var InventoryApiData\StockItemInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $stockItemMock; + protected $stockItemFactoryMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var InventoryApiData\StockItemCollectionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $stockItemCollectionMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Catalog\Model\ProductFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $productFactoryMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\DB\QueryBuilderFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $queryBuilderMock; + protected $queryBuilderFactoryMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\DB\MapperFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $mapperMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $localeDateMock; @@ -74,6 +81,27 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase protected function setUp() { + $this->stockItemMock = $this->getMockBuilder('\Magento\CatalogInventory\Model\Stock\Item') + ->disableOriginalConstructor() + ->setMethods( + [ + 'getItemId', + 'getProductId', + 'setIsInStock', + 'setStockStatusChangedAutomaticallyFlag', + 'getStockStatusChangedAutomaticallyFlag', + 'getManageStock', + 'setLowStockDate', + 'setStockStatusChangedAuto', + 'hasStockStatusChangedAutomaticallyFlag', + 'setQty', + 'getWebsiteId', + 'setWebsiteId', + 'getStockId', + 'setStockId' + ] + ) + ->getMock(); $this->stockConfigurationMock = $this->getMockBuilder( 'Magento\CatalogInventory\Api\StockConfigurationInterface' ) @@ -87,12 +115,16 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase $this->stockItemResourceMock = $this->getMockBuilder('Magento\CatalogInventory\Model\Resource\Stock\Item') ->disableOriginalConstructor() ->getMock(); - $this->stockItemMock = $this->getMockBuilder('Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory') + $this->stockItemFactoryMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory' + ) + ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); $this->stockItemCollectionMock = $this->getMockBuilder( 'Magento\CatalogInventory\Api\Data\StockItemCollectionInterfaceFactory' ) + ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); $this->productFactoryMock = $this->getMockBuilder('Magento\Catalog\Model\ProductFactory') @@ -101,12 +133,14 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase ->getMock(); $this->productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') ->disableOriginalConstructor() + ->setMethods(['load', 'getId', 'getTypeId', '__wakeup']) ->getMock(); $this->productFactoryMock->expects($this->any()) ->method('create') ->willReturn($this->productMock); - $this->queryBuilderMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + $this->queryBuilderFactoryMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); $this->mapperMock = $this->getMockBuilder('Magento\Framework\DB\MapperFactory') @@ -127,29 +161,167 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase $this->stockConfigurationMock, $this->stockStateProviderMock, $this->stockItemResourceMock, - $this->stockItemMock, + $this->stockItemFactoryMock, $this->stockItemCollectionMock, $this->productFactoryMock, - $this->queryBuilderMock, + $this->queryBuilderFactoryMock, $this->mapperMock, $this->localeDateMock, $this->indexProcessorMock ); } + public function testDelete() + { + $this->stockItemResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockItemMock) + ->willReturnSelf(); + + $this->assertTrue($this->model->delete($this->stockItemMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + */ + public function testDeleteException() + { + $this->stockItemResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockItemMock) + ->willThrowException(new \Exception()); + + $this->model->delete($this->stockItemMock); + } + + public function testDeleteById() + { + $id = 1; + + $this->stockItemFactoryMock->expects($this->once())->method('create')->willReturn($this->stockItemMock); + $this->stockItemResourceMock->expects($this->once())->method('load')->with($this->stockItemMock, $id); + $this->stockItemMock->expects($this->once())->method('getItemId')->willReturn($id); + + $this->assertTrue($this->model->deleteById($id)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + * @expectedExceptionMessage Stock Item with id "1" does not exist. + */ + public function testDeleteByIdException() + { + $id = 1; + + $this->stockItemFactoryMock->expects($this->once())->method('create')->willReturn($this->stockItemMock); + $this->stockItemResourceMock->expects($this->once())->method('load')->with($this->stockItemMock, $id); + $this->stockItemMock->expects($this->once())->method('getItemId')->willReturn(null); + + $this->assertTrue($this->model->deleteById($id)); + } + public function testSave() { - $params = []; + $productId = 1; + + $this->stockItemMock->expects($this->any())->method('getProductId')->willReturn($productId); + $this->productMock->expects($this->once())->method('load')->with($productId)->willReturnSelf(); + $this->productMock->expects($this->once())->method('getId')->willReturn($productId); + $this->productMock->expects($this->once())->method('getTypeId')->willReturn('typeId'); + $this->stockConfigurationMock->expects($this->once())->method('isQty')->with('typeId')->willReturn(true); + $this->stockStateProviderMock->expects($this->once()) + ->method('verifyStock') + ->with($this->stockItemMock) + ->willReturn(false); + $this->stockItemMock->expects($this->once())->method('getManageStock')->willReturn(true); + $this->stockItemMock->expects($this->once())->method('setIsInStock')->with(false)->willReturnSelf(); + $this->stockItemMock->expects($this->once()) + ->method('setStockStatusChangedAutomaticallyFlag') + ->with(true) + ->willReturnSelf(); + $this->stockItemMock->expects($this->any())->method('setLowStockDate')->willReturnSelf(); + $this->stockStateProviderMock->expects($this->once()) + ->method('verifyNotification') + ->with($this->stockItemMock) + ->willReturn(true); + $this->stockItemMock->expects($this->atLeastOnce())->method('setStockStatusChangedAuto')->willReturnSelf(); + $this->stockItemMock->expects($this->once()) + ->method('hasStockStatusChangedAutomaticallyFlag') + ->willReturn(true); + $this->stockItemMock->expects($this->once()) + ->method('getStockStatusChangedAutomaticallyFlag') + ->willReturn(true); + $this->stockItemMock->expects($this->once())->method('getWebsiteId')->willReturn(1); + $this->stockItemMock->expects($this->once())->method('setWebsiteId')->with(1)->willReturnSelf(); + $this->stockItemMock->expects($this->once())->method('getStockId')->willReturn(1); + $this->stockItemMock->expects($this->once())->method('setStockId')->with(1)->willReturnSelf(); + $this->stockItemResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockItemMock) + ->willReturnSelf(); + $this->indexProcessorMock->expects($this->once())->method('reindexRow')->with($productId); + + $this->assertEquals($this->stockItemMock, $this->model->save($this->stockItemMock)); + } + + public function testSaveWithoutProductId() + { + $productId = 1; + + $this->stockItemMock->expects($this->any())->method('getProductId')->willReturn($productId); + $this->productMock->expects($this->once())->method('load')->with($productId)->willReturnSelf(); + $this->productMock->expects($this->once())->method('getId')->willReturn(null); + + $this->assertEquals($this->stockItemMock, $this->model->save($this->stockItemMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotSaveException + */ + public function testSaveException() + { + $productId = 1; + + $this->stockItemMock->expects($this->any())->method('getProductId')->willReturn($productId); + $this->productMock->expects($this->once())->method('load')->with($productId)->willReturnSelf(); + $this->productMock->expects($this->once())->method('getId')->willReturn($productId); + $this->productMock->expects($this->once())->method('getTypeId')->willReturn('typeId'); + $this->stockConfigurationMock->expects($this->once())->method('isQty')->with('typeId')->willReturn(false); + $this->stockItemMock->expects($this->once())->method('setQty')->with(0)->willReturnSelf(); + $this->stockItemMock->expects($this->once())->method('getWebsiteId')->willReturn(1); + $this->stockItemMock->expects($this->once())->method('setWebsiteId')->with(1)->willReturnSelf(); + $this->stockItemMock->expects($this->once())->method('getStockId')->willReturn(1); + $this->stockItemMock->expects($this->once())->method('setStockId')->with(1)->willReturnSelf(); + $this->stockItemResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockItemMock) + ->willThrowException(new \Exception()); + + $this->model->save($this->stockItemMock); + } - $stockItemMock = $this->getMockBuilder('Magento\CatalogInventory\Api\Data\StockItemInterface') + public function testGetList() + { + $criteriaMock = $this->getMockBuilder('Magento\CatalogInventory\Api\StockItemCriteriaInterface') + ->getMock(); + $queryBuilderMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilder') ->disableOriginalConstructor() + ->setMethods(['setCriteria', 'setResource', 'create']) ->getMock(); - $this->indexProcessorMock->expects($this->any()) - ->method('reindexRow') - ->withAnyParameters(); - $this->assertInstanceOf( - 'Magento\CatalogInventory\Api\Data\StockItemInterface', - $this->model->save($stockItemMock, $params) - ); + $queryMock = $this->getMockBuilder('Magento\Framework\DB\QueryInterface') + ->getMock(); + $queryCollectionMock = $this->getMockBuilder('Magento\CatalogInventory\Api\Data\StockItemCollectionInterface') + ->getMock(); + + $this->queryBuilderFactoryMock->expects($this->once())->method('create')->willReturn($queryBuilderMock); + $queryBuilderMock->expects($this->once())->method('setCriteria')->with($criteriaMock)->willReturnSelf(); + $queryBuilderMock->expects($this->once()) + ->method('setResource') + ->with($this->stockItemResourceMock) + ->willReturnSelf(); + $queryBuilderMock->expects($this->once())->method('create')->willReturn($queryMock); + $this->stockItemCollectionMock->expects($this->once())->method('create')->willReturn($queryCollectionMock); + + $this->assertEquals($queryCollectionMock, $this->model->getList($criteriaMock)); } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..dc13237c4677445f25dd6d6107100a8345e61b9c --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php @@ -0,0 +1,186 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CatalogInventory\Test\Unit\Model\Stock; + +use \Magento\CatalogInventory\Model\Stock\StockRepository; + +/** + * Class StockRepositoryTest + */ +class StockRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var StockRepository + */ + protected $model; + + /** + * @var \Magento\CatalogInventory\Model\Stock |\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockMock; + + /** + * @var \Magento\CatalogInventory\Model\Resource\Stock|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockResourceMock; + + /** + * @var Magento\CatalogInventory\Model\StockFactory |\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockFactoryMock; + + /** + * @var Magento\CatalogInventory\Api\Data\StockCollectionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockCollectionMock; + + /** + * @var \Magento\Framework\DB\QueryBuilderFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $queryBuilderFactoryMock; + + /** + * @var \Magento\Framework\DB\MapperFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $mapperMock; + + protected function setUp() + { + + $this->stockMock = $this->getMockBuilder('\Magento\CatalogInventory\Model\Stock') + ->disableOriginalConstructor() + ->getMock(); + + $this->stockResourceMock = $this->getMockBuilder('\Magento\CatalogInventory\Model\Resource\Stock') + ->disableOriginalConstructor() + ->getMock(); + $this->stockFactoryMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Model\StockFactory' + ) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->stockCollectionMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Api\Data\StockCollectionInterfaceFactory' + ) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + + $this->queryBuilderFactoryMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->mapperMock = $this->getMockBuilder('Magento\Framework\DB\MapperFactory') + ->disableOriginalConstructor() + ->getMock(); + + $this->model = new StockRepository( + $this->stockResourceMock, + $this->stockFactoryMock, + $this->stockCollectionMock, + $this->queryBuilderFactoryMock, + $this->mapperMock + ); + } + + public function testSave() + { + $this->stockResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockMock) + ->willReturnSelf(); + + $this->assertEquals($this->stockMock, $this->model->save($this->stockMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotSaveException + */ + public function testSaveException() + { + $this->stockResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockMock) + ->willThrowException(new \Exception()); + + $this->model->save($this->stockMock); + } + + public function testGetList() + { + $criteriaMock = $this->getMockBuilder('Magento\CatalogInventory\Api\StockCriteriaInterface') + ->getMock(); + $queryBuilderMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilder') + ->disableOriginalConstructor() + ->setMethods(['setCriteria', 'setResource', 'create']) + ->getMock(); + $queryMock = $this->getMockBuilder('Magento\Framework\DB\QueryInterface') + ->getMock(); + $queryCollectionMock = $this->getMockBuilder('Magento\CatalogInventory\Api\Data\StockCollectionInterface') + ->getMock(); + + $this->queryBuilderFactoryMock->expects($this->once())->method('create')->willReturn($queryBuilderMock); + $queryBuilderMock->expects($this->once())->method('setCriteria')->with($criteriaMock)->willReturnSelf(); + $queryBuilderMock->expects($this->once()) + ->method('setResource') + ->with($this->stockResourceMock) + ->willReturnSelf(); + $queryBuilderMock->expects($this->once())->method('create')->willReturn($queryMock); + $this->stockCollectionMock->expects($this->once())->method('create')->willReturn($queryCollectionMock); + + $this->assertEquals($queryCollectionMock, $this->model->getList($criteriaMock)); + } + + public function testDelete() + { + $this->stockResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockMock) + ->willReturnSelf(); + + $this->assertTrue($this->model->delete($this->stockMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + */ + public function testDeleteException() + { + $this->stockResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockMock) + ->willThrowException(new \Exception()); + + $this->model->delete($this->stockMock); + } + + public function testDeleteById() + { + $id = 1; + + $this->stockFactoryMock->expects($this->once())->method('create')->willReturn($this->stockMock); + $this->stockResourceMock->expects($this->once())->method('load')->with($this->stockMock, $id); + $this->stockMock->expects($this->once())->method('getId')->willReturn($id); + + $this->assertTrue($this->model->deleteById($id)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + * @expectedExceptionMessage Stock with id "1" does not exist. + */ + public function testDeleteByIdException() + { + $id = 1; + + $this->stockFactoryMock->expects($this->once())->method('create')->willReturn($this->stockMock); + $this->stockResourceMock->expects($this->once())->method('load')->with($this->stockMock, $id); + $this->stockMock->expects($this->once())->method('getId')->willReturn(null); + + $this->assertTrue($this->model->deleteById($id)); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..19eadb2165460d9f9ba2428d652580f6f78a0b6b --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php @@ -0,0 +1,185 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CatalogInventory\Test\Unit\Model\Stock; + +use \Magento\CatalogInventory\Model\Stock\StockStatusRepository; +use \Magento\CatalogInventory\Api\Data as InventoryApiData; + +/** + * Class StockStatusRepositoryTest + */ +class StockStatusRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var StockStatusRepository + */ + protected $model; + + /** + * @var \Magento\CatalogInventory\Model\Stock\Status|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockStatusMock; + + /** + * @var \Magento\CatalogInventory\Model\Resource\Stock\Status|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockStatusResourceMock; + + /** + * @var Magento\CatalogInventory\Model\Stock\StatusFactory |\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockStatusFactoryMock; + + /** + * @var InventoryApiData\StockStatusCollectionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockStatusCollectionMock; + + /** + * @var \Magento\Framework\DB\QueryBuilderFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $queryBuilderFactoryMock; + + /** + * @var \Magento\Framework\DB\MapperFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $mapperMock; + + protected function setUp() + { + $this->stockStatusMock = $this->getMockBuilder('\Magento\CatalogInventory\Model\Stock\Status') + ->disableOriginalConstructor() + ->getMock(); + $this->stockStatusResourceMock = $this->getMockBuilder('\Magento\CatalogInventory\Model\Resource\Stock\Status') + ->disableOriginalConstructor() + ->getMock(); + $this->stockStatusFactoryMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Model\Stock\StatusFactory' + ) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->stockStatusCollectionMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Api\Data\StockStatusCollectionInterfaceFactory' + ) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->queryBuilderFactoryMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->mapperMock = $this->getMockBuilder('Magento\Framework\DB\MapperFactory') + ->disableOriginalConstructor() + ->getMock(); + + $this->model = new StockStatusRepository( + $this->stockStatusResourceMock, + $this->stockStatusFactoryMock, + $this->stockStatusCollectionMock, + $this->queryBuilderFactoryMock, + $this->mapperMock + ); + } + + public function testSave() + { + $this->stockStatusResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockStatusMock) + ->willReturnSelf(); + + $this->assertEquals($this->stockStatusMock, $this->model->save($this->stockStatusMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotSaveException + */ + public function testSaveException() + { + $this->stockStatusResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockStatusMock) + ->willThrowException(new \Exception()); + + $this->model->save($this->stockStatusMock); + } + + public function testGetList() + { + $criteriaMock = $this->getMockBuilder('Magento\CatalogInventory\Api\StockStatusCriteriaInterface') + ->getMock(); + $queryBuilderMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilder') + ->disableOriginalConstructor() + ->setMethods(['setCriteria', 'setResource', 'create']) + ->getMock(); + $queryMock = $this->getMockBuilder('Magento\Framework\DB\QueryInterface') + ->getMock(); + $queryCollectionMock = $this->getMockBuilder('Magento\CatalogInventory\Api\Data\StockStatusCollectionInterface') + ->getMock(); + + $this->queryBuilderFactoryMock->expects($this->once())->method('create')->willReturn($queryBuilderMock); + $queryBuilderMock->expects($this->once())->method('setCriteria')->with($criteriaMock)->willReturnSelf(); + $queryBuilderMock->expects($this->once()) + ->method('setResource') + ->with($this->stockStatusResourceMock) + ->willReturnSelf(); + $queryBuilderMock->expects($this->once())->method('create')->willReturn($queryMock); + $this->stockStatusCollectionMock->expects($this->once())->method('create')->willReturn($queryCollectionMock); + + $this->assertEquals($queryCollectionMock, $this->model->getList($criteriaMock)); + } + + public function testDelete() + { + $this->stockStatusResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockStatusMock) + ->willReturnSelf(); + + $this->assertTrue($this->model->delete($this->stockStatusMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + */ + public function testDeleteException() + { + $this->stockStatusResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockStatusMock) + ->willThrowException(new \Exception()); + + $this->model->delete($this->stockStatusMock); + } + + public function testDeleteById() + { + $id = 1; + + $this->stockStatusFactoryMock->expects($this->once())->method('create')->willReturn($this->stockStatusMock); + $this->stockStatusResourceMock->expects($this->once())->method('load')->with($this->stockStatusMock, $id); + + $this->assertTrue($this->model->deleteById($id)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + */ + public function testDeleteByIdException() + { + $id = 1; + + $this->stockStatusFactoryMock->expects($this->once())->method('create')->willReturn($this->stockStatusMock); + $this->stockStatusResourceMock->expects($this->once())->method('load')->with($this->stockStatusMock, $id); + $this->stockStatusResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockStatusMock) + ->willThrowException(new \Exception()); + + $this->assertTrue($this->model->deleteById($id)); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0c7cdea123e283baf3a5f2f9021e5dcb057fbbf4 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php @@ -0,0 +1,52 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CatalogInventory\Test\Unit\Model; + +/** + * Class StockRegistryTest + */ +class StockRegistryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\CatalogInventory\Model\StockRegistry + */ + protected $model; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $criteria; + + public function setUp() + { + $this->criteria = $this->getMockBuilder('Magento\CatalogInventory\Api\StockItemCriteriaInterface') + ->disableOriginalConstructor() + ->getMock(); + + $criteriaFactory = $this->getMockBuilder('Magento\CatalogInventory\Api\StockItemCriteriaInterfaceFactory') + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $criteriaFactory->expects($this->once())->method('create')->willReturn($this->criteria); + + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->model = $objectManager->getObject( + 'Magento\CatalogInventory\Model\StockRegistry', + [ + 'criteriaFactory' => $criteriaFactory + ] + ); + } + + public function testGetLowStockItems() + { + $this->criteria->expects($this->once())->method('setLimit')->with(1, 0); + $this->criteria->expects($this->once())->method('setWebsiteFilter')->with(1); + $this->criteria->expects($this->once())->method('setQtyFilter')->with('<='); + $this->criteria->expects($this->once())->method('addField')->with('qty'); + $this->model->getLowStockItems(1, 100); + } +} diff --git a/app/code/Magento/CatalogInventory/composer.json b/app/code/Magento/CatalogInventory/composer.json index 17807abf00284e37befeee24f9146e7822ab1675..fa1c799fe739d3bcf87ca6f916bcde0962624808 100644 --- a/app/code/Magento/CatalogInventory/composer.json +++ b/app/code/Magento/CatalogInventory/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogInventory/etc/webapi.xml b/app/code/Magento/CatalogInventory/etc/webapi.xml index 80317eccf51a7dd8ba3e7d24fe0497cef61e9df2..fe200c8628cb130aa2f3847283c7b52e0bac3b23 100644 --- a/app/code/Magento/CatalogInventory/etc/webapi.xml +++ b/app/code/Magento/CatalogInventory/etc/webapi.xml @@ -13,7 +13,7 @@ <resource ref="Magento_CatalogInventory::cataloginventory"/> </resources> </route> - <route url="/V1/stockItems/:productSku" method="PUT"> + <route url="/V1/products/:productSku/stockItems/:itemId" method="PUT"> <service class="Magento\CatalogInventory\Api\StockRegistryInterface" method="updateStockItemBySku"/> <resources> <resource ref="Magento_CatalogInventory::cataloginventory"/> diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php index 328482c119808ee3a2a47dad19363837a9649a71..f5c53227cf41c7587d110a9b50dab39aae37bd10 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - /** * Backend Catalog Price Rules controller * @@ -36,11 +34,15 @@ class Catalog extends Action protected $_coreRegistry = null; /** + * Date filter instance + * * @var \Magento\Framework\Stdlib\DateTime\Filter\Date */ protected $_dateFilter; /** + * Constructor + * * @param Context $context * @param Registry $coreRegistry * @param Date $dateFilter @@ -53,6 +55,8 @@ class Catalog extends Action } /** + * Init action + * * @return $this */ protected function _initAction() @@ -68,6 +72,8 @@ class Catalog extends Action } /** + * Is access to section allowed + * * @return bool */ protected function _isAllowed() diff --git a/app/code/Magento/CatalogRule/Helper/Data.php b/app/code/Magento/CatalogRule/Helper/Data.php index 439cff46006938de35eb744508e7b7424413c2fa..33ff883655675bf067876ac24d74ef0248ed99ce 100644 --- a/app/code/Magento/CatalogRule/Helper/Data.php +++ b/app/code/Magento/CatalogRule/Helper/Data.php @@ -12,13 +12,12 @@ namespace Magento\CatalogRule\Helper; class Data extends \Magento\Framework\App\Helper\AbstractHelper { /** - * Algorithm for calculating price rule + * Algorithm for calculating price by rule * * @param string $actionOperator * @param int $ruleAmount * @param float $price * @return float|int - * @api */ public function calcPriceRule($actionOperator, $ruleAmount, $price) { diff --git a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php index 55b77da9849cec49ac94e2af32d15e6caf00aeb8..cef79f4f73706fba4969a990a42bc5836f244701 100755 --- a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php +++ b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php @@ -18,6 +18,15 @@ class IndexBuilder { const SECONDS_IN_DAY = 86400; + /** + * CatalogRuleGroupWebsite columns list + * + * This array contain list of CatalogRuleGroupWebsite table columns + * + * @var array + */ + protected $_catalogRuleGroupWebsiteColumnsList = ['rule_id', 'customer_group_id', 'website_id']; + /** * @var \Magento\Framework\App\Resource */ @@ -415,8 +424,6 @@ class IndexBuilder */ protected function applyAllRules(Product $product = null) { - $write = $this->getWriteAdapter(); - $fromDate = mktime(0, 0, 0, date('m'), date('d') - 1); $toDate = mktime(0, 0, 0, date('m'), date('d') + 1); @@ -499,6 +506,17 @@ class IndexBuilder $this->saveRuleProductPrices($dayPrices); } + return $this->updateCatalogRuleGroupWebsiteData(); + } + + /** + * Update CatalogRuleGroupWebsite data + * + * @return $this + */ + protected function updateCatalogRuleGroupWebsiteData() + { + $write = $this->getWriteAdapter(); $write->delete($this->getTable('catalogrule_group_website'), []); $timestamp = $this->dateTime->gmtTimestamp(); @@ -507,11 +525,15 @@ class IndexBuilder true )->from( $this->getTable('catalogrule_product'), - ['rule_id', 'customer_group_id', 'website_id'] + $this->_catalogRuleGroupWebsiteColumnsList )->where( "{$timestamp} >= from_time AND (({$timestamp} <= to_time AND to_time > 0) OR to_time = 0)" ); - $query = $select->insertFromSelect($this->getTable('catalogrule_group_website')); + $query = $select->insertFromSelect( + $this->getTable('catalogrule_group_website'), + $this->_catalogRuleGroupWebsiteColumnsList + ); + $write->query($query); return $this; @@ -658,7 +680,6 @@ class IndexBuilder $arrData[$key]['latest_start_date'] = $this->dateFormat->formatDate($data['latest_start_date'], false); $arrData[$key]['earliest_end_date'] = $this->dateFormat->formatDate($data['earliest_end_date'], false); } - $adapter->insertOnDuplicate($this->getTable('catalogrule_affected_product'), array_unique($productIds)); $adapter->insertOnDuplicate($this->getTable('catalogrule_product_price'), $arrData); } catch (\Exception $e) { throw $e; diff --git a/app/code/Magento/CatalogRule/Setup/InstallSchema.php b/app/code/Magento/CatalogRule/Setup/InstallSchema.php index 5c4700a3fb0ae645f1861a08a69526b407ed7e1d..68629bbadabce2551c3b3c2c74bcce3f44e26024 100644 --- a/app/code/Magento/CatalogRule/Setup/InstallSchema.php +++ b/app/code/Magento/CatalogRule/Setup/InstallSchema.php @@ -358,22 +358,6 @@ class InstallSchema implements InstallSchemaInterface $installer->getConnection()->createTable($table); - /** - * Create table 'catalogrule_affected_product' - */ - $table = $installer->getConnection() - ->newTable($installer->getTable('catalogrule_affected_product')) - ->addColumn( - 'product_id', - \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, - null, - ['unsigned' => true, 'nullable' => false, 'primary' => true], - 'Product Id' - ) - ->setComment('CatalogRule Affected Product'); - - $installer->getConnection()->createTable($table); - /** * Create table 'catalogrule_group_website' */ diff --git a/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php b/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0d75d688a07a164bb674fa343d97800049173af0 --- /dev/null +++ b/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php @@ -0,0 +1,67 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\CatalogRule\Test\Unit\Helper; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; + +class DataTest extends \PHPUnit_Framework_TestCase +{ + /** + * Helper object + * + * @var \Magento\CatalogRule\Helper\Data + */ + protected $helper; + + protected function setUp() + { + $this->helper = (new ObjectManager($this))->getObject('Magento\CatalogRule\Helper\Data'); + } + + /** + * Test price rule calculation + * + * @param string $actionOperator + * @param int|float $ruleAmount + * @param int|float $price + * @param int|float $expectedAmount + * + * @dataProvider calcPriceRuleDataProvider + */ + public function testCalcPriceRule($actionOperator, $ruleAmount, $price, $expectedAmount) + { + $this->assertEquals($expectedAmount, $this->helper->calcPriceRule($actionOperator, $ruleAmount, $price)); + } + + /** + * Data provider for cal price rule test + * + * @return array + */ + public function calcPriceRuleDataProvider() + { + return [ + ['to_fixed', 10, 10, 10], + ['to_fixed', 0, 10, 0], + ['to_fixed', 10, 0, 0], + ['to_fixed', 0, 0, 0], + ['to_percent', 100, 100, 100], + ['to_percent', 10, 100, 10], + ['to_percent', 10, 70, 7], + ['to_percent', 100, 10, 10], + ['by_fixed', 100, 100, 0], + ['by_fixed', 10, 100, 90], + ['by_fixed', 100, 10, 0], + ['by_percent', 100, 100, 0], + ['by_percent', 100, 10, 0], + ['by_percent', 100, 1, 0], + ['by_percent', 10, 100, 90], + ['by_percent', 10, 10, 9], + ['by_percent', 1, 10, 9.90], + ]; + } +} diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/CronTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/CronTest.php index 07e27c6398a6a8678788390b12e5fd0076cea02e..2d8f4b8b8a6a95955be084fcda3a2a6ad25dab6c 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Model/CronTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/CronTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\CatalogRule\Test\Unit\Model; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -13,23 +11,35 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class CronTest extends \PHPUnit_Framework_TestCase { /** + * Processor + * * @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor|\PHPUnit_Framework_MockObject_MockObject */ protected $ruleProductProcessor; /** + * Cron object + * * @var \Magento\CatalogRule\Model\Cron */ protected $cron; protected function setUp() { - $this->ruleProductProcessor = $this->getMock('Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', - [], [], '', false); - - $this->cron = (new ObjectManager($this))->getObject('Magento\CatalogRule\Model\Cron', [ - 'ruleProductProcessor' => $this->ruleProductProcessor, - ]); + $this->ruleProductProcessor = $this->getMock( + 'Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', + [], + [], + '', + false + ); + + $this->cron = (new ObjectManager($this))->getObject( + 'Magento\CatalogRule\Model\Cron', + [ + 'ruleProductProcessor' => $this->ruleProductProcessor, + ] + ); } public function testDailyCatalogUpdate() diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8c41a3c24276dcad12e5733216b5eb2a21cc3640 --- /dev/null +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php @@ -0,0 +1,213 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\CatalogRule\Test\Unit\Model\Indexer; + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.TooManyFields) + */ +class IndexBuilderTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\CatalogRule\Model\Indexer\IndexBuilder + */ + protected $indexBuilder; + + /** + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resource; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManager; + + /** + * @var \Magento\CatalogRule\Model\Resource\Rule\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $ruleCollectionFactory; + + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $logger; + + /** + * @var \Magento\Framework\Pricing\PriceCurrencyInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $priceCurrency; + + + /** + * @var \Magento\Eav\Model\Config|\PHPUnit_Framework_MockObject_MockObject + */ + protected $eavConfig; + + /** + * @var \Magento\Framework\Stdlib\DateTime|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dateFormat; + + /** + * @var \Magento\Framework\Stdlib\DateTime\DateTime|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dateTime; + + /** + * @var \Magento\Catalog\Model\ProductFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $productFactory; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $connection; + + /** + * @var \Magento\Framework\DB\Select|\PHPUnit_Framework_MockObject_MockObject + */ + protected $select; + + /** + * @var \Zend_Db_Statement_Interface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $db; + + /** + * @var \Magento\Store\Model\Website|\PHPUnit_Framework_MockObject_MockObject + */ + protected $website; + + /** + * @var \Magento\Rule\Model\Condition\Combine|\PHPUnit_Framework_MockObject_MockObject + */ + protected $combine; + + /** + * @var \Magento\CatalogRule\Model\Rule|\PHPUnit_Framework_MockObject_MockObject + */ + protected $rules; + + /** + * @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject + */ + protected $product; + + /** + * @var \Magento\Eav\Model\Entity\Attribute\AbstractAttribute|\PHPUnit_Framework_MockObject_MockObject + */ + protected $attribute; + + /** + * @var \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend|\PHPUnit_Framework_MockObject_MockObject + */ + protected $backend; + + /** + * Set up test + * + * @return void + */ + protected function setUp() + { + $this->resource = $this->getMock( + 'Magento\Framework\App\Resource', + ['getConnection', 'getTableName'], + [], + '', + false + ); + $this->ruleCollectionFactory = $this->getMock( + 'Magento\CatalogRule\Model\Resource\Rule\CollectionFactory', + ['create', 'addFieldToFilter'], + [], + '', + false + ); + $this->backend = $this->getMock( + 'Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend', + [], + [], + '', + false + ); + $this->select = $this->getMock('Magento\Framework\DB\Select', [], [], '', false); + $this->connection = $this->getMock('Magento\Framework\DB\Adapter\AdapterInterface'); + $this->db = $this->getMock('Zend_Db_Statement_Interface', [], [], '', false); + $this->website = $this->getMock('Magento\Store\Model\Website', [], [], '', false); + $this->storeManager = $this->getMock('Magento\Store\Model\StoreManagerInterface', [], [], '', false); + $this->combine = $this->getMock('Magento\Rule\Model\Condition\Combine', [], [], '', false); + $this->rules = $this->getMock('Magento\CatalogRule\Model\Rule', [], [], '', false); + $this->logger = $this->getMock('Psr\Log\LoggerInterface', [], [], '', false); + $this->attribute = $this->getMock('Magento\Eav\Model\Entity\Attribute\AbstractAttribute', [], [], '', false); + $this->priceCurrency = $this->getMock('Magento\Framework\Pricing\PriceCurrencyInterface'); + $this->dateFormat = $this->getMock('Magento\Framework\Stdlib\DateTime', [], [], '', false); + $this->dateTime = $this->getMock('Magento\Framework\Stdlib\DateTime\DateTime', [], [], '', false); + $this->eavConfig = $this->getMock('Magento\Eav\Model\Config', [], [], '', false); + $this->product = $this->getMock('Magento\Catalog\Model\Product', [], [], '', false); + $this->productFactory = $this->getMock('Magento\Catalog\Model\ProductFactory', ['create'], [], '', false); + + $this->connection->expects($this->any())->method('select')->will($this->returnValue($this->select)); + $this->connection->expects($this->any())->method('query')->will($this->returnValue($this->db)); + + $this->select->expects($this->any())->method('distinct')->will($this->returnSelf()); + $this->select->expects($this->any())->method('where')->will($this->returnSelf()); + $this->select->expects($this->any())->method('from')->will($this->returnSelf()); + $this->select->expects($this->any())->method('order')->will($this->returnSelf()); + + $this->resource->expects($this->any())->method('getConnection')->will($this->returnValue($this->connection)); + $this->resource->expects($this->any())->method('getTableName')->will($this->returnArgument(0)); + + $this->storeManager->expects($this->any())->method('getWebsites')->will($this->returnValue([$this->website])); + $this->storeManager->expects($this->any())->method('getWebsite')->will($this->returnValue($this->website)); + + $this->rules->expects($this->any())->method('getId')->will($this->returnValue(1)); + $this->rules->expects($this->any())->method('getWebsiteIds')->will($this->returnValue([1])); + $this->rules->expects($this->any())->method('getConditions')->will($this->returnValue($this->combine)); + $this->rules->expects($this->any())->method('getCustomerGroupIds')->will($this->returnValue([1])); + + $this->ruleCollectionFactory->expects($this->any())->method('create')->will($this->returnSelf()); + $this->ruleCollectionFactory->expects($this->any())->method('addFieldToFilter')->will( + $this->returnValue([$this->rules]) + ); + + $this->product->expects($this->any())->method('load')->will($this->returnSelf()); + $this->product->expects($this->any())->method('getId')->will($this->returnValue(1)); + $this->product->expects($this->any())->method('getWebsiteIds')->will($this->returnValue([1])); + + $this->combine->expects($this->any())->method('validate')->will($this->returnValue(true)); + $this->attribute->expects($this->any())->method('getBackend')->will($this->returnValue($this->backend)); + $this->eavConfig->expects($this->any())->method('getAttribute')->will($this->returnValue($this->attribute)); + $this->productFactory->expects($this->any())->method('create')->will($this->returnValue($this->product)); + + $this->indexBuilder = new \Magento\CatalogRule\Model\Indexer\IndexBuilder( + $this->ruleCollectionFactory, + $this->priceCurrency, + $this->resource, + $this->storeManager, + $this->logger, + $this->eavConfig, + $this->dateFormat, + $this->dateTime, + $this->productFactory + ); + } + + /** + * Test UpdateCatalogRuleGroupWebsiteData + * + * @covers \Magento\CatalogRule\Model\Indexer\IndexBuilder::updateCatalogRuleGroupWebsiteData + * @return void + */ + public function testUpdateCatalogRuleGroupWebsiteData() + { + $this->select->expects($this->once())->method('insertFromSelect')->with('catalogrule_group_website'); + + $this->indexBuilder->reindexByIds([1]); + } +} diff --git a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CategoryTest.php b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CategoryTest.php index 4814767f39d9e8017bd8e45804c5b8a670a2bd1c..59bd89d00579eff03f37dc0293027240c303c5e3 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CategoryTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CategoryTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\CatalogRule\Test\Unit\Plugin\Indexer; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -29,20 +27,37 @@ class CategoryTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $this->productRuleProcessor = $this->getMock('Magento\CatalogRule\Model\Indexer\Product\ProductRuleProcessor', - [], [], '', false); - $this->subject = $this->getMock('Magento\Catalog\Model\Category', ['getAffectedProductIds', '__wakeUp'], [], - '', false); - - $this->plugin = (new ObjectManager($this))->getObject('Magento\CatalogRule\Plugin\Indexer\Category', [ - 'productRuleProcessor' => $this->productRuleProcessor, - ]); + $this->productRuleProcessor = $this->getMock( + 'Magento\CatalogRule\Model\Indexer\Product\ProductRuleProcessor', + [], + [], + '', + false + ); + $this->subject = $this->getMock( + 'Magento\Catalog\Model\Category', + ['getAffectedProductIds', '__wakeUp'], + [], + '', + false + ); + + $this->plugin = (new ObjectManager($this))->getObject( + 'Magento\CatalogRule\Plugin\Indexer\Category', + [ + 'productRuleProcessor' => $this->productRuleProcessor, + ] + ); } public function testAfterSaveWithoutAffectedProductIds() { - $this->subject->expects($this->any())->method('getAffectedProductIds')->will($this->returnValue([])); - $this->productRuleProcessor->expects($this->never())->method('reindexList'); + $this->subject->expects($this->any()) + ->method('getAffectedProductIds') + ->will($this->returnValue([])); + + $this->productRuleProcessor->expects($this->never()) + ->method('reindexList'); $this->assertEquals($this->subject, $this->plugin->afterSave($this->subject, $this->subject)); } @@ -51,15 +66,21 @@ class CategoryTest extends \PHPUnit_Framework_TestCase { $productIds = [1, 2, 3]; - $this->subject->expects($this->any())->method('getAffectedProductIds')->will($this->returnValue($productIds)); - $this->productRuleProcessor->expects($this->once())->method('reindexList')->with($productIds); + $this->subject->expects($this->any()) + ->method('getAffectedProductIds') + ->will($this->returnValue($productIds)); + + $this->productRuleProcessor->expects($this->once()) + ->method('reindexList') + ->with($productIds); $this->assertEquals($this->subject, $this->plugin->afterSave($this->subject, $this->subject)); } public function testAfterDelete() { - $this->productRuleProcessor->expects($this->once())->method('markIndexerAsInvalid'); + $this->productRuleProcessor->expects($this->once()) + ->method('markIndexerAsInvalid'); $this->assertEquals($this->subject, $this->plugin->afterDelete($this->subject, $this->subject)); } diff --git a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CustomerGroupTest.php b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CustomerGroupTest.php index f0c7283f1d4eb081ed736b11591521036d21560d..fb911fb1cdbd7211e3d39b5ea2528587d9c3f343 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CustomerGroupTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CustomerGroupTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\CatalogRule\Test\Unit\Plugin\Indexer; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -13,34 +11,55 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class CustomerGroupTest extends \PHPUnit_Framework_TestCase { /** + * Rule processor mock + * * @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor|\PHPUnit_Framework_MockObject_MockObject */ protected $ruleProductProcessor; /** + * Subject group + * * @var \Magento\Customer\Model\Group|\PHPUnit_Framework_MockObject_MockObject */ protected $subject; /** + * Tested plugin + * * @var \Magento\CatalogRule\Plugin\Indexer\CustomerGroup */ protected $plugin; protected function setUp() { - $this->ruleProductProcessor = $this->getMock('Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', - [], [], '', false); - $this->subject = $this->getMock('Magento\Customer\Model\Group', [], [], '', false); + $this->ruleProductProcessor = $this->getMock( + 'Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', + [], + [], + '', + false + ); + $this->subject = $this->getMock( + 'Magento\Customer\Model\Group', + [], + [], + '', + false + ); - $this->plugin = (new ObjectManager($this))->getObject('Magento\CatalogRule\Plugin\Indexer\CustomerGroup', [ - 'ruleProductProcessor' => $this->ruleProductProcessor, - ]); + $this->plugin = (new ObjectManager($this))->getObject( + 'Magento\CatalogRule\Plugin\Indexer\CustomerGroup', + [ + 'ruleProductProcessor' => $this->ruleProductProcessor, + ] + ); } public function testAfterDelete() { - $this->ruleProductProcessor->expects($this->once())->method('markIndexerAsInvalid'); + $this->ruleProductProcessor->expects($this->once()) + ->method('markIndexerAsInvalid'); $this->assertEquals($this->subject, $this->plugin->afterDelete($this->subject, $this->subject)); } diff --git a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/ImportExportTest.php b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/ImportExportTest.php index eac185dcc129f308874f6c412f24655dbcaaf0b1..68a4dae5ef04fae0434f9af375015454afe8e238 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/ImportExportTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/ImportExportTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\CatalogRule\Test\Unit\Plugin\Indexer; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -13,36 +11,51 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class ImportExportTest extends \PHPUnit_Framework_TestCase { /** + * Indexer processor mock + * * @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor|\PHPUnit_Framework_MockObject_MockObject */ protected $ruleProductProcessor; /** + * Import model mock + * * @var \Magento\ImportExport\Model\Import|\PHPUnit_Framework_MockObject_MockObject */ protected $subject; /** + * Tested plugin + * * @var \Magento\CatalogRule\Plugin\Indexer\ImportExport */ protected $plugin; protected function setUp() { - $this->ruleProductProcessor = $this->getMock('Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', - [], [], '', false); + $this->ruleProductProcessor = $this->getMock( + 'Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', + [], + [], + '', + false + ); $this->subject = $this->getMock('Magento\ImportExport\Model\Import', [], [], '', false); - $this->plugin = (new ObjectManager($this))->getObject('Magento\CatalogRule\Plugin\Indexer\ImportExport', [ - 'ruleProductProcessor' => $this->ruleProductProcessor, - ]); + $this->plugin = (new ObjectManager($this))->getObject( + 'Magento\CatalogRule\Plugin\Indexer\ImportExport', + [ + 'ruleProductProcessor' => $this->ruleProductProcessor, + ] + ); } public function testAfterImportSource() { $result = true; - $this->ruleProductProcessor->expects($this->once())->method('markIndexerAsInvalid'); + $this->ruleProductProcessor->expects($this->once()) + ->method('markIndexerAsInvalid'); $this->assertEquals($result, $this->plugin->afterImportSource($this->subject, $result)); } diff --git a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/WebsiteTest.php b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/WebsiteTest.php index 2fca372e8e4ac7d196b2ac4bff988dc8c57a41f7..39571d32c38003914838a6d702817d09e44e8e76 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/WebsiteTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/WebsiteTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\CatalogRule\Test\Unit\Plugin\Indexer; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -13,34 +11,49 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class WebsiteTest extends \PHPUnit_Framework_TestCase { /** + * Indexer processor mock + * * @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor|\PHPUnit_Framework_MockObject_MockObject */ protected $ruleProductProcessor; /** + * Website mock + * * @var \Magento\Store\Model\Website|\PHPUnit_Framework_MockObject_MockObject */ protected $subject; /** + * Tested plugin + * * @var \Magento\CatalogRule\Plugin\Indexer\Website */ protected $plugin; protected function setUp() { - $this->ruleProductProcessor = $this->getMock('Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', - [], [], '', false); + $this->ruleProductProcessor = $this->getMock( + 'Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', + [], + [], + '', + false + ); $this->subject = $this->getMock('Magento\Store\Model\Website', [], [], '', false); - $this->plugin = (new ObjectManager($this))->getObject('Magento\CatalogRule\Plugin\Indexer\Website', [ - 'ruleProductProcessor' => $this->ruleProductProcessor, - ]); + $this->plugin = (new ObjectManager($this))->getObject( + 'Magento\CatalogRule\Plugin\Indexer\Website', + [ + 'ruleProductProcessor' => $this->ruleProductProcessor, + ] + ); } public function testAfterDelete() { - $this->ruleProductProcessor->expects($this->once())->method('markIndexerAsInvalid'); + $this->ruleProductProcessor->expects($this->once()) + ->method('markIndexerAsInvalid'); $this->assertEquals($this->subject, $this->plugin->afterDelete($this->subject, $this->subject)); } diff --git a/app/code/Magento/CatalogRule/composer.json b/app/code/Magento/CatalogRule/composer.json index 3611281f1c69d49dd4efc8f6044045e0f33614c9..539ca4af208560e40d7f890c9550308bde89485e 100644 --- a/app/code/Magento/CatalogRule/composer.json +++ b/app/code/Magento/CatalogRule/composer.json @@ -3,19 +3,19 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-rule": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-rule": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogSearch/composer.json b/app/code/Magento/CatalogSearch/composer.json index 307467c3c6217b54f23acdee9766524ef5817723..1d8292288c1c06458eea32cb0b3985d82f3147a4 100644 --- a/app/code/Magento/CatalogSearch/composer.json +++ b/app/code/Magento/CatalogSearch/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-search": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-search": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogUrlRewrite/composer.json b/app/code/Magento/CatalogUrlRewrite/composer.json index a4fdb35d55615c085511be97e462cfba358b6794..764fb5ed8db3fc88023dba3f275a543386e34315 100644 --- a/app/code/Magento/CatalogUrlRewrite/composer.json +++ b/app/code/Magento/CatalogUrlRewrite/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-import-export": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-url-rewrite": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-import-export": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-url-rewrite": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogWidget/composer.json b/app/code/Magento/CatalogWidget/composer.json index 633cc2a7cc48e4ab5bcf48ef3a976ae1bbb6302f..a1708c5aa5d6b1c14848114666f7bb6e520eaa00 100644 --- a/app/code/Magento/CatalogWidget/composer.json +++ b/app/code/Magento/CatalogWidget/composer.json @@ -3,19 +3,19 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-rule": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-rule": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-wishlist": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php index 7394a876366be2966e0ab7a98ca08b7fb0c20af2..0775d1866a45a30aeed2b94c0899757e2481bd06 100644 --- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php @@ -8,7 +8,9 @@ namespace Magento\Checkout\Block\Cart\Item; +use Magento\Checkout\Block\Cart\Item\Renderer\Actions; use Magento\Framework\Pricing\PriceCurrencyInterface; +use Magento\Framework\View\Element\AbstractBlock; use Magento\Quote\Model\Quote\Item; use Magento\Catalog\Pricing\Price\ConfiguredPriceInterface; @@ -120,10 +122,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Set item for render * - * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item + * @param Item $item * @return $this */ - public function setItem(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function setItem(Item $item) { $this->_item = $item; return $this; @@ -316,19 +318,6 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage return $this->getProductOptions(); } - /** - * Get item configure url - * - * @return string - */ - public function getConfigureUrl() - { - return $this->getUrl( - 'checkout/cart/configure', - ['id' => $this->getItem()->getId(), 'product_id' => $this->getItem()->getProduct()->getId()] - ); - } - /** * Get quote item qty * @@ -432,7 +421,7 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Return product additional information block * - * @return \Magento\Framework\View\Element\AbstractBlock + * @return AbstractBlock */ public function getProductAdditionalInformationBlock() { @@ -529,10 +518,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Return the unit price html * - * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item + * @param Item $item * @return string */ - public function getUnitPriceHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getUnitPriceHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.item.price.unit'); @@ -543,10 +532,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Return row total html * - * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item + * @param Item $item * @return string */ - public function getRowTotalHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getRowTotalHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.item.price.row'); @@ -557,10 +546,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Return item price html for sidebar * - * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item + * @param Item $item * @return string */ - public function getSidebarItemPriceHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getSidebarItemPriceHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.cart.item.price.sidebar'); @@ -571,10 +560,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Get unit price excluding tax html * - * @param Item\AbstractItem $item + * @param Item $item * @return string */ - public function getUnitPriceExclTaxHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getUnitPriceExclTaxHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.onepage.review.item.price.unit.excl'); @@ -585,10 +574,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Get unit price including tax html * - * @param Item\AbstractItem $item + * @param Item $item * @return string */ - public function getUnitPriceInclTaxHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getUnitPriceInclTaxHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.onepage.review.item.price.unit.incl'); @@ -599,10 +588,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Get row total excluding tax html * - * @param Item\AbstractItem $item + * @param Item $item * @return string */ - public function getRowTotalExclTaxHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getRowTotalExclTaxHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.onepage.review.item.price.rowtotal.excl'); @@ -613,14 +602,32 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Get row total including tax html * - * @param Item\AbstractItem $item + * @param Item $item * @return string */ - public function getRowTotalInclTaxHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getRowTotalInclTaxHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.onepage.review.item.price.rowtotal.incl'); $block->setItem($item); return $block->toHtml(); } + + /** + * Get row total including tax html + * + * @param Item $item + * @return string + */ + public function getActions(Item $item) + { + /** @var Actions $block */ + $block = $this->getChildBlock('actions'); + if ($block instanceof Actions) { + $block->setItem($item); + return $block->toHtml(); + } else { + return ''; + } + } } diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php new file mode 100644 index 0000000000000000000000000000000000000000..e3d27d82677a2e7a925f5211b2563462cf69f5a4 --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php @@ -0,0 +1,62 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Block\Cart\Item\Renderer; + +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Framework\View\Element\Text; +use Magento\Quote\Model\Quote\Item; + +class Actions extends Text +{ + /** + * @var Item + */ + protected $item; + + /** + * Returns current quote item + * + * @return Item + */ + public function getItem() + { + return $this->item; + } + + /** + * Set current quote item + * + * @param Item $item + * @return $this + */ + public function setItem(Item $item) + { + $this->item = $item; + return $this; + } + + /** + * Render html output + * + * @return string + */ + protected function _toHtml() + { + $this->setText(''); + + $layout = $this->getLayout(); + foreach ($this->getChildNames() as $child) { + /** @var Generic $childBlock */ + $childBlock = $layout->getBlock($child); + if ($childBlock instanceof Generic) { + $childBlock->setItem($this->getItem()); + $this->addText($layout->renderElement($child, false)); + } + } + + return parent::_toHtml(); + } +} diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Edit.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Edit.php new file mode 100644 index 0000000000000000000000000000000000000000..39cd103a9ee82c191dfb93b696a8df07251925f3 --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Edit.php @@ -0,0 +1,25 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Block\Cart\Item\Renderer\Actions; + +class Edit extends Generic +{ + /** + * Get item configure url + * + * @return string + */ + public function getConfigureUrl() + { + return $this->getUrl( + 'checkout/cart/configure', + [ + 'id' => $this->getItem()->getId(), + 'product_id' => $this->getItem()->getProduct()->getId() + ] + ); + } +} diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php new file mode 100644 index 0000000000000000000000000000000000000000..6ce4f2eb87a700f63b29e6b21c228559a3a782b2 --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php @@ -0,0 +1,59 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Block\Cart\Item\Renderer\Actions; + +use Magento\Framework\View\Element\Template; +use Magento\Quote\Model\Quote\Item; + +class Generic extends Template +{ + /** + * @var Item + */ + protected $item; + + /** + * Returns current quote item + * + * @return Item + */ + public function getItem() + { + return $this->item; + } + + /** + * Set current quote item + * + * @param Item $item + * @return $this + */ + public function setItem(Item $item) + { + $this->item = $item; + return $this; + } + + /** + * Check if product is visible in site visibility + * + * @return bool + */ + public function isProductVisibleInSiteVisibility() + { + return $this->getItem()->getProduct()->isVisibleInSiteVisibility(); + } + + /** + * Check if cart item is virtual + * + * @return bool + */ + public function isVirtual() + { + return (bool)$this->getItem()->getIsVirtual(); + } +} diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Remove.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Remove.php new file mode 100644 index 0000000000000000000000000000000000000000..066afb6a0822335c35069b35d227fa36ae86f19b --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Remove.php @@ -0,0 +1,41 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Block\Cart\Item\Renderer\Actions; + +use Magento\Checkout\Helper\Cart; +use Magento\Framework\View\Element\Template; + +class Remove extends Generic +{ + /** + * @var Cart + */ + protected $cartHelper; + + /** + * @param Template\Context $context + * @param Cart $cartHelper + * @param array $data + */ + public function __construct( + Template\Context $context, + Cart $cartHelper, + array $data = [] + ) { + $this->cartHelper = $cartHelper; + parent::__construct($context, $data); + } + + /** + * Get delete item POST JSON + * + * @return string + */ + public function getDeletePostJson() + { + return $this->cartHelper->getDeletePostJson($this->getItem()); + } +} diff --git a/app/code/Magento/Checkout/Block/Cart/Shipping.php b/app/code/Magento/Checkout/Block/Cart/Shipping.php index 8cf93dd33eaa66b2e65598029299152b508dc991..fd79502fbcb0d30195e19be88f619b2f7491c56c 100644 --- a/app/code/Magento/Checkout/Block/Cart/Shipping.php +++ b/app/code/Magento/Checkout/Block/Cart/Shipping.php @@ -5,8 +5,16 @@ */ namespace Magento\Checkout\Block\Cart; +use Magento\Customer\Api\AddressRepositoryInterface; +use Magento\Customer\Api\CustomerRepositoryInterface; use Magento\Framework\Pricing\PriceCurrencyInterface; +use Magento\Quote\Api\Data\EstimateAddressInterfaceFactory; +use Magento\Quote\Api\ShippingMethodManagementInterface; +use Magento\Quote\Model\QuoteRepository; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart { /** @@ -43,6 +51,31 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart */ protected $priceCurrency; + /** + * @var EstimateAddressInterfaceFactory + */ + protected $estimatedAddressFactory; + + /** + * @var ShippingMethodManagementInterface + */ + protected $shippingMethodManager; + + /** + * @var AddressRepositoryInterface + */ + protected $addressRepository; + + /** + * @var CustomerRepositoryInterface + */ + protected $customerRepository; + + /** + * @var QuoteRepository + */ + protected $quoteRepository; + /** * @param \Magento\Framework\View\Element\Template\Context $context * @param \Magento\Customer\Model\Session $customerSession @@ -50,7 +83,13 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart * @param \Magento\Directory\Block\Data $directoryBlock * @param \Magento\Shipping\Model\CarrierFactoryInterface $carrierFactory * @param PriceCurrencyInterface $priceCurrency + * @param EstimateAddressInterfaceFactory $estimatedAddressFactory + * @param ShippingMethodManagementInterface $shippingMethodManager + * @param AddressRepositoryInterface $addressRepository + * @param CustomerRepositoryInterface $customerRepository + * @param QuoteRepository $quoteRepository * @param array $data + * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( \Magento\Framework\View\Element\Template\Context $context, @@ -59,11 +98,21 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart \Magento\Directory\Block\Data $directoryBlock, \Magento\Shipping\Model\CarrierFactoryInterface $carrierFactory, PriceCurrencyInterface $priceCurrency, + EstimateAddressInterfaceFactory $estimatedAddressFactory, + ShippingMethodManagementInterface $shippingMethodManager, + AddressRepositoryInterface $addressRepository, + CustomerRepositoryInterface $customerRepository, + QuoteRepository $quoteRepository, array $data = [] ) { $this->priceCurrency = $priceCurrency; $this->_directoryBlock = $directoryBlock; $this->_carrierFactory = $carrierFactory; + $this->estimatedAddressFactory = $estimatedAddressFactory; + $this->shippingMethodManager = $shippingMethodManager; + $this->addressRepository = $addressRepository; + $this->customerRepository = $customerRepository; + $this->quoteRepository = $quoteRepository; parent::__construct($context, $customerSession, $checkoutSession, $data); $this->_isScopePrivate = true; } @@ -309,4 +358,39 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart $block->setShippingRate($shippingRate); return $block->toHtml(); } + + /** + * {@inheritDoc} + */ + protected function _beforeToHtml() + { + if ($this->_customerSession->isLoggedIn()) { + $customer = $this->customerRepository->getById($this->_customerSession->getCustomerId()); + if ($defaultShipping = $customer->getDefaultShipping()) { + $address = $this->addressRepository->getById($defaultShipping); + if ($address) { + /** @var \Magento\Quote\Api\Data\EstimateAddressInterface $estimatedAddress */ + $estimatedAddress = $this->estimatedAddressFactory->create(); + $estimatedAddress->setCountryId($address->getCountryId()); + $estimatedAddress->setPostcode($address->getPostcode()); + $estimatedAddress->setRegion((string)$address->getRegion()->getRegion()); + $estimatedAddress->setRegionId($address->getRegionId()); + $this->shippingMethodManager->estimateByAddress($this->getQuote()->getId(), $estimatedAddress); + $this->quoteRepository->save($this->getQuote()); + } + } + } + return parent::_beforeToHtml(); + } + + /** + * Check if multiple countries for shipping is allowed + * + * @return bool + */ + public function isMultipleCountriesAllowed() + { + $collection = $this->_directoryBlock->getCountryCollection(); + return $collection->count() > 1 ? true : false; + } } diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/EditTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/EditTest.php new file mode 100644 index 0000000000000000000000000000000000000000..122e8c85909b95a459b6578567d17922681fa113 --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/EditTest.php @@ -0,0 +1,77 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\Catalog\Model\Product; +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit; +use Magento\Quote\Model\Quote\Item; + +class EditTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Edit + */ + protected $model; + + /** @var \Magento\Framework\UrlInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $urlBuilderMock; + + protected function setUp() + { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->urlBuilderMock = $this->getMockBuilder('Magento\Framework\UrlInterface') + ->disableOriginalConstructor() + ->getMock(); + + $this->model = $objectManagerHelper->getObject( + 'Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit', + [ + 'urlBuilder' => $this->urlBuilderMock, + ] + ); + } + + public function testGetConfigureUrl() + { + $itemId = 45; + $productId = 12; + $configureUrl = 'configure url'; + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + /** + * @var Product|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->getMock(); + + $itemMock->expects($this->once()) + ->method('getProduct') + ->willReturn($productMock); + $itemMock->expects($this->once()) + ->method('getId') + ->willReturn($itemId); + + $productMock->expects($this->once()) + ->method('getId') + ->willReturn($productId); + + $this->urlBuilderMock->expects($this->once()) + ->method('getUrl') + ->with('checkout/cart/configure', ['id' => $itemId, 'product_id' => $productId]) + ->willReturn($configureUrl); + + $this->model->setItem($itemMock); + $this->assertEquals($configureUrl, $this->model->getConfigureUrl()); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/GenericTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/GenericTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d6c6f0824c67b3b50c1fd7aaa88e2c224e3f61c5 --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/GenericTest.php @@ -0,0 +1,87 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\Catalog\Model\Product; +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Quote\Model\Quote\Item; + +class GenericTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Generic + */ + protected $model; + + protected function setUp() + { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->model = $objectManagerHelper->getObject( + 'Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic', + [] + ); + } + + public function testGetItem() + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $this->assertEquals($this->model, $this->model->setItem($itemMock)); + $this->assertEquals($itemMock, $this->model->getItem()); + } + + public function testIsProductVisibleInSiteVisibility() + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + /** + * @var Product|\PHPUnit_Framework_MockObject_MockObject $productMock + */ + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->getMock(); + + $itemMock->expects($this->once()) + ->method('getProduct') + ->willReturn($productMock); + + $productMock->expects($this->once()) + ->method('isVisibleInSiteVisibility') + ->willReturn(true); + + $this->assertEquals($this->model, $this->model->setItem($itemMock)); + $this->assertTrue($this->model->isProductVisibleInSiteVisibility()); + } + + public function testIsVirtual() + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->setMethods(['getIsVirtual']) + ->getMock(); + + $itemMock->expects($this->once()) + ->method('getIsVirtual') + ->willReturn(true); + + $this->assertEquals($this->model, $this->model->setItem($itemMock)); + $this->assertTrue($this->model->isVirtual()); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/RemoveTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/RemoveTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d2ebb0637ea9df67ed0d6846f48694b8b1ac9faf --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/RemoveTest.php @@ -0,0 +1,57 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove; +use Magento\Checkout\Helper\Cart; +use Magento\Quote\Model\Quote\Item; + +class RemoveTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Remove + */ + protected $model; + + /** @var Cart|\PHPUnit_Framework_MockObject_MockObject */ + protected $cartHelperMock; + + protected function setUp() + { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->cartHelperMock = $this->getMockBuilder('Magento\Checkout\Helper\Cart') + ->disableOriginalConstructor() + ->getMock(); + + $this->model = $objectManagerHelper->getObject( + 'Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove', + [ + 'cartHelper' => $this->cartHelperMock, + ] + ); + } + + public function testGetConfigureUrl() + { + $json = '{json;}'; + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $this->cartHelperMock->expects($this->once()) + ->method('getDeletePostJson') + ->with($itemMock) + ->willReturn($json); + + $this->model->setItem($itemMock); + $this->assertEquals($json, $this->model->getDeletePostJson()); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ActionsTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ActionsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..514648f0a8c6037acac41ffcd9b0519449fe376f --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ActionsTest.php @@ -0,0 +1,110 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Test\Unit\Block\Cart\Item\Renderer; + +use Magento\Checkout\Block\Cart\Item\Renderer\Actions; +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Quote\Model\Quote\Item; + +class ActionsTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Actions + */ + protected $model; + + /** + * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $scopeConfigMock; + + /** + * @var \Magento\Framework\View\LayoutInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $layoutMock; + + protected function setUp() + { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->scopeConfigMock = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') + ->getMockForAbstractClass(); + + $this->layoutMock = $this->getMockBuilder('Magento\Framework\View\LayoutInterface') + ->getMockForAbstractClass(); + + $this->model = $objectManagerHelper->getObject( + 'Magento\Checkout\Block\Cart\Item\Renderer\Actions', + [ + 'scopeConfig' => $this->scopeConfigMock, + 'layout' => $this->layoutMock, + ] + ); + } + + public function testGetItem() + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $this->assertEquals($this->model, $this->model->setItem($itemMock)); + $this->assertEquals($itemMock, $this->model->getItem()); + } + + public function testToHtml() + { + $childNameOne = 'child.1'; + $childNameTextOne = 'child.1 text'; + $childNameTwo = 'child.2'; + $childNames = [$childNameOne, $childNameTwo]; + + $this->scopeConfigMock->expects($this->once()) + ->method('getValue') + ->willReturn(false); + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + $this->model->setItem($itemMock); + + $this->layoutMock->expects($this->once()) + ->method('getChildNames') + ->with($this->model->getNameInLayout()) + ->willReturn($childNames); + + /** @var Generic|\PHPUnit_Framework_MockObject_MockObject $childMockOne */ + $childMockOne = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic') + ->disableOriginalConstructor() + ->getMock(); + $childMockOne->expects($this->once()) + ->method('setItem') + ->with($itemMock); + + $childMockTwo = false; + + $this->layoutMock->expects($this->once()) + ->method('renderElement') + ->with($childNameOne, false) + ->willReturn($childNameTextOne); + $this->layoutMock->expects($this->exactly(2)) + ->method('getBlock') + ->willReturnMap( + [ + [$childNameOne, $childMockOne], + [$childNameTwo, $childMockTwo], + ] + ); + + $this->assertEquals($childNameTextOne, $this->model->toHtml()); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/RendererTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/RendererTest.php index 575eebc4188964d8eb8365f41068006d263e5e6f..0796e0f6363fc2448164178f869b27cb7bc2f6c9 100644 --- a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/RendererTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/RendererTest.php @@ -5,7 +5,8 @@ */ namespace Magento\Checkout\Test\Unit\Block\Cart\Item; -use \Magento\Checkout\Block\Cart\Item\Renderer; +use Magento\Checkout\Block\Cart\Item\Renderer; +use Magento\Quote\Model\Quote\Item; class RendererTest extends \PHPUnit_Framework_TestCase { @@ -42,7 +43,7 @@ class RendererTest extends \PHPUnit_Framework_TestCase 'Magento\Checkout\Block\Cart\Item\Renderer', [ 'imageHelper' => $this->_imageHelper, - 'context' => $context + 'context' => $context, ] ); } @@ -89,7 +90,7 @@ class RendererTest extends \PHPUnit_Framework_TestCase ); $product->expects($this->any())->method('getName')->will($this->returnValue('Parent Product')); - /** @var \Magento\Quote\Model\Quote\Item|\PHPUnit_Framework_MockObject_MockObject $item */ + /** @var Item|\PHPUnit_Framework_MockObject_MockObject $item */ $item = $this->getMock('Magento\Quote\Model\Quote\Item', [], [], '', false); $item->expects($this->any())->method('getProduct')->will($this->returnValue($product)); @@ -147,4 +148,59 @@ class RendererTest extends \PHPUnit_Framework_TestCase $this->assertEquals($priceHtml, $this->_renderer->getProductPriceHtml($product)); } + + public function testGetActions() + { + $blockNameInLayout = 'block.name'; + $blockHtml = 'block html'; + + /** + * @var \Magento\Checkout\Block\Cart\Item\Renderer\Actions|\PHPUnit_Framework_MockObject_MockObject $blockMock + */ + $blockMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Actions') + ->disableOriginalConstructor() + ->getMock(); + + $this->layout->expects($this->once()) + ->method('getChildName') + ->with($this->_renderer->getNameInLayout(), 'actions') + ->willReturn($blockNameInLayout); + $this->layout->expects($this->once()) + ->method('getBlock') + ->with($blockNameInLayout) + ->willReturn($blockMock); + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $blockMock->expects($this->once()) + ->method('setItem') + ->with($itemMock); + $blockMock->expects($this->once()) + ->method('toHtml') + ->willReturn($blockHtml); + + $this->assertEquals($blockHtml, $this->_renderer->getActions($itemMock)); + } + + public function testGetActionsWithNoBlock() + { + $this->layout->expects($this->once()) + ->method('getChildName') + ->with($this->_renderer->getNameInLayout(), 'actions') + ->willReturn(false); + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $this->assertEquals('', $this->_renderer->getActions($itemMock)); + } } diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php index fcb3e58c804dc897df014041384246218b4c2703..13fbfbc990be11852eef14ff41ee0bcbcc708484 100644 --- a/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php @@ -5,16 +5,217 @@ */ namespace Magento\Checkout\Test\Unit\Block\Cart; +use Magento\Checkout\Block\Cart\Shipping; +use Magento\Checkout\Model\Session as CheckoutSession; +use Magento\Customer\Api\AddressRepositoryInterface; +use Magento\Customer\Api\CustomerRepositoryInterface; +use Magento\Customer\Api\Data\AddressInterface; +use Magento\Customer\Model\Session as CustomerSession; +use Magento\Directory\Block\Data as DirectoryData; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\Event\ManagerInterface as EventManager; +use Magento\Framework\Pricing\PriceCurrencyInterface; +use Magento\Framework\View\Element\Template\Context; +use Magento\Framework\View\Layout; +use Magento\Quote\Api\Data\EstimateAddressInterface; +use Magento\Quote\Api\Data\EstimateAddressInterfaceFactory; +use Magento\Quote\Api\ShippingMethodManagementInterface; +use Magento\Quote\Model\Quote; +use Magento\Quote\Model\QuoteRepository; +use Magento\Shipping\Model\CarrierFactoryInterface; +use Magento\Store\Model\ScopeInterface; + +/** + * @SuppressWarnings(PHPMD.TooManyFields) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class ShippingTest extends \PHPUnit_Framework_TestCase { - /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ - protected $objectManager; + /** @var Shipping */ + protected $model; + + /** @var Context |\PHPUnit_Framework_MockObject_MockObject */ + protected $context; + + /** @var CustomerSession |\PHPUnit_Framework_MockObject_MockObject */ + protected $customerSession; + + /** @var CheckoutSession |\PHPUnit_Framework_MockObject_MockObject */ + protected $checkoutSession; + + /** @var DirectoryData |\PHPUnit_Framework_MockObject_MockObject */ + protected $directoryData; + + /** @var CarrierFactoryInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $carrierFactory; + + /** @var PriceCurrencyInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $priceCurrency; + + /** @var EstimateAddressInterfaceFactory |\PHPUnit_Framework_MockObject_MockObject */ + protected $estimatedAddressFactory; + + /** @var ShippingMethodManagementInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $shippingMethodManager; + + /** @var AddressRepositoryInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $addressReporitory; + + /** @var CustomerRepositoryInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $customerRepository; + + /** @var QuoteRepository |\PHPUnit_Framework_MockObject_MockObject */ + protected $quoteRepository; - protected $shippingBlock; + /** @var Layout |\PHPUnit_Framework_MockObject_MockObject */ + protected $layout; + + /** @var EventManager |\PHPUnit_Framework_MockObject_MockObject */ + protected $eventManager; + + /** @var ScopeConfigInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $scopeConfig; + + /** @var EstimateAddressInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $estimatedAddress; + + /** @var AddressInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $address; + + /** @var Quote |\PHPUnit_Framework_MockObject_MockObject */ + protected $quote; protected function setUp() { - $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->prepareContext(); + + $this->customerSession = $this->getMockBuilder('Magento\Customer\Model\Session') + ->disableOriginalConstructor() + ->getMock(); + + $this->checkoutSession = $this->getMockBuilder('Magento\Checkout\Model\Session') + ->disableOriginalConstructor() + ->getMock(); + + $this->directoryData = $this->getMockBuilder('Magento\Directory\Block\Data') + ->disableOriginalConstructor() + ->getMock(); + + $this->carrierFactory = $this->getMockBuilder('Magento\Shipping\Model\CarrierFactoryInterface') + ->getMockForAbstractClass(); + + $this->priceCurrency = $this->getMockBuilder('Magento\Framework\Pricing\PriceCurrencyInterface') + ->getMockForAbstractClass(); + + $this->prepareEstimatedAddress(); + + $this->shippingMethodManager = $this->getMockBuilder('Magento\Quote\Api\ShippingMethodManagementInterface') + ->getMockForAbstractClass(); + + $this->prepareAddressRepository(); + + $this->customerRepository = $this->getMockBuilder('Magento\Customer\Api\CustomerRepositoryInterface') + ->getMockForAbstractClass(); + + $this->prepareQuoteRepository(); + + $this->model = new Shipping( + $this->context, + $this->customerSession, + $this->checkoutSession, + $this->directoryData, + $this->carrierFactory, + $this->priceCurrency, + $this->estimatedAddressFactory, + $this->shippingMethodManager, + $this->addressReporitory, + $this->customerRepository, + $this->quoteRepository + ); + } + + protected function prepareContext() + { + $this->layout = $this->getMockBuilder('Magento\Framework\View\Layout') + ->disableOriginalConstructor() + ->getMock(); + + $this->eventManager = $this->getMockBuilder('Magento\Framework\Event\ManagerInterface') + ->setMethods([ + 'dispatch', + ]) + ->getMockForAbstractClass(); + + $this->scopeConfig = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') + ->setMethods([ + 'getValue', + ]) + ->getMockForAbstractClass(); + + $this->context = $this->getMockBuilder('Magento\Framework\View\Element\Template\Context') + ->disableOriginalConstructor() + ->getMock(); + + $this->context->expects($this->once()) + ->method('getLayout') + ->will($this->returnValue($this->layout)); + + $this->context->expects($this->once()) + ->method('getEventManager') + ->will($this->returnValue($this->eventManager)); + + $this->context->expects($this->once()) + ->method('getScopeConfig') + ->will($this->returnValue($this->scopeConfig)); + } + + protected function prepareEstimatedAddress() + { + $this->estimatedAddress = $this->getMockBuilder('Magento\Quote\Api\Data\EstimateAddressInterface') + ->setMethods([ + 'setCountryId', + 'setPostcode', + 'setRegion', + 'setRegionId', + ]) + ->getMockForAbstractClass(); + + $this->estimatedAddressFactory = $this->getMockBuilder('Magento\Quote\Api\Data\EstimateAddressInterfaceFactory') + ->disableOriginalConstructor() + ->setMethods([ + 'create', + ]) + ->getMock(); + + $this->estimatedAddressFactory->expects($this->any()) + ->method('create') + ->willReturn($this->estimatedAddress); + } + + protected function prepareAddressRepository() + { + $this->address = $this->getMockBuilder('Magento\Customer\Api\Data\AddressInterface') + ->setMethods([ + 'getCountryId', + 'getPostcode', + 'getRegion', + 'getRegionId', + ]) + ->getMockForAbstractClass(); + + $this->addressReporitory = $this->getMockBuilder('Magento\Customer\Api\AddressRepositoryInterface') + ->getMockForAbstractClass(); + } + + protected function prepareQuoteRepository() + { + $this->quoteRepository = $this->getMockBuilder('Magento\Quote\Model\QuoteRepository') + ->disableOriginalConstructor() + ->getMock(); + + $this->quote = $this->getMockBuilder('Magento\Quote\Model\Quote') + ->disableOriginalConstructor() + ->getMock(); } public function testGetShippingPriceHtml() @@ -38,30 +239,234 @@ class ShippingTest extends \PHPUnit_Framework_TestCase ->method('toHtml') ->will($this->returnValue($shippingPriceHtml)); - $layoutMock = $this->getMockBuilder('\Magento\Framework\View\Layout') - ->disableOriginalConstructor() - ->getMock(); - - $layoutMock->expects($this->once()) + $this->layout->expects($this->once()) ->method('getBlock') ->with('checkout.shipping.price') ->will($this->returnValue($priceBlockMock)); - $contextMock = $this->getMockBuilder('\Magento\Framework\View\Element\Template\Context') + $this->assertEquals($shippingPriceHtml, $this->model->getShippingPriceHtml($shippingRateMock)); + } + + public function testBeforeToHtmlCustomerNotLoggedIn() + { + $this->eventManager->expects($this->once()) + ->method('dispatch') + ->with('view_block_abstract_to_html_before', ['block' => $this->model]) + ->willReturnSelf(); + + $this->scopeConfig->expects($this->once()) + ->method('getValue') + ->with('advanced/modules_disable_output/Magento_Checkout', ScopeInterface::SCOPE_STORE) + ->willReturn(false); + + $this->customerSession->expects($this->once()) + ->method('isLoggedIn') + ->willReturn(false); + + $this->assertEquals('', $this->model->toHtml()); + } + + public function testBeforeToHtmlNoDefaultShippingAddress() + { + $customerId = 1; + $defaultShipping = 0; + + $this->eventManager->expects($this->once()) + ->method('dispatch') + ->with('view_block_abstract_to_html_before', ['block' => $this->model]) + ->willReturnSelf(); + + $this->scopeConfig->expects($this->once()) + ->method('getValue') + ->with('advanced/modules_disable_output/Magento_Checkout', ScopeInterface::SCOPE_STORE) + ->willReturn(false); + + $this->customerSession->expects($this->once()) + ->method('isLoggedIn') + ->willReturn(true); + $this->customerSession->expects($this->once()) + ->method('getCustomerId') + ->willReturn($customerId); + + $customerData = $this->getMockBuilder('Magento\Customer\Api\Data\CustomerInterface') + ->setMethods([ + 'getDefaultShipping', + ]) + ->getMockForAbstractClass(); + $customerData->expects($this->once()) + ->method('getDefaultShipping') + ->willReturn($defaultShipping); + + $this->customerRepository->expects($this->once()) + ->method('getById') + ->with($customerId) + ->willReturn($customerData); + + $this->assertEquals('', $this->model->toHtml()); + } + + /** + * @param int $customerId + * @param int $defaultShipping + * @param int $countryId + * @param string $postcode + * @param string $region + * @param int $regionId + * @param int $quoteId + * @dataProvider dataProviderBeforeToHtml + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function testBeforeToHtml( + $customerId, + $defaultShipping, + $countryId, + $postcode, + $region, + $regionId, + $quoteId + ) { + $this->eventManager->expects($this->once()) + ->method('dispatch') + ->with('view_block_abstract_to_html_before', ['block' => $this->model]) + ->willReturnSelf(); + + $this->scopeConfig->expects($this->once()) + ->method('getValue') + ->with('advanced/modules_disable_output/Magento_Checkout', ScopeInterface::SCOPE_STORE) + ->willReturn(false); + + $this->customerSession->expects($this->once()) + ->method('isLoggedIn') + ->willReturn(true); + $this->customerSession->expects($this->once()) + ->method('getCustomerId') + ->willReturn($customerId); + + $customerDataMock = $this->getMockBuilder('Magento\Customer\Api\Data\CustomerInterface') + ->setMethods([ + 'getDefaultShipping', + ]) + ->getMockForAbstractClass(); + $customerDataMock->expects($this->once()) + ->method('getDefaultShipping') + ->willReturn($defaultShipping); + + $this->customerRepository->expects($this->once()) + ->method('getById') + ->with($customerId) + ->willReturn($customerDataMock); + + $this->addressReporitory->expects($this->once()) + ->method('getById') + ->with($defaultShipping) + ->willReturn($this->address); + + $regionMock = $this->getMockBuilder('Magento\Customer\Api\Data\RegionInterface') + ->setMethods([ + 'getRegion', + ]) + ->getMockForAbstractClass(); + $regionMock->expects($this->once()) + ->method('getRegion') + ->willReturn($region); + + $this->address->expects($this->once()) + ->method('getCountryId') + ->willReturn($countryId); + $this->address->expects($this->once()) + ->method('getPostcode') + ->willReturn($postcode); + $this->address->expects($this->once()) + ->method('getRegion') + ->willReturn($regionMock); + $this->address->expects($this->once()) + ->method('getRegionId') + ->willReturn($regionId); + + $this->estimatedAddress->expects($this->once()) + ->method('setCountryId') + ->with($countryId) + ->willReturnSelf(); + $this->estimatedAddress->expects($this->once()) + ->method('setPostcode') + ->with($postcode) + ->willReturnSelf(); + $this->estimatedAddress->expects($this->once()) + ->method('setRegion') + ->with($region) + ->willReturnSelf(); + $this->estimatedAddress->expects($this->once()) + ->method('setRegionId') + ->with($regionId) + ->willReturnSelf(); + + $this->checkoutSession->expects($this->once()) + ->method('getQuote') + ->willReturn($this->quote); + + $this->quote->expects($this->once()) + ->method('getId') + ->willReturn($quoteId); + + $this->shippingMethodManager->expects($this->once()) + ->method('estimateByAddress') + ->with($quoteId, $this->estimatedAddress) + ->willReturnSelf(); + + $this->quoteRepository->expects($this->once()) + ->method('save') + ->with($this->quote) + ->willReturnSelf(); + + $this->assertEquals('', $this->model->toHtml()); + } + + /** + * @return array + */ + public function dataProviderBeforeToHtml() + { + return [ + [1, 1, 1, '12345', '', 1, 1], + [1, 1, 1, '12345', '', 0, 1], + [1, 1, 1, '', '', 0, 1], + [1, 1, 1, '12345', 'California', 0, 1], + [1, 1, 1, '12345', 'California', 1, 1], + ]; + } + + /** + * @param int $count + * @param bool $expectedResult + * @dataProvider dataProviderIsMultipleCountriesAllowed + */ + public function testIsMultipleCountriesAllowed( + $count, + $expectedResult + ) { + $collection = $this->getMockBuilder('Magento\Directory\Model\Resource\Country\Collection') ->disableOriginalConstructor() - ->setMethods(['getLayout']) ->getMock(); + $collection->expects($this->once()) + ->method('count') + ->willReturn($count); - $contextMock->expects($this->once()) - ->method('getLayout') - ->will($this->returnValue($layoutMock)); + $this->directoryData->expects($this->once()) + ->method('getCountryCollection') + ->willReturn($collection); - /** @var \Magento\Checkout\Block\Cart\Shipping $shippingBlock */ - $shippingBlock = $this->objectManager->getObject( - 'Magento\Checkout\Block\Cart\Shipping', - ['context' => $contextMock] - ); + $this->assertEquals($expectedResult, $this->model->isMultipleCountriesAllowed()); + } - $this->assertEquals($shippingPriceHtml, $shippingBlock->getShippingPriceHtml($shippingRateMock)); + /** + * @return array + */ + public function dataProviderIsMultipleCountriesAllowed() + { + return [ + [0, false], + [1, false], + [2, true], + ]; } } diff --git a/app/code/Magento/Checkout/composer.json b/app/code/Magento/Checkout/composer.json index db8918bca762e2ed96a00a597bc0291a0138e96e..572909061f99a33ba2f588192618604966ddcdf2 100644 --- a/app/code/Magento/Checkout/composer.json +++ b/app/code/Magento/Checkout/composer.json @@ -3,32 +3,31 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-gift-message": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-msrp": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-gift-message": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-msrp": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-cookie": "0.74.0-beta13" + "magento/module-cookie": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_index.xml b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_index.xml index d0aeb1702d330c44a65833c0bfef597b5e09c6b0..93554677907714333edd3b3251c3f1a418473628 100644 --- a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_index.xml +++ b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_index.xml @@ -18,6 +18,7 @@ <container name="checkout.cart.form.before" as="form_before" label="Shopping Cart Items Before" htmlTag="div" htmlClass="rewards" before="checkout.cart.form"/> <block class="Magento\Checkout\Block\Cart" name="checkout.cart.form" as="cart-items" template="cart/form.phtml"> <block class="Magento\Framework\View\Element\RendererList" name="checkout.cart.item.renderers" as="renderer.list"/> + <block class="Magento\Framework\View\Element\Text\ListText" name="checkout.cart.order.actions"/> </block> <container name="checkout.cart.widget" as="checkout_cart_widget" label="Shopping Cart Items After"/> <block class="Magento\Checkout\Block\Cart\Shipping" name="checkout.cart.shipping" as="shipping" template="cart/shipping.phtml"/> diff --git a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml index d5462c158bd29ec8124188211368c28bd268c0bf..572820909c24eaf337b6cb1131f1f59199c83972 100644 --- a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml @@ -9,8 +9,18 @@ <update handle="checkout_item_price_renderers"/> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/item/default.phtml"/> - <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/item/default.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.default.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.default.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.default.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> + <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.simple.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.simple.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.simple.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml index a78b7d152131dd4a66c17f4d2e66afbcdfc60019..a5f8db141716f4da993703cfb5ba37f30fa96a02 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml @@ -60,4 +60,6 @@ <input type="hidden" value="" id="update_cart_action_container" /> </div> </form> +<?php echo $block->getChildHtml('checkout.cart.order.actions') ?> <?php echo $block->getChildHtml('shopping.cart.table.after'); ?> + diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/item/default.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/item/default.phtml index a189143ba870fd923daab34f7dad81d062ed393d..e0aa120c9c63ef5b620a66cafa01abbce89a7b68 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/item/default.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/item/default.phtml @@ -118,35 +118,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <tr class="item-actions"> <td colspan="<?php echo $cols;?>"> <div class="actions-toolbar"> - - <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllowInCart()) : ?> - <?php if ($isVisibleProduct): ?> - <a href="#" - data-post='<?php echo $this->helper('Magento\Wishlist\Helper\Data')->getMoveFromCartParams($_item->getId()); ?>' - class="use-ajax action towishlist"> - <span><?php echo __('Move to Wish List'); ?></span> - </a> - <?php endif ?> - <?php endif ?> - - <?php if ($isVisibleProduct): ?> - <a class="action edit" - href="<?php echo $block->getConfigureUrl() ?>" - title="<?php echo $block->escapeHtml(__('Edit item parameters')); ?>"> - <span> - <?php echo __('Edit') ?> - </span> - </a> - <?php endif ?> - - <a href="#" - title="<?php echo $block->escapeHtml(__('Remove item')); ?>" - class="action delete" - data-post='<?php echo $this->helper('Magento\Checkout\Helper\Cart')->getDeletePostJson($_item); ?>'> - <span> - <?php echo __('Remove item')?> - </span> - </a> + <?php echo $block->getActions($_item) ?> </div> </td> </tr> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/edit.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/edit.phtml new file mode 100644 index 0000000000000000000000000000000000000000..4123e6419a32c1f5b6d0eeb04f3013cc0a63ec39 --- /dev/null +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/edit.phtml @@ -0,0 +1,19 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +/** @var $block \Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit */ +?> +<?php if ($block->isProductVisibleInSiteVisibility()): ?> + <a class="action action-edit" + href="<?php echo $block->getConfigureUrl() ?>" + title="<?php echo $block->escapeHtml(__('Edit item parameters')); ?>"> + <span> + <?php echo __('Edit') ?> + </span> + </a> +<?php endif ?> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/remove.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/remove.phtml new file mode 100644 index 0000000000000000000000000000000000000000..bed34897aec6c0f44918036fc3e4624e1dc06626 --- /dev/null +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/remove.phtml @@ -0,0 +1,18 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +/** @var $block \Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove */ +?> +<a href="#" + title="<?php echo $block->escapeHtml(__('Remove item')); ?>" + class="action action-delete" + data-post='<?php echo $block->getDeletePostJson(); ?>'> + <span> + <?php echo __('Remove item')?> + </span> +</a> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml index 71964e6df4437cc9af2c52ed354e1b5fb2a183a8..c38df0934ee5923819d4903d39531d1ad2ab7565 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml @@ -71,7 +71,8 @@ "form": "#shipping-zip-form", "regionJson": <?php echo $this->helper('Magento\Directory\Helper\Data')->getRegionJson() ?>, "defaultRegion": "<?php echo $block->getEstimateRegionId() ?>", - "countriesWithOptionalZip": <?php echo $this->helper('Magento\Directory\Helper\Data')->getCountriesWithOptionalZip(true) ?> + "countriesWithOptionalZip": <?php echo $this->helper('Magento\Directory\Helper\Data')->getCountriesWithOptionalZip(true) ?>, + "isMultipleCountriesAllowed": <?php echo $block->isMultipleCountriesAllowed() ? 'true' : 'false'; ?> } } } diff --git a/app/code/Magento/Checkout/view/frontend/web/js/region-updater.js b/app/code/Magento/Checkout/view/frontend/web/js/region-updater.js index d48975806a79664906a1ff1ab6954f37ba23f536..d6cef062b1d507b82fcc00b5ee99fbc128d533a5 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/region-updater.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/region-updater.js @@ -21,24 +21,18 @@ define([ isRegionRequired: true, isZipRequired: true, isCountryRequired: true, - currentRegion: null + currentRegion: null, + isMultipleCountriesAllowed: true }, _create: function () { - this.currentRegionOption = this.options.currentRegion; + this._initCountryElement(); + this.currentRegionOption = this.options.currentRegion; this.regionTmpl = mageTemplate(this.options.regionTemplate); this._updateRegion(this.element.find('option:selected').val()); - this.element.on('change', $.proxy(function (e) { - this._updateRegion($(e.target).val()); - }, this)); - - if (this.isCountryRequired) { - this.element.addClass('required-entry'); - } - $(this.options.regionListId).on('change', $.proxy(function (e) { this.setOption = false; this.currentRegionOption = $(e.target).val(); @@ -49,6 +43,21 @@ define([ }, this)); }, + _initCountryElement: function() { + if (this.options.isMultipleCountriesAllowed) { + this.element.parents('div.field').show(); + this.element.on('change', $.proxy(function (e) { + this._updateRegion($(e.target).val()); + }, this)); + if (this.options.isCountryRequired) { + this.element.addClass('required-entry'); + this.element.parents('div.field').addClass('required'); + } + } else { + this.element.parents('div.field').hide(); + } + }, + /** * Remove options from dropdown list * @param {Object} selectElement - jQuery object for dropdown list diff --git a/app/code/Magento/CheckoutAgreements/composer.json b/app/code/Magento/CheckoutAgreements/composer.json index bea7e49ea19fc077686d3e7ba0e73bec7beb2978..28936c416e31dc474a95b0687d98edef469ba886 100644 --- a/app/code/Magento/CheckoutAgreements/composer.json +++ b/app/code/Magento/CheckoutAgreements/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Cms/composer.json b/app/code/Magento/Cms/composer.json index 73cbc55bc1d1818796bc345b579f2eb594d2d192..74159635377d7d0ac47f23cd8474b47b4415610b 100644 --- a/app/code/Magento/Cms/composer.json +++ b/app/code/Magento/Cms/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-email": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/module-variable": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-email": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/module-variable": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CmsUrlRewrite/composer.json b/app/code/Magento/CmsUrlRewrite/composer.json index f469ccf9a8a16e50c34bcc66cac4a59c1dc7df58..c5d23577dd32064af54e69ea0c18bf918232f32a 100644 --- a/app/code/Magento/CmsUrlRewrite/composer.json +++ b/app/code/Magento/CmsUrlRewrite/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-url-rewrite": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-url-rewrite": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Config/composer.json b/app/code/Magento/Config/composer.json index 99e065fbf08f55ac4666e3c27b6944de65d9f4e0..cc83e07515d7c6e3f56c531d84d10edcceb1226e 100644 --- a/app/code/Magento/Config/composer.json +++ b/app/code/Magento/Config/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-cron": "0.74.0-beta13", - "magento/module-email": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-cron": "0.74.0-beta14", + "magento/module-email": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/ConfigurableImportExport/composer.json b/app/code/Magento/ConfigurableImportExport/composer.json index 54fb284e622096d698a49ea4154a0ad47fe4f037..8d04a7bae07ab90d74604415193102a43f299075 100644 --- a/app/code/Magento/ConfigurableImportExport/composer.json +++ b/app/code/Magento/ConfigurableImportExport/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-import-export": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-configurable-product": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-import-export": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-configurable-product": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php index 086efbbf9f8ff8a995a15eeb283026924322288d..2dc2f6d2c88f2ee28b27916108ea451727845ad6 100644 --- a/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php +++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php @@ -17,7 +17,7 @@ class Configurable extends \Magento\Catalog\Model\Resource\Product\Indexer\Price */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); @@ -63,10 +63,7 @@ class Configurable extends \Magento\Catalog\Model\Resource\Product\Indexer\Price */ protected function _getConfigurableOptionAggregateTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_cfg_opt_agr_idx'); - } - return $this->getTable('catalog_product_index_price_cfg_opt_agr_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_cfg_opt_agr'); } /** @@ -76,10 +73,7 @@ class Configurable extends \Magento\Catalog\Model\Resource\Product\Indexer\Price */ protected function _getConfigurableOptionPriceTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_cfg_opt_idx'); - } - return $this->getTable('catalog_product_index_price_cfg_opt_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_cfg_opt'); } /** diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Block/Cart/Item/Renderer/ConfigurableTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Block/Cart/Item/Renderer/ConfigurableTest.php index 8594a0fb07f30e864b0d9744eb15f260930f0cf0..23f9b9b8ff1439e46352cf30a3567302222b33fc 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Unit/Block/Cart/Item/Renderer/ConfigurableTest.php +++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Block/Cart/Item/Renderer/ConfigurableTest.php @@ -233,7 +233,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase public function testGetOptionList() { - $itemMock = $this->getMock('Magento\Quote\Model\Quote\Item\AbstractItem', [], [], '', false); + $itemMock = $this->getMock('Magento\Quote\Model\Quote\Item', [], [], '', false); $this->_renderer->setItem($itemMock); $this->productConfigMock->expects($this->once())->method('getOptions')->with($itemMock); $this->_renderer->getOptionList(); diff --git a/app/code/Magento/ConfigurableProduct/composer.json b/app/code/Magento/ConfigurableProduct/composer.json index a59d294e11653be15c3407afdddc78db584f82eb..d67c88a3d956bb5c369acb68c95818f9d10047c2 100644 --- a/app/code/Magento/ConfigurableProduct/composer.json +++ b/app/code/Magento/ConfigurableProduct/composer.json @@ -3,27 +3,27 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-msrp": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-catalog-rule": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-msrp": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-catalog-rule": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-webapi": "0.74.0-beta13" + "magento/module-webapi": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-js-template.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-js-template.phtml index 2865b30b7710771e8fa63e2542f8f08e08c5c68e..a997ad893456cef5e3ff769f50a3881cdcb8fa12 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-js-template.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-js-template.phtml @@ -149,14 +149,14 @@ <div class="fields-group-2"> <div class="field field-pricing-value"> <div class="control"> - <input type="text" class="pricing-value validate-number" + <input type="text" class="pricing-value validate-number" <?php if(!$block->getCanEditPrice()): ?> 'disabled="disabled"' <?php endif; ?> name="product[configurable_attributes_data][<%- data.attribute.id %>][values][<%- data.option.id %>][pricing_value]" /> </div> </div> <div class="field field-pricing-measure"> <div class="actions dropdown actions-select"> <input type="hidden" value="0" name="product[configurable_attributes_data][<%- data.attribute.id %>][values][<%- data.option.id %>][is_percent]"/> - <button type="button" class="action toggle" data-toggle="dropdown" data-mage-init='{"dropdown":{}}'> + <button type="button" class="action toggle" data-toggle="dropdown" data-mage-init='{"dropdown":{}}' <?php if(!$block->getCanEditPrice()): ?> 'disabled="disabled"' <?php endif; ?>> <span><?php echo $block->getBaseCurrency()->getSymbol() ?></span> </button> <ul class="dropdown" data-role="dropdown-menu" data-mage-init='{"menu":{}}'> diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-template.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-template.phtml index 9a50b287313e96ffbf5d4335e1fb8c9563ee5f8e..dd8a327146c9e87e81db2815df1a84ec4d9afcf2 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-template.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-template.phtml @@ -118,7 +118,7 @@ $id = $block->escapeHtml($attribute['attribute_id']); <div class="fields-group-2"> <div class="field field-pricing-value"> <div class="control"> - <input type="text" class="pricing-value validate-number" + <input type="text" <?php if (!$block->getCanEditPrice()): ?> disabled="disabled";<?php endif; ?> class="pricing-value validate-number" name="<?php echo $namePrefix ?>[<?php echo $valueIndex ?>][pricing_value]" value="<?php echo $block->escapeHtml($pricingValue); ?>"> @@ -128,7 +128,7 @@ $id = $block->escapeHtml($attribute['attribute_id']); <div class="actions dropdown actions-select"> <input name="<?php echo $namePrefix ?>[<?php echo $valueIndex ?>][is_percent]" type="hidden" value="<?php echo $isPercent ? 1 : 0; ?>"/> - <button type="button" class="action toggle" data-toggle="dropdown" data-mage-init='{"dropdown":{}}'> + <button type="button" class="action toggle" <?php if (!$block->getCanEditPrice()): ?> disabled="disabled" <?php endif; ?> data-toggle="dropdown" data-mage-init='{"dropdown":{}}'> <span><?php echo $isPercent ? __('%') : $block->getBaseCurrency()->getSymbol() ?></span> </button> <ul class="dropdown" data-role="dropdown-menu" data-mage-init='{"menu":{}}'> diff --git a/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml index ed335b6babce89860d2af06041a59957ce9dcea5..8b303c7a667fcec5c25753db40715ed3e168e8b4 100644 --- a/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml @@ -8,7 +8,12 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable" as="configurable" template="Magento_Checkout::cart/item/default.phtml"/> + <block class="Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable" as="configurable" template="Magento_Checkout::cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.configurable.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.configurable.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.configurable.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php b/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php index bb59c0e78c7425e6c3e38d1428574a7b738758c2..ccaec64fabb98588414aac86ae67c5e8b14bd956 100644 --- a/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php +++ b/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php @@ -1,32 +1,37 @@ <?php /** - * * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Contact\Test\Unit\Controller\Index; class IndexTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Contact\Controller\Index\Index|\PHPUnit_Framework_MockObject_MockObject + * Controller + * + * @var \Magento\Contact\Controller\Index\Index */ protected $_controller; /** + * Scope config mock + * * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $_scopeConfig; /** + * View mock + * * @var \Magento\Framework\App\ViewInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $_view; /** + * Url mock + * * @var \Magento\Framework\UrlInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $_url; @@ -34,7 +39,10 @@ class IndexTest extends \PHPUnit_Framework_TestCase public function setUp() { $this->_scopeConfig = $this->getMockForAbstractClass( - '\Magento\Framework\App\Config\ScopeConfigInterface', ['isSetFlag'], '', false + '\Magento\Framework\App\Config\ScopeConfigInterface', + ['isSetFlag'], + '', + false ); $context = $this->getMock( '\Magento\Framework\App\Action\Context', diff --git a/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php b/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php index 9db82a0300c8dfcc1fb590aa2f7bf329596dd736..609eaddcc4b579de6c613e1855fda232937ea2d2 100644 --- a/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php +++ b/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php @@ -4,18 +4,20 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Contact\Test\Unit\Controller; class IndexTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Contact\Controller\Index|\PHPUnit_Framework_MockObject_MockObject + * Controller instance + * + * @var \Magento\Contact\Controller\Index */ protected $_controller; /** + * Scope config instance + * * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $_scopeConfig; @@ -23,7 +25,10 @@ class IndexTest extends \PHPUnit_Framework_TestCase public function setUp() { $this->_scopeConfig = $this->getMockForAbstractClass( - '\Magento\Framework\App\Config\ScopeConfigInterface', ['isSetFlag'], '', false + '\Magento\Framework\App\Config\ScopeConfigInterface', + ['isSetFlag'], + '', + false ); $context = $this->getMock( '\Magento\Framework\App\Action\Context', @@ -33,23 +38,21 @@ class IndexTest extends \PHPUnit_Framework_TestCase false ); - $context->expects( - $this->any() - )->method( - 'getRequest' - )->will( - $this->returnValue($this->getMockForAbstractClass('\Magento\Framework\App\RequestInterface', [], '', false)) - ); + $context->expects($this->any()) + ->method('getRequest') + ->will( + $this->returnValue( + $this->getMockForAbstractClass('\Magento\Framework\App\RequestInterface', [], '', false) + ) + ); - $context->expects( - $this->any() - )->method( - 'getResponse' - )->will( - $this->returnValue( - $this->getMockForAbstractClass('\Magento\Framework\App\ResponseInterface', [], '', false) - ) - ); + $context->expects($this->any()) + ->method('getResponse') + ->will( + $this->returnValue( + $this->getMockForAbstractClass('\Magento\Framework\App\ResponseInterface', [], '', false) + ) + ); $this->_controller = new \Magento\Contact\Controller\Index( $context, @@ -61,20 +64,20 @@ class IndexTest extends \PHPUnit_Framework_TestCase } /** + * Dispatch test + * * @expectedException \Magento\Framework\Exception\NotFoundException */ public function testDispatch() { - $this->_scopeConfig->expects( - $this->once() - )->method( - 'isSetFlag' - )->with( - \Magento\Contact\Controller\Index::XML_PATH_ENABLED, - \Magento\Store\Model\ScopeInterface::SCOPE_STORE - )->will( - $this->returnValue(false) - ); + $this->_scopeConfig->expects($this->once()) + ->method('isSetFlag') + ->with( + \Magento\Contact\Controller\Index::XML_PATH_ENABLED, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ->will($this->returnValue(false)); + $this->_controller->dispatch( $this->getMockForAbstractClass('\Magento\Framework\App\RequestInterface', [], '', false) ); diff --git a/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php b/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php index cffd617f422b4327608f4a626a17a5772dc94a12..057cc4672acf0dcf72ce5b5df73a778e8bbd5f57 100644 --- a/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php +++ b/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php @@ -4,28 +4,34 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Contact\Test\Unit\Helper; class DataTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Contact\Helper\Data|\PHPUnit_Framework_MockObject_MockObject + * Helper + * + * @var \Magento\Contact\Helper\Data */ protected $_helper; /** + * Scope config mock + * * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $_scopeConfig; /** + * Customer session mock + * * @var \Magento\Customer\Model\Session|\PHPUnit_Framework_MockObject_MockObject */ protected $_customerSession; /** + * Customer view helper mock + * * @var \Magento\Customer\Helper\View|\PHPUnit_Framework_MockObject_MockObject */ protected $_customerViewHelper; @@ -35,7 +41,9 @@ class DataTest extends \PHPUnit_Framework_TestCase $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $className = '\Magento\Contact\Helper\Data'; $arguments = $objectManagerHelper->getConstructArguments($className); - /** @var \Magento\Framework\App\Helper\Context $context */ + /** + * @var \Magento\Framework\App\Helper\Context $context + */ $context = $arguments['context']; $this->_scopeConfig = $context->getScopeConfig(); $this->_customerSession = $arguments['customerSession']; @@ -58,7 +66,7 @@ class DataTest extends \PHPUnit_Framework_TestCase ->method('getValue') ->will($this->returnValue(null)); - $this->assertTrue(is_null($this->_helper->isEnabled())); + $this->assertTrue(null === $this->_helper->isEnabled()); } public function testGetUserNameNotLoggedIn() @@ -104,8 +112,12 @@ class DataTest extends \PHPUnit_Framework_TestCase $this->_customerSession->expects($this->once()) ->method('isLoggedIn') ->will($this->returnValue(true)); + $customerDataObject = $this->getMock('\Magento\Customer\Api\Data\CustomerInterface', [], [], '', false); - $customerDataObject->expects($this->once())->method('getEmail')->will($this->returnValue('customer@email.com')); + $customerDataObject->expects($this->once()) + ->method('getEmail') + ->will($this->returnValue('customer@email.com')); + $this->_customerSession->expects($this->once()) ->method('getCustomerDataObject') ->will($this->returnValue($customerDataObject)); diff --git a/app/code/Magento/Contact/composer.json b/app/code/Magento/Contact/composer.json index 855dc95f1b15efa4b57d63915006bfb38028b121..b439ea140c197b1ed56baf1e2d815da1401ad79b 100644 --- a/app/code/Magento/Contact/composer.json +++ b/app/code/Magento/Contact/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Cookie/composer.json b/app/code/Magento/Cookie/composer.json index f407a5b8678efc0b356538691028f981353d3ba4..544fd07a9c3789660daca22b02bfc19ba3f3aef5 100644 --- a/app/code/Magento/Cookie/composer.json +++ b/app/code/Magento/Cookie/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.4.11|~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-backend": "0.74.0-beta13" + "magento/module-backend": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Cron/composer.json b/app/code/Magento/Cron/composer.json index 2b1ebf6e958d6c4629e5205532dfc0b182d8d6a6..6399fb6b9e9020bfbbdcd39b429d38acd51db867 100644 --- a/app/code/Magento/Cron/composer.json +++ b/app/code/Magento/Cron/composer.json @@ -3,13 +3,13 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CurrencySymbol/composer.json b/app/code/Magento/CurrencySymbol/composer.json index 87a1ae6197aed04f3647858aaf8ae5c6c3b727f7..84def1d3cbe14acfc288d09d027e68ac7ef0514f 100644 --- a/app/code/Magento/CurrencySymbol/composer.json +++ b/app/code/Magento/CurrencySymbol/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Customer/composer.json b/app/code/Magento/Customer/composer.json index 69fc3efec3823f3e47c02b91eb7c6dc6d3a9a20e..0eece788e93cecb4c80b798123ea44284882baca 100644 --- a/app/code/Magento/Customer/composer.json +++ b/app/code/Magento/Customer/composer.json @@ -3,33 +3,33 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-newsletter": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-review": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", - "magento/module-integration": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-newsletter": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-wishlist": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-review": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", + "magento/module-integration": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-cookie": "0.74.0-beta13" + "magento/module-cookie": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CustomerImportExport/composer.json b/app/code/Magento/CustomerImportExport/composer.json index 0fca4e85cc1316d04098a0685fdc613ab7af42c1..b6a1e407f40a90d40681457f8b3c44f71a51810b 100644 --- a/app/code/Magento/CustomerImportExport/composer.json +++ b/app/code/Magento/CustomerImportExport/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/DesignEditor/composer.json b/app/code/Magento/DesignEditor/composer.json index c74e983baf4c68378fe6735571211cdf05e11cb0..b1da5a0bdcd348ed89d44f6c55133d29d268e728 100644 --- a/app/code/Magento/DesignEditor/composer.json +++ b/app/code/Magento/DesignEditor/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-translation": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-translation": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Developer/composer.json b/app/code/Magento/Developer/composer.json index 159132b761c1f3ac35336599634434a2cf489651..a48bb0105867b156433a4addf530adbefcf87e48 100644 --- a/app/code/Magento/Developer/composer.json +++ b/app/code/Magento/Developer/composer.json @@ -3,12 +3,12 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Dhl/composer.json b/app/code/Magento/Dhl/composer.json index 844caf08a5f13cf23065ae0ed66adcc52014cb3b..02b7d41aa6e9cb7951f25396c7d440274d5b0d56 100644 --- a/app/code/Magento/Dhl/composer.json +++ b/app/code/Magento/Dhl/composer.json @@ -3,22 +3,22 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Directory/Block/Data.php b/app/code/Magento/Directory/Block/Data.php index 9df3c512994106d3827b39bf404a63a8ba9512f8..08242cb6e25dc0fb494970fef8839820e4b26dec 100644 --- a/app/code/Magento/Directory/Block/Data.php +++ b/app/code/Magento/Directory/Block/Data.php @@ -3,10 +3,6 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - -/** - * Directory data block - */ namespace Magento\Directory\Block; class Data extends \Magento\Framework\View\Element\Template @@ -84,6 +80,20 @@ class Data extends \Magento\Framework\View\Element\Template return $collection; } + /** + * Retrieve list of top destinations countries + * + * @return array + */ + protected function getTopDestinations() + { + $destinations = (string)$this->_scopeConfig->getValue( + 'general/country/destinations', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ); + return !empty($destinations) ? explode(',', $destinations) : []; + } + /** * @param null|string $defValue * @param string $name @@ -102,7 +112,9 @@ class Data extends \Magento\Framework\View\Element\Template if ($cache) { $options = unserialize($cache); } else { - $options = $this->getCountryCollection()->toOptionArray(); + $options = $this->getCountryCollection() + ->setForegroundCountries($this->getTopDestinations()) + ->toOptionArray(); $this->_configCacheType->save(serialize($options), $cacheKey); } $html = $this->getLayout()->createBlock( diff --git a/app/code/Magento/Directory/Test/Unit/Block/DataTest.php b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9d5fb0635bd667381ab5cd3f2cba90bc16736cae --- /dev/null +++ b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php @@ -0,0 +1,329 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Directory\Test\Unit\Block; + +use Magento\Directory\Block\Data; +use Magento\Directory\Helper\Data as HelperData; +use Magento\Directory\Model\Resource\Country\Collection as CountryCollection; +use Magento\Directory\Model\Resource\Country\CollectionFactory as CountryCollectionFactory; +use Magento\Directory\Model\Resource\Region\CollectionFactory as RegionCollectionFactory; +use Magento\Framework\App\Cache\Type\Config; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\Json\EncoderInterface; +use Magento\Framework\View\Element\Template\Context; +use Magento\Framework\View\LayoutInterface; +use Magento\Store\Model\ScopeInterface; +use Magento\Store\Model\Store; +use Magento\Store\Model\StoreManagerInterface; + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class DataTest extends \PHPUnit_Framework_TestCase +{ + /** @var Data */ + protected $model; + + /** @var Context |\PHPUnit_Framework_MockObject_MockObject */ + protected $context; + + /** @var HelperData |\PHPUnit_Framework_MockObject_MockObject */ + protected $helperData; + + /** @var EncoderInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $jsonEncoder; + + /** @var Config |\PHPUnit_Framework_MockObject_MockObject */ + protected $cacheTypeConfig; + + /** @var RegionCollectionFactory |\PHPUnit_Framework_MockObject_MockObject */ + protected $regionCollectionFactory; + + /** @var CountryCollectionFactory |\PHPUnit_Framework_MockObject_MockObject */ + protected $countryCollectionFactory; + + /** @var ScopeConfigInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $scopeConfig; + + /** @var StoreManagerInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $storeManager; + + /** @var Store |\PHPUnit_Framework_MockObject_MockObject */ + protected $store; + + /** @var CountryCollection |\PHPUnit_Framework_MockObject_MockObject */ + protected $countryCollection; + + /** @var LayoutInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $layout; + + protected function setUp() + { + $this->prepareContext(); + + $this->helperData = $this->getMockBuilder('Magento\Directory\Helper\Data') + ->disableOriginalConstructor() + ->getMock(); + + $this->jsonEncoder = $this->getMockBuilder('Magento\Framework\Json\EncoderInterface') + ->getMockForAbstractClass(); + + $this->cacheTypeConfig = $this->getMockBuilder('Magento\Framework\App\Cache\Type\Config') + ->disableOriginalConstructor() + ->getMock(); + + $this->regionCollectionFactory = $this->getMockBuilder( + 'Magento\Directory\Model\Resource\Region\CollectionFactory' + ) + ->disableOriginalConstructor() + ->getMock(); + + $this->prepareCountryCollection(); + + $this->model = new Data( + $this->context, + $this->helperData, + $this->jsonEncoder, + $this->cacheTypeConfig, + $this->regionCollectionFactory, + $this->countryCollectionFactory + ); + } + + protected function prepareContext() + { + $this->store = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + + $this->scopeConfig = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') + ->getMockForAbstractClass(); + + $this->storeManager = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') + ->getMockForAbstractClass(); + + $this->storeManager->expects($this->any()) + ->method('getStore') + ->willReturn($this->store); + + $this->layout = $this->getMockBuilder('Magento\Framework\View\LayoutInterface') + ->getMockForAbstractClass(); + + $this->context = $this->getMockBuilder('Magento\Framework\View\Element\Template\Context') + ->disableOriginalConstructor() + ->getMock(); + + $this->context->expects($this->any()) + ->method('getScopeConfig') + ->willReturn($this->scopeConfig); + + $this->context->expects($this->any()) + ->method('getStoreManager') + ->willReturn($this->storeManager); + + $this->context->expects($this->any()) + ->method('getLayout') + ->willReturn($this->layout); + } + + protected function prepareCountryCollection() + { + $this->countryCollection = $this->getMockBuilder('Magento\Directory\Model\Resource\Country\Collection') + ->disableOriginalConstructor() + ->getMock(); + + $this->countryCollectionFactory = $this->getMockBuilder( + 'Magento\Directory\Model\Resource\Country\CollectionFactory' + ) + ->disableOriginalConstructor() + ->setMethods([ + 'create' + ]) + ->getMock(); + + $this->countryCollectionFactory->expects($this->any()) + ->method('create') + ->willReturn($this->countryCollection); + } + + /** + * @param string $storeCode + * @param int $defaultCountry + * @param string $destinations + * @param array $expectedDestinations + * @param array $options + * @param string $resultHtml + * @dataProvider dataProviderGetCountryHtmlSelect + */ + public function testGetCountryHtmlSelect( + $storeCode, + $defaultCountry, + $destinations, + $expectedDestinations, + $options, + $resultHtml + ) { + $this->helperData->expects($this->once()) + ->method('getDefaultCountry') + ->willReturn($defaultCountry); + + $this->store->expects($this->once()) + ->method('getCode') + ->willReturn($storeCode); + + $this->cacheTypeConfig->expects($this->once()) + ->method('load') + ->with('DIRECTORY_COUNTRY_SELECT_STORE_' . $storeCode) + ->willReturn(false); + $this->cacheTypeConfig->expects($this->once()) + ->method('save') + ->with(serialize($options), 'DIRECTORY_COUNTRY_SELECT_STORE_' . $storeCode) + ->willReturnSelf(); + + $this->scopeConfig->expects($this->once()) + ->method('getValue') + ->with('general/country/destinations', ScopeInterface::SCOPE_STORE) + ->willReturn($destinations); + + $this->countryCollection->expects($this->once()) + ->method('loadByStore') + ->willReturnSelf(); + $this->countryCollection->expects($this->any()) + ->method('setForegroundCountries') + ->with($expectedDestinations) + ->willReturnSelf(); + $this->countryCollection->expects($this->once()) + ->method('toOptionArray') + ->willReturn($options); + + $elementHtmlSelect = $this->mockElementHtmlSelect($defaultCountry, $options, $resultHtml); + + $this->layout->expects($this->once()) + ->method('createBlock') + ->willReturn($elementHtmlSelect); + + $this->assertEquals($resultHtml, $this->model->getCountryHtmlSelect()); + } + + /** + * 1. Store code + * 2. Default Country ID + * 3. Top Destinations + * 4. Exploded Top Destinations + * 5. Result options + * + * @return array + */ + public function dataProviderGetCountryHtmlSelect() + { + return [ + [ + 'default', + 1, + '', + [], + [ + [ + 'value' => 'US', + 'label' => 'United States', + ], + ], + 'result html', + ], + [ + 'default', + 1, + 'US', + [ + 0 => 'US', + ], + [ + [ + 'value' => 'US', + 'label' => 'United States', + ], + ], + 'result html', + ], + [ + 'default', + 1, + 'US,GB', + [ + 0 => 'US', + 1 => 'GB', + ], + [ + [ + 'value' => 'US', + 'label' => 'United States', + ], + [ + 'value' => 'GB', + 'label' => 'Great Britain', + ], + ], + 'result html', + ], + ]; + } + + /** + * @param $defaultCountry + * @param $options + * @param $resultHtml + * @return \PHPUnit_Framework_MockObject_MockObject + */ + protected function mockElementHtmlSelect($defaultCountry, $options, $resultHtml) + { + $name = 'country_id'; + $id = 'country'; + $title = 'Country'; + + $elementHtmlSelect = $this->getMockBuilder('Magento\Framework\View\Element\Html\Select') + ->disableOriginalConstructor() + ->setMethods([ + 'setName', + 'setId', + 'setTitle', + 'setValue', + 'setOptions', + 'setExtraParams', + 'getHtml', + ]) + ->getMock(); + + $elementHtmlSelect->expects($this->once()) + ->method('setName') + ->with($name) + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('setId') + ->with($id) + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('setTitle') + ->with(__($title)) + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('setValue') + ->with($defaultCountry) + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('setOptions') + ->with($options) + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('setExtraParams') + ->with('data-validate="{\'validate-select\':true}"') + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('getHtml') + ->willReturn($resultHtml); + + return $elementHtmlSelect; + } +} diff --git a/app/code/Magento/Directory/composer.json b/app/code/Magento/Directory/composer.json index bc48bec5995d1768c6b6963bd2d72689a5bca4cf..23ab56ed5a4f107e2748d9c98f7a78fe3b762bc4 100644 --- a/app/code/Magento/Directory/composer.json +++ b/app/code/Magento/Directory/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php b/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php index 699e44fe150db1c3f052928ebbe89f212e24eacb..2416dc5d4c9efde09c4dcbcb23d60a700c5c97c5 100644 --- a/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php +++ b/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php @@ -30,8 +30,8 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer * @param \Magento\Framework\Url\Helper\Data $urlHelper * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param PriceCurrencyInterface $priceCurrency - * @param \Magento\Downloadable\Helper\Catalog\Product\Configuration $downloadableProductConfiguration * @param \Magento\Framework\Module\Manager $moduleManager + * @param \Magento\Downloadable\Helper\Catalog\Product\Configuration $downloadableProductConfiguration * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ diff --git a/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php b/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php index accf63a02ea487aeb397b6dc83987364145259c9..4245dede4be09a31918bc40c0814e7d8f628134f 100644 --- a/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php +++ b/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php @@ -20,7 +20,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); @@ -68,10 +68,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getDownloadableLinkPriceTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_downlod_idx'); - } - return $this->getTable('catalog_product_index_price_downlod_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_downlod'); } /** diff --git a/app/code/Magento/Downloadable/composer.json b/app/code/Magento/Downloadable/composer.json index 15f14f91214a75f64c9e6493480b1d972d830b95..b28ee43df4619e46d9314a36a88369cb34ce7a94 100644 --- a/app/code/Magento/Downloadable/composer.json +++ b/app/code/Magento/Downloadable/composer.json @@ -3,28 +3,27 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-gift-message": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-msrp": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-gift-message": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-msrp": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Downloadable/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Downloadable/view/frontend/layout/checkout_cart_item_renderers.xml index 7a152eff590fc3608cbec1644a13a9b674b1160e..f6307cf7f80f69f3e424dd155b80f8b5cbbeba20 100644 --- a/app/code/Magento/Downloadable/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/Downloadable/view/frontend/layout/checkout_cart_item_renderers.xml @@ -8,7 +8,12 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\Downloadable\Block\Checkout\Cart\Item\Renderer" as="downloadable" template="checkout/cart/item/default.phtml"/> + <block class="Magento\Downloadable\Block\Checkout\Cart\Item\Renderer" as="downloadable" template="checkout/cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.downloadable.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.downloadable.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.downloadable.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> <referenceBlock name="additional.product.info"> <block class="Magento\Downloadable\Block\Checkout\Cart\Item\Renderer" name="downloadable.product.links" template="Magento_Downloadable::checkout/links.phtml"/> diff --git a/app/code/Magento/Downloadable/view/frontend/templates/checkout/cart/item/default.phtml b/app/code/Magento/Downloadable/view/frontend/templates/checkout/cart/item/default.phtml index 62441265c7402ef642fcc8027a3a2beb7d93b788..e45c33bba790ddcf3d0cf97ab7130fc0185fd65c 100644 --- a/app/code/Magento/Downloadable/view/frontend/templates/checkout/cart/item/default.phtml +++ b/app/code/Magento/Downloadable/view/frontend/templates/checkout/cart/item/default.phtml @@ -104,22 +104,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <tr class="item-actions"> <td colspan="<?php echo $cols;?>"> <div class="actions-toolbar"> - <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllowInCart()) : ?> - <?php if ($isVisibleProduct): ?> - <a href="#" data-post='<?php echo $this->helper('Magento\Wishlist\Helper\Data')->getMoveFromCartParams($_item->getId()); ?>' class="use-ajax action towishlist"> - <span><?php echo __('Move to Wish List'); ?></span> - </a> - <?php endif ?> - <?php endif ?> - <?php if ($isVisibleProduct): ?> - <a class="action edit" href="<?php echo $block->getConfigureUrl() ?>" title="<?php echo __('Edit item parameters') ?>"><span><?php echo __('Edit') ?></span></a> - <?php endif ?> - <button title="<?php echo __('Remove item') ?>" - type="button" - class="action delete" - data-post='<?php echo $this->helper('Magento\Checkout\Helper\Cart')->getDeletePostJson($_item); ?>'> - <span><?php echo __('Remove item')?></span> - </button> + <?php echo $block->getActions($_item) ?> </div> </td> </tr> diff --git a/app/code/Magento/Eav/composer.json b/app/code/Magento/Eav/composer.json index 5f243b8986208869e385aebfcbb4b57e28615de6..27a79fab2f4a2d182e3df0749481b2877d6eb5cf 100644 --- a/app/code/Magento/Eav/composer.json +++ b/app/code/Magento/Eav/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Email/Model/AbstractTemplate.php b/app/code/Magento/Email/Model/AbstractTemplate.php index 4eba984b8fcfa243c684cce9019a51444cad3283..4b92506e5118417cdba79e7b8556afd8974fe8da 100644 --- a/app/code/Magento/Email/Model/AbstractTemplate.php +++ b/app/code/Magento/Email/Model/AbstractTemplate.php @@ -71,22 +71,26 @@ abstract class AbstractTemplate extends AbstractModel implements TemplateTypesIn * @param \Magento\Framework\Registry $registry * @param \Magento\Store\Model\App\Emulation $appEmulation * @param \Magento\Store\Model\StoreManagerInterface $storeManager + * @param \Magento\Framework\Model\Resource\AbstractResource $resource + * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data */ public function __construct( \Magento\Framework\Model\Context $context, - \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, + \Magento\Framework\View\DesignInterface $design, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Store\Model\StoreManagerInterface $storeManager, - array $data = [] + array $data = [], + \Magento\Framework\Model\Resource\AbstractResource $resource = null, + \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null ) { $this->_design = $design; $this->_area = isset($data['area']) ? $data['area'] : null; $this->_store = isset($data['store']) ? $data['store'] : null; $this->_appEmulation = $appEmulation; $this->_storeManager = $storeManager; - parent::__construct($context, $registry, null, null, $data); + parent::__construct($context, $registry, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Email/Model/BackendTemplate.php b/app/code/Magento/Email/Model/BackendTemplate.php index c8bc6b34398e0c492f9123cfaeedc8182da23299..e95278407067921ce22144ee327204e518b60625 100644 --- a/app/code/Magento/Email/Model/BackendTemplate.php +++ b/app/code/Magento/Email/Model/BackendTemplate.php @@ -38,8 +38,8 @@ class BackendTemplate extends Template */ public function __construct( \Magento\Framework\Model\Context $context, - \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, + \Magento\Framework\View\DesignInterface $design, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\Filesystem $filesystem, @@ -53,8 +53,8 @@ class BackendTemplate extends Template ) { parent::__construct( $context, - $design, $registry, + $design, $appEmulation, $storeManager, $filesystem, diff --git a/app/code/Magento/Email/Model/Template.php b/app/code/Magento/Email/Model/Template.php index 8b9e01d79eb803054587d91bd49887948f4c9403..a349f5d9ed0708300e369fb97800dc258f3ded2d 100644 --- a/app/code/Magento/Email/Model/Template.php +++ b/app/code/Magento/Email/Model/Template.php @@ -156,10 +156,10 @@ class Template extends \Magento\Email\Model\AbstractTemplate implements \Magento /** * @param \Magento\Framework\Model\Context $context - * @param \Magento\Framework\View\DesignInterface $design * @param \Magento\Framework\Registry $registry + * @param \Magento\Framework\View\DesignInterface $design * @param \Magento\Store\Model\App\Emulation $appEmulation - * @param \Magento\Store\Model\StoreManagerInterface $storeManager + * @param StoreManagerInterface $storeManager * @param \Magento\Framework\Filesystem $filesystem * @param \Magento\Framework\View\Asset\Repository $assetRepo * @param \Magento\Framework\View\FileSystem $viewFileSystem @@ -167,13 +167,15 @@ class Template extends \Magento\Email\Model\AbstractTemplate implements \Magento * @param Template\FilterFactory $emailFilterFactory * @param Template\Config $emailConfig * @param array $data + * @param \Magento\Framework\Model\Resource\AbstractResource $resource + * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( \Magento\Framework\Model\Context $context, - \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, + \Magento\Framework\View\DesignInterface $design, \Magento\Store\Model\App\Emulation $appEmulation, StoreManagerInterface $storeManager, \Magento\Framework\Filesystem $filesystem, @@ -182,7 +184,9 @@ class Template extends \Magento\Email\Model\AbstractTemplate implements \Magento \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Email\Model\Template\FilterFactory $emailFilterFactory, \Magento\Email\Model\Template\Config $emailConfig, - array $data = [] + array $data = [], + \Magento\Framework\Model\Resource\AbstractResource $resource = null, + \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null ) { $this->_scopeConfig = $scopeConfig; $this->_filesystem = $filesystem; @@ -190,7 +194,16 @@ class Template extends \Magento\Email\Model\AbstractTemplate implements \Magento $this->_viewFileSystem = $viewFileSystem; $this->_emailFilterFactory = $emailFilterFactory; $this->_emailConfig = $emailConfig; - parent::__construct($context, $design, $registry, $appEmulation, $storeManager, $data); + parent::__construct( + $context, + $registry, + $design, + $appEmulation, + $storeManager, + $data, + $resource, + $resourceCollection + ); } /** diff --git a/app/code/Magento/Email/Test/Unit/Model/TemplateTest.php b/app/code/Magento/Email/Test/Unit/Model/TemplateTest.php index 47d4e8e0929ac4722552617b51d069385d24d2be..3c89c3a8532971729ea0a7fcbb408ef0854fb2a3 100644 --- a/app/code/Magento/Email/Test/Unit/Model/TemplateTest.php +++ b/app/code/Magento/Email/Test/Unit/Model/TemplateTest.php @@ -122,8 +122,8 @@ class TemplateTest extends \PHPUnit_Framework_TestCase ->setConstructorArgs( [ $this->context, - $this->design, $this->registry, + $this->design, $this->appEmulation, $this->storeManager, $this->filesystem, @@ -758,8 +758,8 @@ class TemplateTest extends \PHPUnit_Framework_TestCase )->setConstructorArgs( [ $this->getMock('Magento\Framework\Model\Context', [], [], '', false), - $this->getMock('Magento\Theme\Model\View\Design', [], [], '', false), $this->getMock('Magento\Framework\Registry', [], [], '', false), + $this->getMock('Magento\Theme\Model\View\Design', [], [], '', false), $this->getMock('Magento\Store\Model\App\Emulation', [], [], '', false), $this->getMock('Magento\Store\Model\StoreManager', [], [], '', false), $this->getMock('Magento\Framework\Filesystem', [], [], '', false), diff --git a/app/code/Magento/Email/composer.json b/app/code/Magento/Email/composer.json index e1be936adc070dc4d55a948b467c7e147cd8193d..337caab036bcf8efe39b14f1d7d22bf534a38f02 100644 --- a/app/code/Magento/Email/composer.json +++ b/app/code/Magento/Email/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-variable": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-variable": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Fedex/composer.json b/app/code/Magento/Fedex/composer.json index 2fe10a640638848100355b7e0b1c66a8b5244292..63f7f335ce91ef6b55f722c63265ca6cc57f560a 100644 --- a/app/code/Magento/Fedex/composer.json +++ b/app/code/Magento/Fedex/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GiftMessage/Api/GuestCartRepositoryInterface.php b/app/code/Magento/GiftMessage/Api/GuestCartRepositoryInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..93973b139a221edb40fb63a51691c506a6ac66dd --- /dev/null +++ b/app/code/Magento/GiftMessage/Api/GuestCartRepositoryInterface.php @@ -0,0 +1,33 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Api; + +/** + * Interface GuestCartRepositoryInterface + * @api + */ +interface GuestCartRepositoryInterface +{ + /** + * Return the gift message for a specified order. + * + * @param string $cartId The shopping cart ID. + * @return \Magento\GiftMessage\Api\Data\MessageInterface Gift message. + */ + public function get($cartId); + + /** + * Set the gift message for an entire order. + * + * @param string $cartId The cart ID. + * @param \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage The gift message. + * @return bool + * @throws \Magento\Framework\Exception\NoSuchEntityException The specified cart does not exist. + * @throws \Magento\Framework\Exception\InputException You cannot add gift messages to empty carts. + * @throws \Magento\Framework\Exception\CouldNotSaveException The specified gift message could not be saved. + */ + public function save($cartId, \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage); +} diff --git a/app/code/Magento/GiftMessage/Api/GuestItemRepositoryInterface.php b/app/code/Magento/GiftMessage/Api/GuestItemRepositoryInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..31ce48c0907271a6d2b47089683a8af1d4f56e8a --- /dev/null +++ b/app/code/Magento/GiftMessage/Api/GuestItemRepositoryInterface.php @@ -0,0 +1,36 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Api; + +/** + * Interface GuestItemRepositoryInterface + * @api + */ +interface GuestItemRepositoryInterface +{ + /** + * Return the gift message for a specified item in a specified shopping cart. + * + * @param string $cartId The shopping cart ID. + * @param int $itemId The item ID. + * @return \Magento\GiftMessage\Api\Data\MessageInterface Gift message. + * @throws \Magento\Framework\Exception\NoSuchEntityException The specified item does not exist in the cart. + */ + public function get($cartId, $itemId); + + /** + * Set the gift message for a specified item in a specified shopping cart. + * + * @param string $cartId The cart ID. + * @param \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage The gift message. + * @param int $itemId The item ID. + * @return bool + * @throws \Magento\Framework\Exception\NoSuchEntityException The specified cart does not exist. + * @throws \Magento\Framework\Exception\InputException You cannot add gift messages to empty carts. + * @throws \Magento\Framework\Exception\CouldNotSaveException The specified gift message could not be saved. + */ + public function save($cartId, \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage, $itemId); +} diff --git a/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php b/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php new file mode 100644 index 0000000000000000000000000000000000000000..bf208eb18eac7714eef0689d9178821e7346cdb5 --- /dev/null +++ b/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php @@ -0,0 +1,81 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Block\Cart; + +use Magento\Backend\Block\Template\Context; +use Magento\Framework\Json\Encoder; +use Magento\GiftMessage\Model\CompositeConfigProvider; + +class GiftOptions extends \Magento\Backend\Block\Template +{ + /** + * @var bool + */ + protected $_isScopePrivate = false; + + /** + * @var array + */ + protected $jsLayout; + + /** + * @var \Magento\Checkout\Model\CompositeConfigProvider + */ + protected $configProvider; + + /** + * @var array|\Magento\Checkout\Block\Checkout\LayoutProcessorInterface[] + */ + protected $layoutProcessors; + + /** + * @var Encoder + */ + protected $jsonEncoder; + + /** + * @param Context $context + * @param Encoder $jsonEncoder + * @param CompositeConfigProvider $configProvider + * @param array $layoutProcessors + * @param array $data + */ + public function __construct( + Context $context, + Encoder $jsonEncoder, + CompositeConfigProvider $configProvider, + array $layoutProcessors = [], + array $data = [] + ) { + parent::__construct($context, $data); + $this->jsonEncoder = $jsonEncoder; + $this->_isScopePrivate = true; + $this->jsLayout = isset($data['jsLayout']) && is_array($data['jsLayout']) ? $data['jsLayout'] : []; + $this->configProvider = $configProvider; + $this->layoutProcessors = $layoutProcessors; + } + + /** + * @return string + */ + public function getJsLayout() + { + foreach ($this->layoutProcessors as $processor) { + $this->jsLayout = $processor->process($this->jsLayout); + } + return $this->jsonEncoder->encode($this->jsLayout); + } + + /** + * Retrieve gift message configuration + * + * @return array + */ + public function getGiftOptionsConfigJson() + { + return $this->jsonEncoder->encode($this->configProvider->getConfig()); + } +} diff --git a/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php new file mode 100644 index 0000000000000000000000000000000000000000..429279e7ff2c9fc409716b6361d6991908e2dccb --- /dev/null +++ b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php @@ -0,0 +1,66 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Block\Cart\Item\Renderer\Actions; + +use Magento\Backend\Block\Template\Context; +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Framework\Json\Encoder; + +class GiftOptions extends Generic +{ + /** + * @var bool + */ + protected $_isScopePrivate = false; + + /** + * @var array + */ + protected $jsLayout; + + /** + * @var array|LayoutProcessorInterface[] + */ + protected $layoutProcessors; + + /** + * @var Encoder + */ + protected $jsonEncoder; + + /** + * @param Context $context + * @param Encoder $jsonEncoder + * @param array $layoutProcessors + * @param array $data + */ + public function __construct( + Context $context, + Encoder $jsonEncoder, + array $layoutProcessors = [], + array $data = [] + ) { + parent::__construct($context, $data); + $this->jsonEncoder = $jsonEncoder; + $this->_isScopePrivate = true; + $this->jsLayout = isset($data['jsLayout']) && is_array($data['jsLayout']) ? $data['jsLayout'] : []; + $this->layoutProcessors = $layoutProcessors; + } + + /** + * Return JS layout + * + * @return string + */ + public function getJsLayout() + { + $jsLayout = $this->jsLayout; + foreach ($this->layoutProcessors as $processor) { + $jsLayout = $processor->process($jsLayout, $this->getItem()); + } + return $this->jsonEncoder->encode($jsLayout); + } +} diff --git a/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/ItemIdProcessor.php b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/ItemIdProcessor.php new file mode 100644 index 0000000000000000000000000000000000000000..e3a2d93376a431294e35ef03ab7371f1e0da8255 --- /dev/null +++ b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/ItemIdProcessor.php @@ -0,0 +1,34 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Block\Cart\Item\Renderer\Actions; + +use Magento\Quote\Model\Quote\Item; + +class ItemIdProcessor implements LayoutProcessorInterface +{ + /** + * Adds item ID to giftOptionsCartItem configuration and name + * + * @param array $jsLayout + * @param Item $item + * @return array + */ + public function process($jsLayout, Item $item) + { + if (isset($jsLayout['components']['giftOptionsCartItem'])) { + if (!isset($jsLayout['components']['giftOptionsCartItem']['config'])) { + $jsLayout['components']['giftOptionsCartItem']['config'] = []; + } + $jsLayout['components']['giftOptionsCartItem']['config']['itemId'] = $item->getId(); + + $jsLayout['components']['giftOptionsCartItem-' . $item->getId()] = + $jsLayout['components']['giftOptionsCartItem']; + unset($jsLayout['components']['giftOptionsCartItem']); + } + + return $jsLayout; + } +} diff --git a/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/LayoutProcessorInterface.php b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/LayoutProcessorInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..5e8ecfacb3a3bdcb0cf2cb4a3c41aae8cdfe39a8 --- /dev/null +++ b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/LayoutProcessorInterface.php @@ -0,0 +1,20 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Block\Cart\Item\Renderer\Actions; + +use Magento\Quote\Model\Quote\Item; + +interface LayoutProcessorInterface +{ + /** + * Process JS layout of block + * + * @param array $jsLayout + * @param Item $item + * @return array + */ + public function process($jsLayout, Item $item); +} diff --git a/app/code/Magento/GiftMessage/Model/CartRepository.php b/app/code/Magento/GiftMessage/Model/CartRepository.php index 4fe6b988236c6258fc0d7f7068a72f803468debb..7cb8058bfb250ad003ed865e2bd807cf54a9c607 100644 --- a/app/code/Magento/GiftMessage/Model/CartRepository.php +++ b/app/code/Magento/GiftMessage/Model/CartRepository.php @@ -12,7 +12,7 @@ use Magento\Framework\Exception\InputException; use Magento\Framework\Exception\State\InvalidTransitionException; /** - * Shopping cart gift message repository object. + * Shopping cart gift message repository object for registered customer */ class CartRepository implements \Magento\GiftMessage\Api\CartRepositoryInterface { diff --git a/app/code/Magento/GiftMessage/Model/CompositeConfigProvider.php b/app/code/Magento/GiftMessage/Model/CompositeConfigProvider.php new file mode 100644 index 0000000000000000000000000000000000000000..49fe4c189b1971e7d2eb8b9babea91d665e1fc43 --- /dev/null +++ b/app/code/Magento/GiftMessage/Model/CompositeConfigProvider.php @@ -0,0 +1,37 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Model; + +use Magento\Checkout\Model\ConfigProviderInterface; + +class CompositeConfigProvider implements ConfigProviderInterface +{ + /** + * @var ConfigProviderInterface[] + */ + private $configProviders; + + /** + * @param ConfigProviderInterface[] $configProviders + */ + public function __construct( + array $configProviders + ) { + $this->configProviders = $configProviders; + } + + /** + * {@inheritdoc} + */ + public function getConfig() + { + $config = []; + foreach ($this->configProviders as $configProvider) { + $config = array_merge_recursive($config, $configProvider->getConfig()); + } + return $config; + } +} diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index aac0982ecb6048d72321897b820d6222fab0b6ec..18d2b55950c90179d2234eb50203e94b1aaf8607 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -7,9 +7,16 @@ namespace Magento\GiftMessage\Model; use Magento\Checkout\Model\ConfigProviderInterface; use Magento\GiftMessage\Helper\Message as GiftMessageHelper; +use Magento\Framework\App\Http\Context as HttpContext; +use Magento\Customer\Model\Context as CustomerContext; +use Magento\Framework\UrlInterface; +use Magento\Framework\Locale\FormatInterface as LocaleFormat; +use Magento\Framework\Data\Form\FormKey; /** - * Configuration provider for GiftMessage rendering on "Shipping Method" step of checkout. + * Configuration provider for GiftMessage rendering on "Checkout cart" page. + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.NPathComplexity) */ class GiftMessageConfigProvider implements ConfigProviderInterface { @@ -33,22 +40,49 @@ class GiftMessageConfigProvider implements ConfigProviderInterface */ protected $checkoutSession; + /** + * @var \Magento\Store\Model\StoreManagerInterface + */ + protected $storeManager; + + /** + * @var LocaleFormat + */ + protected $localeFormat; + + /** + * @var FormKey + */ + protected $formKey; + /** * @param \Magento\Framework\App\Helper\Context $context * @param \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository * @param \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository * @param \Magento\Checkout\Model\Session $checkoutSession + * @param HttpContext $httpContext + * @param \Magento\Store\Model\StoreManagerInterface $storeManager + * @param LocaleFormat $localeFormat + * @param FormKey $formKey */ public function __construct( \Magento\Framework\App\Helper\Context $context, \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository, \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository, - \Magento\Checkout\Model\Session $checkoutSession + \Magento\Checkout\Model\Session $checkoutSession, + HttpContext $httpContext, + \Magento\Store\Model\StoreManagerInterface $storeManager, + LocaleFormat $localeFormat, + FormKey $formKey ) { $this->scopeConfiguration = $context->getScopeConfig(); $this->cartRepository = $cartRepository; $this->itemRepository = $itemRepository; $this->checkoutSession = $checkoutSession; + $this->httpContext = $httpContext; + $this->storeManager = $storeManager; + $this->localeFormat = $localeFormat; + $this-> formKey = $formKey; } /** @@ -57,6 +91,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface public function getConfig() { $configuration = []; + $configuration['giftMessage'] = []; $orderLevelGiftMessageConfiguration = (bool)$this->scopeConfiguration->getValue( GiftMessageHelper::XPATH_CONFIG_GIFT_MESSAGE_ALLOW_ORDER, \Magento\Store\Model\ScopeInterface::SCOPE_STORE @@ -67,7 +102,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface ); if ($orderLevelGiftMessageConfiguration) { $orderMessages = $this->getOrderLevelGiftMessages(); - $configuration['isOrderLevelGiftOptionsEnabled'] = true; + $configuration['isOrderLevelGiftOptionsEnabled'] = (bool)$this->isQuoteVirtual() ? false : true; $configuration['giftMessage']['orderLevel'] = $orderMessages === null ? true : $orderMessages->getData(); } if ($itemLevelGiftMessageConfiguration) { @@ -75,9 +110,50 @@ class GiftMessageConfigProvider implements ConfigProviderInterface $configuration['isItemLevelGiftOptionsEnabled'] = true; $configuration['giftMessage']['itemLevel'] = $itemMessages === null ? true : $itemMessages; } + $configuration['priceFormat'] = $this->localeFormat->getPriceFormat( + null, + $this->checkoutSession->getQuote()->getQuoteCurrencyCode() + ); + $configuration['storeCode'] = $this->getStoreCode(); + $configuration['isCustomerLoggedIn'] = $this->isCustomerLoggedIn(); + $configuration['formKey'] = $this->formKey->getFormKey(); + $store = $this->storeManager->getStore(); + $configuration['baseUrl'] = $store->isFrontUrlSecure() + ? $store->getBaseUrl(UrlInterface::URL_TYPE_LINK, true) + : $store->getBaseUrl(UrlInterface::URL_TYPE_LINK, false); return $configuration; } + /** + * Check if customer is logged in + * + * @return bool + */ + private function isCustomerLoggedIn() + { + return (bool)$this->httpContext->getValue(CustomerContext::CONTEXT_AUTH); + } + + /** + * Retrieve store code + * + * @return string + */ + protected function getStoreCode() + { + return $this->checkoutSession->getQuote()->getStore()->getCode(); + } + + /** + * Check if quote is virtual + * + * @return bool + */ + protected function isQuoteVirtual() + { + return $this->checkoutSession->loadCustomerQuote()->getQuote()->getIsVirtual(); + } + /** * Load already specified quote level gift message. * diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageManager.php b/app/code/Magento/GiftMessage/Model/GiftMessageManager.php index bba98363c7d4a608a7e4a23b821b59af8954b642..b230fb2c40c69875bcf35e184c87710e86bbb38b 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageManager.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageManager.php @@ -5,7 +5,6 @@ */ namespace Magento\GiftMessage\Model; -use Magento\Framework\Exception\State\InvalidTransitionException; use Magento\Framework\Exception\CouldNotSaveException; class GiftMessageManager @@ -100,18 +99,9 @@ class GiftMessageManager * @param null|int $entityId The entity ID. * @return void * @throws \Magento\Framework\Exception\CouldNotSaveException The specified gift message is not available. - * @throws \Magento\Framework\Exception\State\InvalidTransitionException The billing or shipping address is not set. */ public function setMessage(\Magento\Quote\Model\Quote $quote, $type, $giftMessage, $entityId = null) { - if ($quote->getBillingAddress()->getCountryId() === null) { - throw new InvalidTransitionException(__('Billing address is not set')); - } - - // check if shipping address is set - if ($quote->getShippingAddress()->getCountryId() === null) { - throw new InvalidTransitionException(__('Shipping address is not set')); - } $message[$type][$entityId] = [ 'from' => $giftMessage->getSender(), 'to' => $giftMessage->getRecipient(), diff --git a/app/code/Magento/GiftMessage/Model/GuestCartRepository.php b/app/code/Magento/GiftMessage/Model/GuestCartRepository.php new file mode 100644 index 0000000000000000000000000000000000000000..b27513fc3550ea850d467d4e0105243664929eb3 --- /dev/null +++ b/app/code/Magento/GiftMessage/Model/GuestCartRepository.php @@ -0,0 +1,61 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\GiftMessage\Model; + +use Magento\GiftMessage\Api\Data\MessageInterface; +use Magento\GiftMessage\Api\GuestCartRepositoryInterface; +use Magento\Quote\Model\QuoteIdMask; +use Magento\Quote\Model\QuoteIdMaskFactory; + +/** + * Shopping cart gift message repository object for guest + */ +class GuestCartRepository implements GuestCartRepositoryInterface +{ + /** + * @var CartRepository + */ + protected $repository; + + /** + * @var QuoteIdMaskFactory + */ + protected $quoteIdMaskFactory; + + /** + * @param CartRepository $repository + * @param QuoteIdMaskFactory $quoteIdMaskFactory + */ + public function __construct( + CartRepository $repository, + QuoteIdMaskFactory $quoteIdMaskFactory + ) { + $this->repository = $repository; + $this->quoteIdMaskFactory = $quoteIdMaskFactory; + } + + /** + * {@inheritDoc} + */ + public function get($cartId) + { + /** @var $quoteIdMask QuoteIdMask */ + $quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id'); + return $this->repository->get($quoteIdMask->getQuoteId()); + } + + /** + * {@inheritDoc} + */ + public function save($cartId, MessageInterface $giftMessage) + { + /** @var $quoteIdMask QuoteIdMask */ + $quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id'); + return $this->repository->save($quoteIdMask->getQuoteId(), $giftMessage); + } +} diff --git a/app/code/Magento/GiftMessage/Model/GuestItemRepository.php b/app/code/Magento/GiftMessage/Model/GuestItemRepository.php new file mode 100644 index 0000000000000000000000000000000000000000..d46ed3c55894dbf584f0b41aa687a4fbeb66fc4d --- /dev/null +++ b/app/code/Magento/GiftMessage/Model/GuestItemRepository.php @@ -0,0 +1,61 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\GiftMessage\Model; + +use Magento\GiftMessage\Api\Data\MessageInterface; +use Magento\GiftMessage\Api\GuestItemRepositoryInterface; +use Magento\Quote\Model\QuoteIdMask; +use Magento\Quote\Model\QuoteIdMaskFactory; + +/** + * Shopping cart gift message item repository object for guest + */ +class GuestItemRepository implements GuestItemRepositoryInterface +{ + /** + * @var ItemRepository + */ + protected $repository; + + /** + * @var QuoteIdMaskFactory + */ + protected $quoteIdMaskFactory; + + /** + * @param ItemRepository $repository + * @param QuoteIdMaskFactory $quoteIdMaskFactory + */ + public function __construct( + ItemRepository $repository, + QuoteIdMaskFactory $quoteIdMaskFactory + ) { + $this->repository = $repository; + $this->quoteIdMaskFactory = $quoteIdMaskFactory; + } + + /** + * {@inheritDoc} + */ + public function get($cartId, $itemId) + { + /** @var $quoteIdMask QuoteIdMask */ + $quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id'); + return $this->repository->get($quoteIdMask->getQuoteId(), $itemId); + } + + /** + * {@inheritDoc} + */ + public function save($cartId, MessageInterface $giftMessage, $itemId) + { + /** @var $quoteIdMask QuoteIdMask */ + $quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id'); + return $this->repository->save($quoteIdMask->getQuoteId(), $giftMessage, $itemId); + } +} diff --git a/app/code/Magento/GiftMessage/Model/ItemRepository.php b/app/code/Magento/GiftMessage/Model/ItemRepository.php index d7220d2516f7a2b934d9365a83c481f13249b1c2..cead9782a4ec13bcfacfba5ba47910cf1c4eaa02 100644 --- a/app/code/Magento/GiftMessage/Model/ItemRepository.php +++ b/app/code/Magento/GiftMessage/Model/ItemRepository.php @@ -13,7 +13,7 @@ use Magento\Framework\Exception\State\InvalidTransitionException; use Magento\Framework\Exception\NoSuchEntityException; /** - * Shopping cart gift message item repository object. + * Shopping cart gift message item repository object for registered customer */ class ItemRepository implements \Magento\GiftMessage\Api\ItemRepositoryInterface { diff --git a/app/code/Magento/GiftMessage/Model/Plugin/TotalsDataProcessorPlugin.php b/app/code/Magento/GiftMessage/Model/Plugin/TotalsDataProcessorPlugin.php deleted file mode 100644 index 9d26c0a38b413dc6b3f19718fba77544b0413432..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/Model/Plugin/TotalsDataProcessorPlugin.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\GiftMessage\Model\Plugin; - -use Magento\Quote\Model\Cart\TotalsAdditionalDataProcessor; -use Magento\Quote\Api\Data\TotalsAdditionalDataInterface; - -/** - * Shopping cart gift message item repository object. - */ -class TotalsDataProcessorPlugin -{ - /** - * @var \Magento\GiftMessage\Api\CartRepositoryInterface - */ - protected $cartRepository; - - /** - * @var \Magento\GiftMessage\Api\ItemRepositoryInterface - */ - protected $itemRepositoryInterface; - - /** - * @param \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository - * @param \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository - */ - public function __construct( - \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository, - \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository - ) { - $this->cartRepository = $cartRepository; - $this->itemRepositoryInterface = $itemRepository; - } - - /** - * Set gift messages from additional data. - * - * @param \Magento\Quote\Model\Cart\TotalsAdditionalDataProcessor $subject - * @param TotalsAdditionalDataInterface $additionalData - * @param int $cartId - * @return void - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function beforeProcess( - TotalsAdditionalDataProcessor $subject, - TotalsAdditionalDataInterface $additionalData, - $cartId - ) { - $giftMessages = $additionalData->getExtensionAttributes()->getGiftMessages(); - foreach ($giftMessages as $giftMessage) { - /** @var \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage */ - $entityType = $giftMessage->getExtensionAttributes()->getEntityType(); - $entityId = $giftMessage->getExtensionAttributes()->getEntityId(); - if ($entityType === 'quote') { - $this->cartRepository->save($cartId, $giftMessage); - } elseif ($entityType === 'item') { - $this->itemRepositoryInterface->save($cartId, $giftMessage, $entityId); - } - } - } -} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..32a94d762c75f446d4fab739287f165ae7e9e58f --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php @@ -0,0 +1,80 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Block\Cart; + +use Magento\GiftMessage\Block\Cart\GiftOptions; + +class GiftOptionsTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Backend\Block\Template\Context|\PHPUnit_Framework_MockObject_MockObject */ + protected $context; + + /** @var \Magento\GiftMessage\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ + protected $compositeConfigProvider; + + /** @var \Magento\Checkout\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ + protected $layoutProcessorMock; + + /** @var \Magento\GiftMessage\Block\Cart\GiftOptions */ + protected $model; + + /** @var \Magento\Framework\Json\Encoder|\PHPUnit_Framework_MockObject_MockObject */ + protected $jsonEncoderMock; + + /** @var array */ + protected $jsLayout = ['root' => 'node']; + + public function setUp() + { + $this->context = $this->getMock('Magento\Backend\Block\Template\Context', [], [], '', false); + $this->jsonEncoderMock = $this->getMock('Magento\Framework\Json\Encoder', [], [], '', false); + $this->compositeConfigProvider = $this->getMock( + 'Magento\GiftMessage\Model\CompositeConfigProvider', + [], + [], + '', + false + ); + $this->layoutProcessorMock = $this->getMockForAbstractClass( + 'Magento\Checkout\Block\Checkout\LayoutProcessorInterface', + [], + '', + false + ); + $this->model = new GiftOptions( + $this->context, + $this->jsonEncoderMock, + $this->compositeConfigProvider, + [$this->layoutProcessorMock], + ['jsLayout' => $this->jsLayout] + ); + } + + public function testGetJsLayout() + { + $this->layoutProcessorMock->expects($this->once()) + ->method('process') + ->with($this->jsLayout) + ->willReturnArgument(0); + $this->jsonEncoderMock->expects($this->once()) + ->method('encode') + ->with($this->jsLayout) + ->willReturnArgument(0); + $this->assertEquals($this->jsLayout, $this->model->getJsLayout()); + } + + public function testGetGiftOptionsConfigJson() + { + $this->compositeConfigProvider->expects($this->once()) + ->method('getConfig') + ->willReturn($this->jsLayout); + $this->jsonEncoderMock->expects($this->once()) + ->method('encode') + ->with($this->jsLayout) + ->willReturnArgument(0); + $this->assertEquals($this->jsLayout, $this->model->getGiftOptionsConfigJson()); + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/GiftOptionsTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/GiftOptionsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0a3f3e89b7db12507f78d643cc47758e7e55eb4c --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/GiftOptionsTest.php @@ -0,0 +1,79 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\Backend\Block\Template\Context; +use Magento\Checkout\Block\Checkout\LayoutProcessorInterface; +use Magento\Framework\Json\Encoder; +use Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions; +use Magento\Quote\Model\Quote\Item; + +class GiftOptionsTest extends \PHPUnit_Framework_TestCase +{ + /** @var GiftOptions */ + protected $model; + + /** @var Context|\PHPUnit_Framework_MockObject_MockObject */ + protected $contextMock; + + /** @var LayoutProcessorInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $layoutProcessorMock; + + /** @var Encoder|\PHPUnit_Framework_MockObject_MockObject */ + protected $jsonEncoderMock; + + /** @var array */ + protected $jsLayout = ['root' => 'node']; + + public function setUp() + { + $this->contextMock = $this->getMockBuilder('Magento\Backend\Block\Template\Context') + ->disableOriginalConstructor() + ->getMock(); + + $this->jsonEncoderMock = $this->getMockBuilder('Magento\Framework\Json\Encoder') + ->disableOriginalConstructor() + ->getMock(); + + $this->compositeConfigProvider = $this->getMockBuilder('Magento\Checkout\Model\CompositeConfigProvider') + ->disableOriginalConstructor() + ->getMock(); + + $this->layoutProcessorMock = $this->getMockBuilder('Magento\Checkout\Block\Checkout\LayoutProcessorInterface') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->model = new GiftOptions( + $this->contextMock, + $this->jsonEncoderMock, + [$this->layoutProcessorMock], + ['jsLayout' => $this->jsLayout] + ); + } + + public function testGetJsLayout() + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $this->layoutProcessorMock->expects($this->once()) + ->method('process') + ->with($this->jsLayout, $itemMock) + ->willReturnArgument(0); + + $this->jsonEncoderMock->expects($this->once()) + ->method('encode') + ->with($this->jsLayout) + ->willReturnArgument(0); + + $this->model->setItem($itemMock); + $this->assertEquals($this->jsLayout, $this->model->getJsLayout()); + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/ItemIdProcessorTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/ItemIdProcessorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..3231c73acb741f51b7cad2b2bd12d46d5b349cce --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/ItemIdProcessorTest.php @@ -0,0 +1,73 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\ItemIdProcessor; +use Magento\Quote\Model\Quote\Item; + +class ItemIdProcessorTest extends \PHPUnit_Framework_TestCase +{ + /** @var ItemIdProcessor */ + protected $model; + + public function setUp() + { + $this->model = new ItemIdProcessor(); + } + + /** + * @param int $itemId + * @param array $jsLayout + * @param array $result + * @dataProvider dataProviderProcess + */ + public function testProcess($itemId, array $jsLayout, array $result) + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + $itemMock->expects($this->any()) + ->method('getId') + ->willReturn($itemId); + + $this->assertEquals($result, $this->model->process($jsLayout, $itemMock)); + } + + public function dataProviderProcess() + { + return [ + [ + 12, + ['components' => []], + ['components' => []], + ], + [ + 21, + ['components' => ['giftOptionsCartItem' => []]], + ['components' => ['giftOptionsCartItem-21' => ['config' => ['itemId' => 21]]]], + ], + [ + 23, + ['components' => ['giftOptionsCartItem' => ['config' => ['key' => 'value']]]], + ['components' => ['giftOptionsCartItem-23' => ['config' => ['key' => 'value', 'itemId' => 23]]]], + ], + [ + 23, + ['components' => ['giftOptionsCartItem' => ['config' => ['key' => 'value'], 'key2' => 'value2']]], + [ + 'components' => [ + 'giftOptionsCartItem-23' => [ + 'config' => ['key' => 'value', 'itemId' => 23], 'key2' => 'value2' + ] + ] + ], + ], + ]; + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/CartRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/CartRepositoryTest.php index 6974c1f131cda2f511408dde59205c496619a7a1..2998ba06c7614c722c80bfc5e6a68abfc7266500 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Model/CartRepositoryTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/CartRepositoryTest.php @@ -4,9 +4,10 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\GiftMessage\Test\Unit\Model; +// @codingStandardsIgnoreFile + use Magento\GiftMessage\Model\CartRepository; class CartRepositoryTest extends \PHPUnit_Framework_TestCase diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageManagerTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageManagerTest.php index e44dca6dec3c1d412b24f7110c0a695893267aa6..e578198b12162cdef6f6e7035dce7e48596aa053 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageManagerTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageManagerTest.php @@ -48,16 +48,6 @@ class GiftMessageManagerTest extends \PHPUnit_Framework_TestCase */ protected $giftMessageMock; - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $billingAddressMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $shippingAddressMock; - protected function setUp() { $this->messageFactoryMock = @@ -131,10 +121,6 @@ class GiftMessageManagerTest extends \PHPUnit_Framework_TestCase '', false); - $this->billingAddressMock = - $this->getMock('\Magento\Sales\Model\Quote\Address', ['getCountryId', '__wakeup'], [], '', false); - $this->shippingAddressMock = - $this->getMock('\Magento\Sales\Model\Quote\Address', ['getCountryId', '__wakeup'], [], '', false); $this->model = new \Magento\GiftMessage\Model\GiftMessageManager($this->messageFactoryMock); } @@ -332,52 +318,12 @@ class GiftMessageManagerTest extends \PHPUnit_Framework_TestCase $this->model->add($giftMessages, $this->quoteMock); } - /** - * @expectedException \Magento\Framework\Exception\State\InvalidTransitionException - * @expectedExceptionMessage Billing address is not set - */ - public function testSetMessageEmptyBillingAddressException() - { - $this->quoteMock->expects($this->once()) - ->method('getBillingAddress') - ->will($this->returnValue($this->billingAddressMock)); - $this->billingAddressMock->expects($this->once())->method('getCountryId')->will($this->returnValue(null)); - - $this->model->setMessage($this->quoteMock, 'item', $this->giftMessageMock); - } - - /** - * @expectedException \Magento\Framework\Exception\State\InvalidTransitionException - * @expectedExceptionMessage Shipping address is not set - */ - public function testSetMessageEmptyShippingAddressException() - { - $this->quoteMock->expects($this->once()) - ->method('getBillingAddress') - ->will($this->returnValue($this->billingAddressMock)); - $this->billingAddressMock->expects($this->any())->method('getCountryId')->will($this->returnValue(12)); - $this->quoteMock->expects($this->once()) - ->method('getShippingAddress') - ->will($this->returnValue($this->shippingAddressMock)); - $this->shippingAddressMock->expects($this->any())->method('getCountryId')->will($this->returnValue(null)); - - $this->model->setMessage($this->quoteMock, 'item', $this->giftMessageMock); - } - /** * @expectedException \Magento\Framework\Exception\CouldNotSaveException * @expectedExceptionMessage Could not add gift message to shopping cart */ public function testSetMessageCouldNotAddGiftMessageException() { - $this->quoteMock->expects($this->once()) - ->method('getBillingAddress') - ->will($this->returnValue($this->billingAddressMock)); - $this->billingAddressMock->expects($this->once())->method('getCountryId')->will($this->returnValue(12)); - $this->quoteMock->expects($this->once()) - ->method('getShippingAddress') - ->will($this->returnValue($this->shippingAddressMock)); - $this->shippingAddressMock->expects($this->once())->method('getCountryId')->will($this->returnValue(13)); $this->giftMessageMock->expects($this->once())->method('getSender')->will($this->returnValue('sender')); $this->giftMessageMock->expects($this->once())->method('getRecipient')->will($this->returnValue('recipient')); $this->giftMessageMock->expects($this->once())->method('getMessage')->will($this->returnValue('Message')); @@ -388,5 +334,4 @@ class GiftMessageManagerTest extends \PHPUnit_Framework_TestCase $this->model->setMessage($this->quoteMock, 'item', $this->giftMessageMock); } - } diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8344cdd7541ee114dd203e62a4357fe93106344d --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php @@ -0,0 +1,122 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Model; + +// @codingStandardsIgnoreFile + +use Magento\GiftMessage\Api\Data\MessageInterface; +use Magento\GiftMessage\Model\ItemRepository; +use Magento\GiftMessage\Model\GuestItemRepository; +use Magento\Quote\Model\QuoteIdMask; +use Magento\Quote\Model\QuoteIdMaskFactory; + +class GuestCartRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var GuestItemRepository + */ + protected $model; + + /** + * @var ItemRepository|\PHPUnit_Framework_MockObject_MockObject + */ + protected $repositoryMock; + + /** + * @var QuoteIdMaskFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $quoteIdMaskFactoryMock; + + protected function setUp() + { + $this->repositoryMock = $this->getMockBuilder('Magento\GiftMessage\Model\ItemRepository') + ->disableOriginalConstructor() + ->getMock(); + + $this->quoteIdMaskFactoryMock = $this->getMockBuilder('Magento\Quote\Model\QuoteIdMaskFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMockForAbstractClass(); + + $this->model = new GuestItemRepository( + $this->repositoryMock, + $this->quoteIdMaskFactoryMock + ); + } + + public function testGet() + { + $cartId = 'jIUggbo76'; + $quoteId = 123; + $itemId = 234; + + /** @var QuoteIdMask|\PHPUnit_Framework_MockObject_MockObject $quoteIdMaskMock */ + $quoteIdMaskMock = $this->getMockBuilder('Magento\Quote\Model\QuoteIdMask') + ->setMethods(['getQuoteId', 'load']) + ->disableOriginalConstructor() + ->getMock(); + + $this->quoteIdMaskFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($quoteIdMaskMock); + + $quoteIdMaskMock->expects($this->once()) + ->method('load') + ->with($cartId, 'masked_id') + ->willReturnSelf(); + $quoteIdMaskMock->expects($this->once()) + ->method('getQuoteId') + ->willReturn($quoteId); + + /** @var MessageInterface|\PHPUnit_Framework_MockObject_MockObject $messageMock */ + $messageMock = $this->getMockBuilder('Magento\GiftMessage\Api\Data\MessageInterface') + ->getMockForAbstractClass(); + + $this->repositoryMock->expects($this->once()) + ->method('get') + ->with($quoteId, $itemId) + ->willReturn($messageMock); + + $this->assertEquals($messageMock, $this->model->get($cartId, $itemId)); + } + + public function testSave() + { + $cartId = 'jIUggbo76'; + $quoteId = 123; + $itemId = 234; + + /** @var QuoteIdMask|\PHPUnit_Framework_MockObject_MockObject $quoteIdMaskMock */ + $quoteIdMaskMock = $this->getMockBuilder('Magento\Quote\Model\QuoteIdMask') + ->setMethods(['getQuoteId', 'load']) + ->disableOriginalConstructor() + ->getMock(); + + $this->quoteIdMaskFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($quoteIdMaskMock); + + $quoteIdMaskMock->expects($this->once()) + ->method('load') + ->with($cartId, 'masked_id') + ->willReturnSelf(); + $quoteIdMaskMock->expects($this->once()) + ->method('getQuoteId') + ->willReturn($quoteId); + + /** @var MessageInterface|\PHPUnit_Framework_MockObject_MockObject $messageMock */ + $messageMock = $this->getMockBuilder('Magento\GiftMessage\Api\Data\MessageInterface') + ->getMockForAbstractClass(); + + $this->repositoryMock->expects($this->once()) + ->method('save') + ->with($quoteId, $messageMock, $itemId) + ->willReturn(true); + + $this->assertTrue($this->model->save($cartId, $messageMock, $itemId)); + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ec445ead2172ac058ed07506cd31d995d844593c --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php @@ -0,0 +1,225 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Model; + +// @codingStandardsIgnoreFile + +use Magento\GiftMessage\Model\ItemRepository; + +class GuestItemRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ItemRepository + */ + protected $itemRepository; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $quoteRepositoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $messageFactoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $quoteMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $messageMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $quoteItemMock; + + /** + * @var string + */ + protected $cartId = 13; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $giftMessageManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $helperMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $storeMock; + + protected function setUp() + { + $this->quoteRepositoryMock = $this->getMock('Magento\Quote\Model\QuoteRepository', [], [], '', false); + $this->messageFactoryMock = $this->getMock( + 'Magento\GiftMessage\Model\MessageFactory', + [ + 'create', + '__wakeup' + ], + [], + '', + false + ); + $this->messageMock = $this->getMock('Magento\GiftMessage\Model\Message', [], [], '', false); + $this->quoteItemMock = $this->getMock( + '\Magento\Qote\Model\Quote\Item', + [ + 'getGiftMessageId', + '__wakeup' + ], + [], + '', + false + ); + $this->quoteMock = $this->getMock( + '\Magento\Quote\Model\Quote', + [ + 'getGiftMessageId', + 'getItemById', + '__wakeup', + ], + [], + '', + false + ); + $this->storeManagerMock = $this->getMock('Magento\Store\Model\StoreManagerInterface'); + $this->giftMessageManagerMock = + $this->getMock('Magento\GiftMessage\Model\GiftMessageManager', [], [], '', false); + $this->helperMock = $this->getMock('Magento\GiftMessage\Helper\Message', [], [], '', false); + $this->storeMock = $this->getMock('Magento\Store\Model\Store', [], [], '', false); + $this->itemRepository = new \Magento\GiftMessage\Model\ItemRepository( + $this->quoteRepositoryMock, + $this->storeManagerMock, + $this->giftMessageManagerMock, + $this->helperMock, + $this->messageFactoryMock + ); + + $this->quoteRepositoryMock->expects($this->once()) + ->method('getActive') + ->with($this->cartId) + ->will($this->returnValue($this->quoteMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\NoSuchEntityException + * @expectedExceptionMessage There is no item with provided id in the cart + */ + public function testGetWithNoSuchEntityException() + { + $itemId = 2; + + $this->quoteMock->expects($this->once())->method('getItemById')->with($itemId)->will($this->returnValue(null)); + + $this->itemRepository->get($this->cartId, $itemId); + } + + public function testGetWithoutMessageId() + { + $messageId = 0; + $itemId = 2; + + $this->quoteMock->expects($this->once()) + ->method('getItemById') + ->with($itemId) + ->will($this->returnValue($this->quoteItemMock)); + $this->quoteItemMock->expects($this->once())->method('getGiftMessageId')->will($this->returnValue($messageId)); + + $this->assertNull($this->itemRepository->get($this->cartId, $itemId)); + } + + public function testGet() + { + $messageId = 123; + $itemId = 2; + + $this->quoteMock->expects($this->once()) + ->method('getItemById') + ->with($itemId) + ->will($this->returnValue($this->quoteItemMock)); + $this->quoteItemMock->expects($this->once())->method('getGiftMessageId')->will($this->returnValue($messageId)); + $this->messageFactoryMock->expects($this->once()) + ->method('create') + ->will($this->returnValue($this->messageMock)); + $this->messageMock->expects($this->once()) + ->method('load') + ->with($messageId) + ->will($this->returnValue($this->messageMock)); + + $this->assertEquals($this->messageMock, $this->itemRepository->get($this->cartId, $itemId)); + } + + /** + * @expectedException \Magento\Framework\Exception\NoSuchEntityException + * @expectedExceptionMessage There is no product with provided itemId: 1 in the cart + */ + public function testSaveWithNoSuchEntityException() + { + $itemId = 1; + + $this->quoteMock->expects($this->once())->method('getItemById')->with($itemId)->will($this->returnValue(null)); + + $this->itemRepository->save($this->cartId, $this->messageMock, $itemId); + } + + /** + * @expectedException \Magento\Framework\Exception\State\InvalidTransitionException + * @expectedExceptionMessage Gift Messages is not applicable for virtual products + */ + public function testSaveWithInvalidTransitionException() + { + $itemId = 1; + + $quoteItem = $this->getMock('\Magento\Sales\Model\Quote\Item', ['getIsVirtual', '__wakeup'], [], '', false); + $this->quoteMock->expects($this->once()) + ->method('getItemById') + ->with($itemId) + ->will($this->returnValue($quoteItem)); + $quoteItem->expects($this->once())->method('getIsVirtual')->will($this->returnValue(1)); + + $this->itemRepository->save($this->cartId, $this->messageMock, $itemId); + } + + public function testSave() + { + $itemId = 1; + + $quoteItem = $this->getMock('\Magento\Sales\Model\Quote\Item', ['getIsVirtual', '__wakeup'], [], '', false); + $this->quoteMock->expects($this->once()) + ->method('getItemById') + ->with($itemId) + ->will($this->returnValue($quoteItem)); + $quoteItem->expects($this->once())->method('getIsVirtual')->will($this->returnValue(0)); + $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock)); + $this->helperMock->expects($this->once()) + ->method('isMessagesAllowed') + ->with('items', $this->quoteMock, $this->storeMock) + ->will($this->returnValue(true)); + $this->giftMessageManagerMock->expects($this->once()) + ->method('setMessage') + ->with($this->quoteMock, 'quote_item', $this->messageMock, $itemId) + ->will($this->returnValue($this->giftMessageManagerMock)); + + $this->assertTrue($this->itemRepository->save($this->cartId, $this->messageMock, $itemId)); + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/ItemRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/ItemRepositoryTest.php index 5caa71f1b2bd2a492dc92b99c63c92970169d1bf..ed3f45fd157b4b63a7e747d3172c60e02921aafc 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Model/ItemRepositoryTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/ItemRepositoryTest.php @@ -4,9 +4,10 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\GiftMessage\Test\Unit\Model; +// @codingStandardsIgnoreFile + use Magento\GiftMessage\Model\ItemRepository; class ItemRepositoryTest extends \PHPUnit_Framework_TestCase diff --git a/app/code/Magento/GiftMessage/composer.json b/app/code/Magento/GiftMessage/composer.json index 2e2e4b6a8e46e6c2d9cb6a63e3b6a69c5ef0c69d..6159ad811b2306d08af85bd45cd0475e3ca56cfe 100644 --- a/app/code/Magento/GiftMessage/composer.json +++ b/app/code/Magento/GiftMessage/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-multishipping": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-multishipping": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GiftMessage/etc/di.xml b/app/code/Magento/GiftMessage/etc/di.xml index 6d3a903c6804546afbb95cc7805b746d5acd6e39..47a6c71f15a4028fed977849abe9e3f1e1221219 100644 --- a/app/code/Magento/GiftMessage/etc/di.xml +++ b/app/code/Magento/GiftMessage/etc/di.xml @@ -15,6 +15,8 @@ </type> <preference for="Magento\GiftMessage\Api\CartRepositoryInterface" type="Magento\GiftMessage\Model\CartRepository"/> <preference for="Magento\GiftMessage\Api\ItemRepositoryInterface" type="Magento\GiftMessage\Model\ItemRepository"/> + <preference for="Magento\GiftMessage\Api\GuestCartRepositoryInterface" type="Magento\GiftMessage\Model\GuestCartRepository"/> + <preference for="Magento\GiftMessage\Api\GuestItemRepositoryInterface" type="Magento\GiftMessage\Model\GuestItemRepository"/> <preference for="Magento\GiftMessage\Api\OrderRepositoryInterface" type="Magento\GiftMessage\Model\OrderRepository"/> <preference for="Magento\GiftMessage\Api\OrderItemRepositoryInterface" type="Magento\GiftMessage\Model\OrderItemRepository"/> <preference for="Magento\GiftMessage\Api\Data\MessageInterface" type="Magento\GiftMessage\Model\Message"/> @@ -26,7 +28,4 @@ <plugin name="save_gift_message" type="Magento\GiftMessage\Model\Plugin\OrderSave"/> <plugin name="get_gift_message" type="Magento\GiftMessage\Model\Plugin\OrderGet"/> </type> - <type name="\Magento\Quote\Model\Cart\TotalsAdditionalDataProcessor"> - <plugin name="gift_message_processor" type="Magento\GiftMessage\Model\Plugin\TotalsDataProcessorPlugin" /> - </type> </config> diff --git a/app/code/Magento/GiftMessage/etc/frontend/di.xml b/app/code/Magento/GiftMessage/etc/frontend/di.xml index 36f49a653bd335290781925b7db55593cbc5efe9..faa2f043fe6059d83e3bd1dc97f92c25f6553be9 100644 --- a/app/code/Magento/GiftMessage/etc/frontend/di.xml +++ b/app/code/Magento/GiftMessage/etc/frontend/di.xml @@ -29,11 +29,18 @@ <type name="Magento\Multishipping\Model\Checkout\Type\Multishipping"> <plugin name="save_gift_messages" type="Magento\GiftMessage\Model\Type\Plugin\Multishipping"/> </type> - <type name="Magento\Checkout\Model\CompositeConfigProvider"> + <type name="Magento\GiftMessage\Model\CompositeConfigProvider"> <arguments> <argument name="configProviders" xsi:type="array"> <item name="gift_message_config_provider" xsi:type="object">Magento\GiftMessage\Model\GiftMessageConfigProvider</item> </argument> </arguments> </type> + <type name="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions"> + <arguments> + <argument name="layoutProcessors" xsi:type="array"> + <item name="itemIdProcessor" xsi:type="object">Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\ItemIdProcessor</item> + </argument> + </arguments> + </type> </config> diff --git a/app/code/Magento/GiftMessage/etc/webapi.xml b/app/code/Magento/GiftMessage/etc/webapi.xml index c5dd571a7ac105813159525195c8074be14be8c6..bb0b2f0795634c0b1f798c27883a042dfdc72939 100644 --- a/app/code/Magento/GiftMessage/etc/webapi.xml +++ b/app/code/Magento/GiftMessage/etc/webapi.xml @@ -7,6 +7,7 @@ --> <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd"> + <!-- For authorized customer --> <route url="/V1/carts/:cartId/gift-message" method="GET"> <service class="Magento\GiftMessage\Api\CartRepositoryInterface" method="get"/> <resources> @@ -31,4 +32,68 @@ <resource ref="Magento_Sales::create" /> </resources> </route> + + <!-- For current customer --> + <route url="/V1/carts/mine/gift-message" method="GET"> + <service class="Magento\GiftMessage\Api\CartRepositoryInterface" method="get"/> + <resources> + <resource ref="self" /> + </resources> + <data> + <parameter name="cartId" force="true">%cart_id%</parameter> + </data> + </route> + <route url="/V1/carts/mine/gift-message/:itemId" method="GET"> + <service class="Magento\GiftMessage\Api\ItemRepositoryInterface" method="get"/> + <resources> + <resource ref="self" /> + </resources> + <data> + <parameter name="cartId" force="true">%cart_id%</parameter> + </data> + </route> + <route url="/V1/carts/mine/gift-message" method="POST"> + <service class="Magento\GiftMessage\Api\CartRepositoryInterface" method="save"/> + <resources> + <resource ref="self" /> + </resources> + <data> + <parameter name="cartId" force="true">%cart_id%</parameter> + </data> + </route> + <route url="/V1/carts/mine/gift-message/:itemId" method="POST"> + <service class="Magento\GiftMessage\Api\ItemRepositoryInterface" method="save"/> + <resources> + <resource ref="self" /> + </resources> + <data> + <parameter name="cartId" force="true">%cart_id%</parameter> + </data> + </route> + + <!-- For guests --> + <route url="/V1/guest-carts/:cartId/gift-message" method="GET"> + <service class="Magento\GiftMessage\Api\GuestCartRepositoryInterface" method="get"/> + <resources> + <resource ref="anonymous" /> + </resources> + </route> + <route url="/V1/guest-carts/:cartId/gift-message/:itemId" method="GET"> + <service class="Magento\GiftMessage\Api\GuestItemRepositoryInterface" method="get"/> + <resources> + <resource ref="anonymous" /> + </resources> + </route> + <route url="/V1/guest-carts/:cartId/gift-message" method="POST"> + <service class="Magento\GiftMessage\Api\GuestCartRepositoryInterface" method="save"/> + <resources> + <resource ref="anonymous" /> + </resources> + </route> + <route url="/V1/guest-carts/:cartId/gift-message/:itemId" method="POST"> + <service class="Magento\GiftMessage\Api\GuestItemRepositoryInterface" method="save"/> + <resources> + <resource ref="anonymous" /> + </resources> + </route> </routes> diff --git a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml new file mode 100644 index 0000000000000000000000000000000000000000..66e18b7a0f7f7ecb45b5e3ae98d5d2bc3b019cad --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> + <body> + <referenceBlock name="checkout.cart.order.actions"> + <block class="Magento\GiftMessage\Block\Cart\GiftOptions" name="checkout.cart.order.actions.gift_options" template="cart/gift_options.phtml" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCart" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + </body> +</page> diff --git a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_item_renderers.xml new file mode 100644 index 0000000000000000000000000000000000000000..b94cab5dace25517631f0034bdf5098ee867b64d --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_item_renderers.xml @@ -0,0 +1,119 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> + <body> + <referenceBlock name="checkout.cart.item.renderers.default.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.default.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.simple.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.simple.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.bundle.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.bundle.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.grouped.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.grouped.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.configurable.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.configurable.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.gift-card.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.gift-card.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + </body> +</page> diff --git a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_onepage_index.xml b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_onepage_index.xml deleted file mode 100644 index fbaba91cb60ea62a5639373e4b8af76e39a5e3e0..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_onepage_index.xml +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0"?> -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> - <body> - <referenceBlock name="checkout.root"> - <arguments> - <argument name="jsLayout" xsi:type="array"> - <item name="components" xsi:type="array"> - <item name="checkout" xsi:type="array"> - <item name="children" xsi:type="array"> - <item name="steps" xsi:type="array"> - <item name="children" xsi:type="array"> - <item name="shipping" xsi:type="array"> - <item name="children" xsi:type="array"> - <item name="additional" xsi:type="array"> - <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-options</item> - <item name="children" xsi:type="array"> - <item name="orderLevelGiftMessage" xsi:type="array"> - <item name="component" xsi:type="string">Magento_GiftMessage/js/view/order-level-gift-message</item> - </item> - <item name="itemLevelGiftMessage" xsi:type="array"> - <item name="component" xsi:type="string">Magento_GiftMessage/js/view/item-level-gift-message</item> - </item> - </item> - </item> - </item> - </item> - </item> - </item> - </item> - </item> - </item> - </argument> - </arguments> - </referenceBlock> - </body> -</page> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift_options.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift_options.phtml new file mode 100644 index 0000000000000000000000000000000000000000..af4d469a652daaa72c47a607c3769106254da609 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift_options.phtml @@ -0,0 +1,19 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +?> +<div id="gift-options-cart" data-bind="scope:'giftOptionsCart'"> + <!-- ko template: getTemplate() --><!-- /ko --> + <script type="text/x-magento-init"> + { + "#gift-options-cart": { + "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> + } + } + </script> + <script> + window.giftOptionsConfig = <?php echo $block->getGiftOptionsConfigJson(); ?>; + </script> +</div> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/Cart/item/renderer/actions/gift_options.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/item/renderer/actions/gift_options.phtml new file mode 100644 index 0000000000000000000000000000000000000000..10388eabe38174c6c1d0cc9fff8ede649067f860 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/item/renderer/actions/gift_options.phtml @@ -0,0 +1,24 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +/** @var $block \Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions */ +?> +<?php if (!$block->isVirtual()): ?> + <div id="gift-options-cart-item-<?php echo $block->getItem()->getId() ?>" + data-bind="scope:'giftOptionsCartItem-<?php echo $block->getItem()->getId() ?>'" + class="gift-options-cart-item"> + <!-- ko template: getTemplate() --><!-- /ko --> + <script type="text/x-magento-init"> + { + "#gift-options-cart-item-<?php echo $block->getItem()->getId() ?>": { + "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> + } + } + </script> + </div> +<?php endif ?> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/cart/gift_options.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/cart/gift_options.phtml new file mode 100644 index 0000000000000000000000000000000000000000..af4d469a652daaa72c47a607c3769106254da609 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/cart/gift_options.phtml @@ -0,0 +1,19 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +?> +<div id="gift-options-cart" data-bind="scope:'giftOptionsCart'"> + <!-- ko template: getTemplate() --><!-- /ko --> + <script type="text/x-magento-init"> + { + "#gift-options-cart": { + "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> + } + } + </script> + <script> + window.giftOptionsConfig = <?php echo $block->getGiftOptionsConfigJson(); ?>; + </script> +</div> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/cart/item/renderer/actions/gift_options.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/cart/item/renderer/actions/gift_options.phtml new file mode 100644 index 0000000000000000000000000000000000000000..10388eabe38174c6c1d0cc9fff8ede649067f860 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/cart/item/renderer/actions/gift_options.phtml @@ -0,0 +1,24 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +/** @var $block \Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions */ +?> +<?php if (!$block->isVirtual()): ?> + <div id="gift-options-cart-item-<?php echo $block->getItem()->getId() ?>" + data-bind="scope:'giftOptionsCartItem-<?php echo $block->getItem()->getId() ?>'" + class="gift-options-cart-item"> + <!-- ko template: getTemplate() --><!-- /ko --> + <script type="text/x-magento-init"> + { + "#gift-options-cart-item-<?php echo $block->getItem()->getId() ?>": { + "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> + } + } + </script> + </div> +<?php endif ?> diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/action/gift-options.js b/app/code/Magento/GiftMessage/view/frontend/web/js/action/gift-options.js new file mode 100644 index 0000000000000000000000000000000000000000..4896aeb00b5b87c57ad90cdcc86c26e68da0b794 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/action/gift-options.js @@ -0,0 +1,57 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/*global define*/ +define( + [ + '../model/url-builder', + 'mage/storage', + 'Magento_Ui/js/model/errorlist', + 'mage/url' + ], + function(urlBuilder, storage, errorList, url) { + "use strict"; + return function(giftMessage, remove) { + url.setBaseUrl(giftMessage.getConfigValue('baseUrl')); + var quoteId = giftMessage.getConfigValue('quoteId'); + var serviceUrl; + if (giftMessage.getConfigValue('isCustomerLoggedIn')) { + serviceUrl = urlBuilder.createUrl('/carts/mine/gift-message', {}); + if (giftMessage.itemId != 'orderLevel') { + serviceUrl = urlBuilder.createUrl('/carts/mine/gift-message/:itemId', {itemId: giftMessage.itemId}); + } + } else { + serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/gift-message', {cartId: quoteId}); + if (giftMessage.itemId != 'orderLevel') { + serviceUrl = urlBuilder.createUrl( + '/guest-carts/:cartId/gift-message/:itemId', + {cartId: quoteId, itemId: giftMessage.itemId} + ); + } + } + errorList.clear(); + + storage.post( + serviceUrl, + JSON.stringify({ + gift_message: giftMessage.getSubmitParams(remove) + }) + ).done( + function(result) { + giftMessage.reset(); + _.each(giftMessage.getAfterSubmitCallbacks(), function(callback) { + if (_.isFunction(callback)) { + callback(); + } + }); + } + ).fail( + function(response) { + var error = JSON.parse(response.responseText); + errorList.add(error); + } + ); + }; + } +); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message.js b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message.js index d5f0e072c77132c455ae521560f4c5f7522d92b7..ad91613b1364535ec43548e251bb46fefb67ec5f 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message.js +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message.js @@ -3,57 +3,107 @@ * See COPYING.txt for license details. */ /*global define*/ -define(['underscore', './gift-options'], - function(_, giftOptions) { +define(['Magento_Ui/js/lib/component/provider', 'underscore', 'mage/url'], + function (provider, _, url) { "use strict"; - var itemLevelDefaultMessages, orderLevelDefaultMessage, - isItemLevelGiftOptionsSelected = false, - isOrderLevelGiftOptionsSelected = false, - isGiftOptionsSelected = false; - if (giftOptions.isItemLevelGiftOptionsEnabled() && _.isObject(window.checkoutConfig.giftMessage.itemLevel)) { - itemLevelDefaultMessages = window.checkoutConfig.giftMessage.itemLevel; - isItemLevelGiftOptionsSelected = true; - isGiftOptionsSelected = true; - } - if (giftOptions.isOrderLevelGiftOptionsEnabled() && _.isObject(window.checkoutConfig.giftMessage.orderLevel)) { - orderLevelDefaultMessage = window.checkoutConfig.giftMessage.orderLevel; - isOrderLevelGiftOptionsSelected = true; - isGiftOptionsSelected = true; - } - return { - getDefaultMessageForItem: function(itemId) { - if (_.isObject(itemLevelDefaultMessages) && itemLevelDefaultMessages.hasOwnProperty(itemId)) { - return { - from: itemLevelDefaultMessages[itemId].sender, - to: itemLevelDefaultMessages[itemId].recipient, - message: itemLevelDefaultMessages[itemId].message - }; + return function (itemId) { + var model = { + id: 'message-' + itemId, + itemId: itemId, + observables: {}, + additionalOptions: [], + submitParams: [ + 'recipient', + 'sender', + 'message' + ], + initialize: function() { + this.getObservable('alreadyAdded')(false); + var message = false; + + if (this.itemId == 'orderLevel') { + message = window.giftOptionsConfig.giftMessage.hasOwnProperty(this.itemId) + ? window.giftOptionsConfig.giftMessage[this.itemId] + : null; + } else { + message = + window.giftOptionsConfig.giftMessage.hasOwnProperty('itemLevel') + && window.giftOptionsConfig.giftMessage['itemLevel'].hasOwnProperty(this.itemId) + ? window.giftOptionsConfig.giftMessage['itemLevel'][this.itemId] + : null; + } + if (_.isObject(message)) { + this.getObservable('recipient')(message.recipient); + this.getObservable('sender')(message.sender); + this.getObservable('message')(message.message); + this.getObservable('alreadyAdded')(true); + } + }, + getObservable: function(key) { + this.initObservable(this.id, key); + return provider[this.getUniqueKey(this.id, key)]; + }, + initObservable: function(node, key) { + if (node && !this.observables.hasOwnProperty(node)) { + this.observables[node] = []; + } + if (key && this.observables[node].indexOf(key) == -1) { + this.observables[node].push(key); + provider.observe(this.getUniqueKey(node, key)); + } + }, + getUniqueKey: function(node, key) { + return node + '-' + key; + }, + getConfigValue: function(key) { + return window.giftOptionsConfig.hasOwnProperty(key) ? + window.giftOptionsConfig[key] + : null; + }, + reset: function() { + this.getObservable('isClear')(true); + }, + getAfterSubmitCallbacks: function() { + var callbacks = []; + callbacks.push(this.afterSubmit); + _.each(this.additionalOptions, function(option) { + if (_.isFunction(option.afterSubmit)) { + callbacks.push(option.afterSubmit); + } + }); + return callbacks; + }, + afterSubmit: function() { + window.location.href = url.build('checkout/cart/updatePost') + + '?form_key=' + window.giftOptionsConfig.giftMessage.formKey + + '&cart[]'; + }, + getSubmitParams: function(remove) { + var params = {}, + self = this; + _.each(this.submitParams, function(key) { + var observable = provider[self.getUniqueKey(self.id, key)]; + if (_.isFunction(observable)) { + params[key] = remove ? null : observable(); + } + }); + + if(this.additionalOptions.length) { + params['extension_attributes'] = {}; + } + _.each(this.additionalOptions, function(option) { + if (_.isFunction(option.getSubmitParams)) { + params['extension_attributes'] = _.extend( + params['extension_attributes'], + option.getSubmitParams(remove) + ); + } + }); + return params; } - return { - from: null, to: null, message: null - }; - }, - getDefaultMessageForQuote: function() { - if (orderLevelDefaultMessage) { - return { - from: orderLevelDefaultMessage.sender, - to: orderLevelDefaultMessage.recipient, - message: orderLevelDefaultMessage.message - }; - } - return { - from: null, to: null, message: null - }; - }, - isGiftOptionsSelected: function() { - return isGiftOptionsSelected; - }, - isItemLevelGiftOptionsSelected: function() { - return isItemLevelGiftOptionsSelected; - }, - isOrderLevelGiftOptionsSelected: function() { - return isOrderLevelGiftOptionsSelected; - } - }; + }; + model.initialize(); + return model; + } } ); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options.js b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options.js index 000bf4b508e32c54442401024877cdb2e396279a..187f17e5b3962788ba0eb03a95858e4672d27c7b 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options.js +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options.js @@ -4,59 +4,18 @@ */ /*global define*/ define(['underscore'], - function(_) { + function (_) { "use strict"; - var isOrderLevelGiftOptionsEnabled = window.checkoutConfig.isOrderLevelGiftOptionsEnabled || false, - isItemLevelGiftOptionsEnabled = window.checkoutConfig.isItemLevelGiftOptionsEnabled || false; return { - orderLevelGiftOptions: [], - itemLevelGiftOptions: [], - extraGiftOptions: [], - isGiftOptionsAvailable: function() { - var isAvailable = isOrderLevelGiftOptionsEnabled || isItemLevelGiftOptionsEnabled; - - _.each(this.getExtraGiftOptions(), function(option){ - if (typeof option.isAvailable() === 'function') { - isAvailable = isAvailable || option.isAvailable(); - } - }); - - return isAvailable; - }, - isOrderLevelGiftOptionsEnabled: function() { - return isOrderLevelGiftOptionsEnabled; - }, - isItemLevelGiftOptionsEnabled: function() { - return isItemLevelGiftOptionsEnabled; - }, - getExtraGiftOptions: function() { - return this.getGiftOptions(this.extraGiftOptions); - }, - getOrderLevelGiftOptions: function() { - return this.getGiftOptions(this.orderLevelGiftOptions); - }, - getItemLevelGiftOptions: function() { - return this.getGiftOptions(this.itemLevelGiftOptions); - }, - getGiftOptions: function(options) { - return _.map( - _.sortBy(options, function(giftOption){ - return giftOption.sortOrder - }), - function(giftOption) { - return giftOption.option - } - ) - }, - setExtraGiftOptions: function (giftOption, sortOrder) { - this.extraGiftOptions.push({'option': giftOption, 'sortOrder': sortOrder}); - }, - addOrderLevelGiftOptions: function(giftOption, sortOrder) { - this.orderLevelGiftOptions.push({'option': giftOption, 'sortOrder': sortOrder}); - }, - addItemLevelGiftOptions: function(giftOption, sortOrder) { - this.itemLevelGiftOptions.push({'option': giftOption, 'sortOrder': sortOrder}); + options: [], + addOption: function(option) { + if(!this.options.hasOwnProperty(option.itemId)) { + this.options[option.itemId] = option; + } + }, + getOptionByItemId: function(itemId) { + return this.options.hasOwnProperty(itemId) ? this.options[itemId] : null; } - }; + } } ); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/model/url-builder.js b/app/code/Magento/GiftMessage/view/frontend/web/js/model/url-builder.js new file mode 100644 index 0000000000000000000000000000000000000000..ba62ba64f94d06356dc0bebffec378fb0b78c710 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/model/url-builder.js @@ -0,0 +1,38 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/*jshint browser:true jquery:true*/ +/*global alert*/ +define( + ['jquery'], + function($) { + return { + method: "rest", + storeCode: window.giftOptionsConfig.storeCode, + version: 'V1', + serviceUrl: ':method/:storeCode/:version', + + createUrl: function(url, params) { + var completeUrl = this.serviceUrl + url; + return this.bindParams(completeUrl, params); + }, + bindParams: function(url, params) { + params.method = this.method; + params.storeCode = this.storeCode; + params.version = this.version; + + var urlParts = url.split("/"); + urlParts = urlParts.filter(Boolean); + + $.each(urlParts, function(key, part) { + part = part.replace(':', ''); + if (params[part] != undefined) { + urlParts[key] = params[part]; + } + }); + return urlParts.join('/'); + } + }; + } +); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-message.js b/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-message.js new file mode 100644 index 0000000000000000000000000000000000000000..70a563cc3015afef902a93fff8471c40b255d5c9 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-message.js @@ -0,0 +1,78 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/*global define*/ +define(['uiComponent', '../model/gift-message', '../model/gift-options', '../action/gift-options'], + function (Component, giftMessage, giftOptions, giftOptionsService) { + "use strict"; + return Component.extend({ + formBlockVisibility: null, + resultBlockVisibility: null, + model: {}, + initialize: function() { + var self = this; + this._super() + .observe('formBlockVisibility') + .observe({'resultBlockVisibility': false}); + + this.itemId = this.itemId || 'orderLevel'; + var model = new giftMessage(this.itemId); + giftOptions.addOption(model); + this.model = model; + + this.model.getObservable('isClear').subscribe(function(value) { + if (value == true) { + self.formBlockVisibility(false); + self.model.getObservable('alreadyAdded')(true); + } + }); + + this.isResultBlockVisible(); + }, + isResultBlockVisible: function() { + var self = this; + if (this.model.getObservable('alreadyAdded')()) { + this.resultBlockVisibility(true); + } + this.model.getObservable('additionalOptionsApplied').subscribe(function(value) { + if (value == true) { + self.resultBlockVisibility(true); + } + }); + }, + getObservable: function(key) { + return this.model.getObservable(key); + }, + toggleFormBlockVisibility: function() { + if (!this.model.getObservable('alreadyAdded')()) { + this.formBlockVisibility(!this.formBlockVisibility()); + } + }, + editOptions: function() { + this.resultBlockVisibility(false); + this.formBlockVisibility(true); + }, + deleteOptions: function() { + giftOptionsService(this.model, true); + }, + hideFormBlock: function() { + this.formBlockVisibility(false); + if (this.model.getObservable('alreadyAdded')()) { + this.resultBlockVisibility(true); + } + }, + isActive: function() { + switch (this.itemId) { + case 'orderLevel': + return this.model.getConfigValue('isOrderLevelGiftOptionsEnabled') == true; + default: + return this.model.getConfigValue('isItemLevelGiftOptionsEnabled') == true; + } + }, + submitOptions: function() { + giftOptionsService(this.model); + } + }); + } +); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-options.js b/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-options.js deleted file mode 100644 index f216daa41a6090523acd22cf302ffafcbf40cbd1..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-options.js +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -/*global define*/ -define(['uiComponent', 'ko', '../model/gift-options', '../model/gift-message', 'Magento_Ui/js/model/errorlist'], - function (Component, ko, giftOptions, giftMessage, errorList) { - "use strict"; - - return Component.extend({ - defaults: { - template: 'Magento_GiftMessage/gift-options', - displayArea: 'shippingAdditional' - }, - options: [], - isGiftOptionsSelected: ko.observable(giftMessage.isGiftOptionsSelected()), - isOrderLevelGiftOptionsSelected: ko.observable(giftMessage.isOrderLevelGiftOptionsSelected()), - isItemLevelGiftOptionsSelected: ko.observable(giftMessage.isItemLevelGiftOptionsSelected()), - isGiftOptionsAvailable: function() { - return giftOptions.isGiftOptionsAvailable(); - }, - isOrderLevelGiftOptionsEnabled: function() { - return giftOptions.isOrderLevelGiftOptionsEnabled(); - }, - isItemLevelGiftOptionsEnabled: function() { - return giftOptions.isItemLevelGiftOptionsEnabled(); - }, - getOrderLevelGiftOptions: function() { - return this.filterOptions(giftOptions.getOrderLevelGiftOptions()); - }, - getItemLevelGiftOptions: function() { - return this.filterOptions(giftOptions.getItemLevelGiftOptions()); - }, - getExtraGiftOptions: function() { - return this.filterOptions(giftOptions.getExtraGiftOptions()); - }, - filterOptions: function(options) { - return _.filter(options, function(option) { - var result = true; - if (option.isDirectRendering !== 'undefined') { - result = !option.isDirectRendering; - } - return result; - } - ); - }, - collectOptions: function(giftOption, additionalFlag) { - if (!this.isAvailableForSubmiting(giftOption)) { - return false; - } - var self = this; - if (giftOption.optionType === 'undefined') { - errorList.add('You should define type of your custom option'); - } - - if (!this.options.hasOwnProperty(giftOption.optionType)) { - this.options[giftOption.optionType] = []; - } - - _.each(giftOption.submit(additionalFlag), function(optionItem) { - self.options[giftOption.optionType].push(optionItem); - }); - }, - isAvailableForSubmiting: function(option) { - return typeof option.isSubmit == 'undefined' || option.isSubmit ? true : false; - }, - submit: function() { - var self = this; - - var removeOrder = giftOptions.isItemLevelGiftOptionsEnabled() && this.isOrderLevelGiftOptionsEnabled() - && (!this.isGiftOptionsSelected() || !this.isOrderLevelGiftOptionsSelected()) - ? true - : false; - _.each(giftOptions.getOrderLevelGiftOptions(), function(option) { - self.collectOptions(option, removeOrder); - }); - - var removeItem = giftOptions.isItemLevelGiftOptionsEnabled() && this.isItemLevelGiftOptionsEnabled() - && (!this.isGiftOptionsSelected() || !this.isItemLevelGiftOptionsSelected()) - ? true - : false; - _.each(giftOptions.getItemLevelGiftOptions(), function(option) { - self.collectOptions(option, removeItem); - }); - - _.each(giftOptions.getExtraGiftOptions(), function(option) { - self.collectOptions(option); - }); - - var result = this.options; - this.options = []; - return result; - } - }); - } -); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/view/item-level-gift-message.js b/app/code/Magento/GiftMessage/view/frontend/web/js/view/item-level-gift-message.js deleted file mode 100644 index 05ef405b1feaa037798fe7f74912222cee74f0c9..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/view/item-level-gift-message.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -/*global define*/ -define(['uiComponent', 'ko', '../model/gift-options', 'Magento_Checkout/js/model/quote', '../model/gift-message'], - function (Component, ko, giftOptions, quote, giftMessage) { - "use strict"; - return Component.extend({ - defaults: { - template: 'Magento_GiftMessage/item-level-gift-message', - displayArea: 'itemLevelGiftMessage' - }, - messages: {}, - quoteItems: [], - quoteItemsCount: 0, - imagePlaceholder: window.checkoutConfig.staticBaseUrl + - '/frontend/Magento/blank/en_US/Magento_Catalog/images/product/placeholder/thumbnail.jpg', - optionType: 'gift_messages', - initialize: function() { - var item, - that = this, - quoteItems = quote.getItems(); - quote.getShippingAddress().subscribe(function(shippingAddress) { - var name = shippingAddress.firstname + ' ' + shippingAddress.lastname; - for (item in quoteItems) { - if (quoteItems.hasOwnProperty(item)) { - if (quoteItems[item].is_virtual === '0') { - var itemId = quoteItems[item].item_id; - that.messages[itemId] = { - from: ko.observable(giftMessage.getDefaultMessageForItem(itemId).from || name), - to: ko.observable(giftMessage.getDefaultMessageForItem(itemId).to || name), - message: ko.observable(giftMessage.getDefaultMessageForItem(itemId).message) - }; - quoteItems[item].isItemLevelGiftMessageVisible = ko.observable(false); - that.quoteItems.push(quoteItems[item]); - } - } - } - that.quoteItemsCount = that.quoteItems.length; - this.dispose(); - }); - this._super(); - giftOptions.addItemLevelGiftOptions(this); - }, - itemImages: ko.observableArray(), - setItemLevelGiftMessageHidden: function(data, event) { - event.preventDefault(); - if (data.hasOwnProperty('item_id')) { - this.isItemLevelGiftMessageVisible(!this.isItemLevelGiftMessageVisible()); - } - }, - submit: function(remove) { - remove = remove || false; - var itemId, - giftMessages = [], - that = this; - for (itemId in this.messages) { - if (that.messages.hasOwnProperty(itemId)) { - if (that.messages[itemId].message() !== null) { - giftMessages.push({ - sender: remove ? null : that.messages[itemId].from(), - recipient: remove ? null : that.messages[itemId].to(), - message: remove ? null : that.messages[itemId].message(), - extension_attributes: { - entity_id: itemId, - entity_type: 'item' - } - }); - } - } - } - return giftMessages; - } - }); - } -); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/view/order-level-gift-message.js b/app/code/Magento/GiftMessage/view/frontend/web/js/view/order-level-gift-message.js deleted file mode 100644 index 277f17a2b4277a61e30d6d9d9ac462f5fe4c2379..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/view/order-level-gift-message.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -/*global define*/ -define([ - 'uiComponent', - 'ko', - '../model/gift-options', - 'Magento_Checkout/js/model/quote', - '../model/gift-message' - ], - function (Component, ko, giftOptions, quote, giftMessage) { - "use strict"; - return Component.extend({ - defaults: { - template: 'Magento_GiftMessage/order-level-gift-message', - displayArea: 'orderLevelGiftMessage' - }, - message: {}, - optionType: 'gift_messages', - initialize: function() { - var that = this; - quote.getShippingAddress().subscribe(function(shippingAddress) { - var customerName = shippingAddress.firstname + ' ' + shippingAddress.lastname; - that.message = { - from: ko.observable(giftMessage.getDefaultMessageForQuote().from || customerName), - to: ko.observable(giftMessage.getDefaultMessageForQuote().to || customerName), - message: ko.observable(giftMessage.getDefaultMessageForQuote().message) - }; - this.dispose(); - }); - this._super(); - giftOptions.addOrderLevelGiftOptions(this, 10); - }, - isOrderLevelGiftMessageVisible: ko.observable(false), - setOrderLevelGiftMessageVisible: function(data, event) { - event.preventDefault(); - this.isOrderLevelGiftMessageVisible(!this.isOrderLevelGiftMessageVisible()); - }, - quoteId: quote.entity_id, - submit: function(remove) { - remove = remove || false; - if (this.message.message() !== null) { - return [{ - sender: remove ? null : this.message.from(), - recipient: remove ? null : this.message.to(), - message: remove ? null : this.message.message(), - extension_attributes: { - entity_id: this.quoteId, - entity_type: 'quote' - } - }]; - } - return []; - } - }); - } -); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-form.html b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-form.html new file mode 100644 index 0000000000000000000000000000000000000000..31cbc7e111aaee3a5b8a9191a68adb43010a45e7 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-form.html @@ -0,0 +1,63 @@ +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<div class="gift-message"> + <div class="gift-options-title"> + <span data-bind="text: $t('Gift Message (optional)')"></span> + </div> + <div class="gift-options-content"> + <fieldset class="fieldset"> + <div class="field field-to"> + <label for="gift-message-whole-to" class="label"> + <span data-bind="text: $t('To') + ':'"></span> + </label> + <div class="control"> + <input type="text" + id="gift-message-whole-to" + class="input-text" + data-bind="value: getObservable('recipient')"> + </div> + </div> + + <div class="field field-from"> + <label for="gift-message-whole-from" class="label"> + <span data-bind="text: $t('From') + ':'"></span> + </label> + <div class="control"> + <input type="text" + id="gift-message-whole-from" + class="input-text" + data-bind="value: getObservable('sender')"> + </div> + </div> + <div class="field text"> + <label for="gift-message-whole-message" class="label"> + <span data-bind="text: $t('Message') + ':'"></span> + </label> + <div class="control"> + <textarea id="gift-message-whole-message" + class="input-text" + rows="5" cols="10" + data-bind="value: getObservable('message')"></textarea> + </div> + </div> + </fieldset> + <div class="actions-toolbar"> + <div class="secondary"> + <button type="submit" class="action secondary action-update" data-bind=" + attr: {title: $t('Update')}, + click: $data.submitOptions.bind($data)"> + <span data-bind="text: $t('Update')"></span> + </button> + <button class="action action-cancel" data-bind=" + attr: {title: $t('Cancel')}, + click: $data.hideFormBlock.bind($data)"> + <span data-bind="text: $t('Cancel')"></span> + </button> + </div> + </div> + </div> +</div> \ No newline at end of file diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-item-level.html b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-item-level.html new file mode 100644 index 0000000000000000000000000000000000000000..78f2175867b72a3991912eeda796bd7aff3615ef --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-item-level.html @@ -0,0 +1,55 @@ +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + --> +<!-- ko if: isActive() --> +<a href="#" + class="action action-gift" + data-bind=" + click: $data.toggleFormBlockVisibility.bind($data), + css: {_active: formBlockVisibility() || resultBlockVisibility()} + "> + <span data-bind="text: $t('Gift options')"></span> +</a> +<div class="gift-content" data-bind="css: {_active: formBlockVisibility() || resultBlockVisibility()}"> <!-- add class "active" to display the content --> + <!-- ko ifnot: resultBlockVisibility() --> + <div class="gift-options"> + <!-- ko foreach: getRegion('additionalOptions') --> + <!-- ko template: getTemplate() --><!-- /ko --> + <!-- /ko --> + <!-- ko template: formTemplate --><!--/ko--> + </div> + <!-- /ko --> + <!-- ko if: resultBlockVisibility() --> + <div class="gift-summary"> + <!-- ko foreach: getRegion('additionalOptions') --> + <!--ko template: appliedTemplate --><!-- /ko --> + <!-- /ko --> + + <!-- ko if: getObservable('message') --> + <div class="gift-message-summary"> + <span data-bind="text: $t('Message') + ':'"></span> + <!-- ko text: getObservable('message') --><!-- /ko --> + </div> + <!-- /ko --> + + <div class="actions-toolbar"> + <div class="secondary"> + <button type="submit" class="action action-edit" data-bind=" + click: $data.editOptions.bind($data), + attr: {title: $t('Edit')"> + <span data-bind="text: $t('Edit')"></span> + </button> + <button class="action action-delete" data-bind=" + click: $data.deleteOptions.bind($data), + attr: {title: $t('Delete')"> + <span data-bind="text: $t('Delete')"></span> + </button> + </div> + </div> + </div> + <!-- /ko --> +</div> +<!-- /ko --> diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html new file mode 100644 index 0000000000000000000000000000000000000000..dbe0ee8c877cd04fc9c25d5e3ab332ecbbb0a916 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html @@ -0,0 +1,54 @@ +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<!-- ko if: isActive() --> +<div class="cart-gift-item"> + <div class="gift-item-block block" + data-collapsible="true" + data-bind="css: {_active: formBlockVisibility() || resultBlockVisibility()}"> + <div class="title" data-role="title" data-bind="click: $data.toggleFormBlockVisibility.bind($data)"> + <span data-bind="text: $t('Gift options')"></span> + </div> + <div class="content" data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()"> + <!-- ko ifnot: resultBlockVisibility() --> + <div class="gift-options"> + <!-- ko foreach: getRegion('additionalOptions') --> + <!-- ko template: getTemplate() --><!-- /ko --> + <!-- /ko --> + <!-- ko template: formTemplate --><!--/ko--> + </div> + <!-- /ko --> + <div class="gift-summary"> + <!-- ko if: resultBlockVisibility() --> + <!-- ko foreach: getRegion('additionalOptions') --> + <!--ko template: appliedTemplate --><!-- /ko --> + <!-- /ko --> + + <!-- ko if: getObservable('message') --> + <div class="gift-message-summary"> + <span data-bind="text: $t('Message') + ':'"></span> + <!-- ko text: getObservable('message') --><!-- /ko --> + </div> + <!-- /ko --> + <div class="actions-toolbar"> + <div class="secondary"> + <button type="submit" + class="action action-edit" + data-bind="attr: {title: $t('Edit')}, click: $data.editOptions.bind($data)"> + <span data-bind="text: $t('Edit')"></span> + </button> + <button class="action action-delete" + data-bind="attr: {title: $t('Delete')}, click: $data.deleteOptions.bind($data)"> + <span data-bind="text: $t('Delete')"></span> + </button> + </div> + </div> + <!-- /ko --> + </div> + </div> + </div> +</div> +<!-- /ko --> diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-options.html b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-options.html deleted file mode 100644 index 02b2c1d5f03c0105ae4ce29fbadb27979998c578..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-options.html +++ /dev/null @@ -1,42 +0,0 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<fieldset class="fieldset gift-message" data-bind="visible: isGiftOptionsAvailable()"> - <legend class="legend"><span data-bind="text: $t('Do you have any gift items in your order?')"></span></legend><br> - <div class="field choice"> - <input type="checkbox" name="allow_gift_options" id="allow_gift_options" class="checkbox" data-bind="checked: isGiftOptionsSelected"> - <label for="allow_gift_options" class="label"><span data-bind="text: $t('Add gift options')"></span></label> - </div> - <dl class="options-items" id="allow-gift-options-container" data-bind="visible: isGiftOptionsSelected"> - <dt id="add-gift-options-for-order" class="order-title" data-bind="visible: isOrderLevelGiftOptionsEnabled()"> - <div class="field choice"> - <input type="checkbox" name="allow_gift_messages_for_order" id="allow_gift_options_for_order" class="checkbox" data-bind="checked: isOrderLevelGiftOptionsSelected"> - <label for="allow_gift_options_for_order" class="label"><span data-bind="text: $t('Gift Options for the Entire Order')"></span></label> - </div> - <dd id="allow-gift-options-for-order-container" class="order-options" style="display: block;" data-bind="visible: isOrderLevelGiftOptionsSelected"> - <!-- ko foreach: getOrderLevelGiftOptions() --> - <!-- ko template: getTemplate() --><!-- /ko --> - <!-- /ko --> - </dd> - </dt> - <dt id="add-gift-options-for-items" class="order-title individual" data-bind="visible: isItemLevelGiftOptionsEnabled()"> - <div class="field choice"> - <input type="checkbox" name="allow_gift_options_for_items" id="allow_gift_options_for_items" class="checkbox" data-bind="checked: isItemLevelGiftOptionsSelected"> - <label for="allow_gift_options_for_items" class="label"><span data-bind="text: $t('Gift Options for Individual Items')"></span></label> - </div> - <dd id="allow-gift-options-for-items-container" class="order-options individual" style="display: block;" data-bind="visible: isItemLevelGiftOptionsSelected"> - <!-- ko foreach: getItemLevelGiftOptions() --> - <!-- ko template: getTemplate() --><!-- /ko --> - <!-- /ko --> - </dd> - </dt> - <dt id="extra-options-container" class="extra-options-container"> - <!-- ko foreach: getExtraGiftOptions() --> - <!-- ko template: getTemplate() --><!-- /ko --> - <!-- /ko --> - </dt> - </dl> -</fieldset> diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/item-level-gift-message.html b/app/code/Magento/GiftMessage/view/frontend/web/template/item-level-gift-message.html deleted file mode 100644 index 83432afd48fa1f7cbe1056731e685db57cd1374e..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/item-level-gift-message.html +++ /dev/null @@ -1,76 +0,0 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<ol class="items" data-bind="foreach: quoteItems"> - <li class="item"> - <div class="product"> - <div class="number"> - <span> - <!-- ko text: $t('Item') --><!-- /ko --> - <!-- ko text: ($index() + 1) --><!-- /ko --> - </span> - <!-- ko text: $t('of') --><!-- /ko --> - <!-- ko text: $parent.quoteItemsCount --><!-- /ko --> - </div> - <div class="img photo container"> - <span class="product-image-container" style="width:100px;"> - <span class="product-image-wrapper" style="padding-bottom: 100%;"> - <img class="product-image-photo" data-bind="attr: {src: thumbnail || $parent.imagePlaceholder, alt: name}"> - </span> - </span> - </div> - <strong class="product name" style="width:100px;" data-bind="text: name"></strong> - </div> - <div class="options"> - <!-- <div class="options-items-container"></div> --> - <!--ko foreach: $parent.getRegion('item-level-additional-data') --> - <!--ko template: getTemplate() --><!--/ko --> - <!--/ko --> - <a href="#" class="action activate message" data-bind="click: $parent.setItemLevelGiftMessageHidden, text: $t('Gift Message')"></a> - <div id="gift-messages-for-item-container" class="block message" data-bind="visible: isItemLevelGiftMessageVisible"> - <fieldset class="fieldset"> - <p data-bind="text: $t('Leave a box blank if you don\'t want to add a gift message for that item.')"></p> - <div class="field from"> - <label class="label" data-bind="attr: {for: 'gift-message-' + item_id + '-from'}"><span data-bind="text: $t('From')"></span></label> - <div class="control"> - <input type="text" title="From" class="input-text" data-bind=" - value: $parent.messages[item_id].from, - attr: { - name: 'giftmessage[quote_item][' + item_id + '][from]', - id: 'gift-message-' + item_id + '-from' - } - "> - </div> - </div> - <div class="field to"> - <label class="label" data-bind="attr: {for: 'gift-message-' + item_id + '-to'}"><span data-bind="text: $t('To')"></span></label> - <div class="control"> - <input type="text" title="To" class="input-text" data-bind=" - value: $parent.messages[item_id].to, - attr: { - name: 'giftmessage[quote_item][' + item_id + '][to]', - id: 'gift-message-' + item_id + '-to' - } - "> - </div> - </div> - <div class="field text"> - <label class="label" data-bind="attr: {for: 'gift-message-' + item_id + '-message'}"><span data-bind="text: $t('Message')"></span></label> - <div class="control"> - <textarea class="input-text giftmessage-area" title="Message" rows="5" cols="40" data-bind=" - value: $parent.messages[item_id].message, - attr: { - id: 'gift-message-' + item_id + '-message', - name: 'giftmessage[quote_item][' + item_id + '][message]' - } - "></textarea> - </div> - </div> - </fieldset> - </div> - </div> - </li> -</ol> diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/order-level-gift-message.html b/app/code/Magento/GiftMessage/view/frontend/web/template/order-level-gift-message.html deleted file mode 100644 index fc9be980c704a7e3dfcf8743e87ed4b2e78fa347..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/order-level-gift-message.html +++ /dev/null @@ -1,49 +0,0 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<!-- -<div class="options-order-container" id="options-order-container-1"></div> ---> -<a href="#" class="action activate message" data-bind="click: setOrderLevelGiftMessageVisible, text: $t('Gift Message')"></a> -<div id="allow-gift-messages-for-order-container" class="gift-messages-order" data-bind="visible: isOrderLevelGiftMessageVisible"> - <fieldset class="fieldset"> - <p data-bind="text: $t('Leave this box blank if you don\'t want to leave a gift message for the entire order.')"></p> - <div class="field from"> - <label for="gift-message-whole-from" class="label"><span data-bind="text: $t('From')"></span></label> - <div class="control"> - <input type="text" id="gift-message-whole-from" title="From" class="input-text" data-bind=" - value: message.from, - attr: { - name: 'giftmessage[quote][' + quoteId + '][from]' - } - "> - </div> - </div> - <div class="field to"> - <label for="gift-message-whole-to" class="label"><span data-bind="text: $t('To')"></span></label> - <div class="control"> - <input type="text" id="gift-message-whole-to" title="To" class="input-text" data-bind=" - value: message.to, - attr: { - name: 'giftmessage[quote][' + quoteId + '][to]' - } - "> - </div> - </div> - <div class="field text"> - <label for="gift-message-whole-message" class="label"><span data-bind="text: $t('Message')"></span></label> - <div class="control"> - <textarea id="gift-message-whole-message" class="input-text" title="Message" rows="5" cols="10" data-bind=" - value: message.message, - attr: { - name: 'giftmessage[quote][' + quoteId + '][message]' - } - "> - </textarea> - </div> - </div> - </fieldset> -</div> diff --git a/app/code/Magento/GoogleAdwords/composer.json b/app/code/Magento/GoogleAdwords/composer.json index 304cc1bf791158d545194f29f2c3be44a9b8c097..5cc77002b47154ceced14a609d6e0d41282926d7 100644 --- a/app/code/Magento/GoogleAdwords/composer.json +++ b/app/code/Magento/GoogleAdwords/composer.json @@ -3,13 +3,13 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GoogleAnalytics/composer.json b/app/code/Magento/GoogleAnalytics/composer.json index 92aee5dbd021df882f73761a6b368c905fdcc83e..09c1724be6bc16c662205bef182abc2a677a37b0 100644 --- a/app/code/Magento/GoogleAnalytics/composer.json +++ b/app/code/Magento/GoogleAnalytics/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-cookie": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-cookie": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GoogleOptimizer/composer.json b/app/code/Magento/GoogleOptimizer/composer.json index f046d154cbcf7acf581a241c374e026df489efc2..97573703a09a74e685922b0b3948f6af8e30aa73 100644 --- a/app/code/Magento/GoogleOptimizer/composer.json +++ b/app/code/Magento/GoogleOptimizer/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-google-analytics": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-google-analytics": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GoogleShopping/composer.json b/app/code/Magento/GoogleShopping/composer.json index 564c50bd7a9c4929da303ab754797a91b5c26994..1e2387799214e5b48fe356487cc1ea18ce2d030f 100644 --- a/app/code/Magento/GoogleShopping/composer.json +++ b/app/code/Magento/GoogleShopping/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GroupedImportExport/composer.json b/app/code/Magento/GroupedImportExport/composer.json index d17ec6ec9e8dfa34f60b13a34725d2c7fea5abca..33a57b24cb7193f6bb5f3b2f0eef591837005946 100644 --- a/app/code/Magento/GroupedImportExport/composer.json +++ b/app/code/Magento/GroupedImportExport/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-catalog-import-export": "0.74.0-beta13", - "magento/module-grouped-product": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-catalog-import-export": "0.74.0-beta14", + "magento/module-grouped-product": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GroupedProduct/Model/Resource/Product/Indexer/Price/Grouped.php b/app/code/Magento/GroupedProduct/Model/Resource/Product/Indexer/Price/Grouped.php index 1aa5d99953baecbd2efc8ca05b4a9d961d5fb70e..78155ac89acefd03b022fec7e2f7cb7fc1c70b3f 100644 --- a/app/code/Magento/GroupedProduct/Model/Resource/Product/Indexer/Price/Grouped.php +++ b/app/code/Magento/GroupedProduct/Model/Resource/Product/Indexer/Price/Grouped.php @@ -17,7 +17,7 @@ class Grouped extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defa */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->_prepareGroupedProductPriceData(); diff --git a/app/code/Magento/GroupedProduct/composer.json b/app/code/Magento/GroupedProduct/composer.json index d108bccbced3c09fa8991ae13fbf15296e7075f4..4ee6e8762d9b6760ce1ad74e9978af483e913f0d 100644 --- a/app/code/Magento/GroupedProduct/composer.json +++ b/app/code/Magento/GroupedProduct/composer.json @@ -3,22 +3,22 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/module-msrp": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/module-msrp": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GroupedProduct/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/GroupedProduct/view/frontend/layout/checkout_cart_item_renderers.xml index c9021d6bcbd8fbd461cd9463b53bdad518f63203..8044a857c6a3e8863fc2f4299ebc39eb564b7793 100644 --- a/app/code/Magento/GroupedProduct/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/GroupedProduct/view/frontend/layout/checkout_cart_item_renderers.xml @@ -8,7 +8,12 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\GroupedProduct\Block\Cart\Item\Renderer\Grouped" as="grouped" template="Magento_Checkout::cart/item/default.phtml"/> + <block class="Magento\GroupedProduct\Block\Cart\Item\Renderer\Grouped" as="grouped" template="Magento_Checkout::cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.grouped.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.grouped.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.grouped.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/ImportExport/composer.json b/app/code/Magento/ImportExport/composer.json index e7cbb957d07e0c2be37df045848e2ba04994930c..e5e58f1eeb8b2d8329b2789124b0a372ca75ef3a 100644 --- a/app/code/Magento/ImportExport/composer.json +++ b/app/code/Magento/ImportExport/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "ext-ctype": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php b/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php new file mode 100644 index 0000000000000000000000000000000000000000..2d6c154a2a707879fc47cd6bd5720806b2e96733 --- /dev/null +++ b/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php @@ -0,0 +1,77 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Indexer\Model\Indexer\Table; + +/** + * Class Strategy + * @package Magento\Indexer + */ +class Strategy implements StrategyInterface +{ + /** + * Application resource + * + * @var \Magento\Framework\App\Resource + */ + protected $resource; + + /** + * Constructor + * + * @param \Magento\Framework\App\Resource $resource + */ + public function __construct( + \Magento\Framework\App\Resource $resource + ) { + $this->resource = $resource; + } + + /** + * Use index table directly + * + * @var bool + */ + protected $useIdxTable = false; + + /** + * {@inheritdoc} + */ + public function getUseIdxTable() + { + return $this->useIdxTable; + } + + /** + * {@inheritdoc} + */ + public function setUseIdxTable($value = false) + { + $this->useIdxTable = (bool) $value; + return $this; + } + + /** + * {@inheritdoc} + */ + public function getTableName($tablePrefix) + { + return $this->resource->getTableName($this->prepareTableName($tablePrefix)); + } + + /** + * Prepare index table name + * + * @param string $tablePrefix + * + * @return string + */ + public function prepareTableName($tablePrefix) + { + return $this->getUseIdxTable() + ? $tablePrefix . self::IDX_SUFFIX + : $tablePrefix . self::TMP_SUFFIX; + } +} diff --git a/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php b/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..c1693ceb44cd47f8a7d7e7de2649e6264985ad77 --- /dev/null +++ b/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php @@ -0,0 +1,53 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Indexer\Model\Indexer\Table; + +/** + * Interface StrategyInterface + * @package Magento\Indexer + */ +interface StrategyInterface +{ + const IDX_SUFFIX = '_idx'; + + const TMP_SUFFIX = '_tmp'; + + /** + * Get IDX table usage flag + * + * @return bool + * @SuppressWarnings(PHPMD.BooleanGetMethodName) + */ + public function getUseIdxTable(); + + /** + * Set IDX table usage flag + * + * @param bool $value + * + * @return $this + */ + public function setUseIdxTable($value = false); + + /** + * Prepare index table name + * + * @param string $tablePrefix + * + * @return string + */ + public function prepareTableName($tablePrefix); + + /** + * Returns target table name + * + * @param string $tablePrefix + * + * @return string + */ + public function getTableName($tablePrefix); +} diff --git a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php index 9fa80dac9e76571bf9a4153cce3e255206499767..aeccf684e6a22fef89ab314648d073bb94e35286 100644 --- a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php +++ b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php @@ -16,16 +16,28 @@ use Magento\Framework\DB\Select; abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\AbstractDb { - const IDX_SUFFIX = '_idx'; - - const TMP_SUFFIX = '_tmp'; + /** + * Constructor + * + * @var \Magento\Indexer\Model\Indexer\Table\StrategyInterface + */ + protected $tableStrategy; /** - * Flag that defines if need to use "_idx" index table suffix instead of "_tmp" + * Class constructor * - * @var bool + * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy + * @param null $resourcePrefix */ - protected $_isNeedUseIdxTable = false; + public function __construct( + \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, + $resourcePrefix = null + ) { + $this->tableStrategy = $tableStrategy; + parent::__construct($context, $resourcePrefix); + } /** * Reindex all @@ -34,7 +46,7 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); return $this; } @@ -56,14 +68,10 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs */ public function getIdxTable($table = null) { - $suffix = self::TMP_SUFFIX; - if ($this->_isNeedUseIdxTable) { - $suffix = self::IDX_SUFFIX; - } if ($table) { - return $table . $suffix; + return $this->tableStrategy->prepareTableName($table); } - return $this->getMainTable() . $suffix; + return $this->tableStrategy->prepareTableName($this->getMainTable()); } /** @@ -155,20 +163,6 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs return $this; } - /** - * Set or get what either "_idx" or "_tmp" suffixed temporary index table need to use - * - * @param bool $value - * @return bool - */ - public function useIdxTable($value = null) - { - if ($value !== null) { - $this->_isNeedUseIdxTable = (bool)$value; - } - return $this->_isNeedUseIdxTable; - } - /** * Clean up temporary index table * diff --git a/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php b/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6aed194580dc6f9168d2f9bde635f315180daafe --- /dev/null +++ b/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php @@ -0,0 +1,94 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Indexer\Test\Unit\Model\Indexer\Table; + +/** + * Class StrategyTest + * @package Magento\Indexer\Test\Unit\Model\Indexer\Table + */ +class StrategyTest extends \PHPUnit_Framework_TestCase +{ + /** + * Strategy object + * + * @var \Magento\Indexer\Model\Indexer\Table\Strategy + */ + protected $_model; + + /** + * Resource mock + * + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $_resourceMock; + + /** + * {@inheritdoc} + */ + protected function setUp() + { + $this->_resourceMock = $this->getMock( + '\Magento\Framework\App\Resource', + [], + [], + '', + false + ); + $this->_model = new \Magento\Indexer\Model\Indexer\Table\Strategy( + $this->_resourceMock + ); + } + + /** + * Test use idx table switcher + * + * @return void + */ + public function testUseIdxTable() + { + $this->assertEquals(false, $this->_model->getUseIdxTable()); + $this->_model->setUseIdxTable(false); + $this->assertEquals(false, $this->_model->getUseIdxTable()); + $this->_model->setUseIdxTable(true); + $this->assertEquals(true, $this->_model->getUseIdxTable()); + $this->_model->setUseIdxTable(); + $this->assertEquals(false, $this->_model->getUseIdxTable()); + } + + /** + * Test table name preparation + * + * @return void + */ + public function testPrepareTableName() + { + $this->assertEquals('test_tmp', $this->_model->prepareTableName('test')); + $this->_model->setUseIdxTable(true); + $this->assertEquals('test_idx', $this->_model->prepareTableName('test')); + $this->_model->setUseIdxTable(false); + $this->assertEquals('test_tmp', $this->_model->prepareTableName('test')); + } + + /** + * Test table name getter + * + * @return void + */ + public function testGetTableName() + { + $prefix = 'pre_'; + $this->_resourceMock->expects($this->any())->method('getTableName')->will( + $this->returnCallback( + function ($tableName) use ($prefix) { + return $prefix . $tableName; + } + ) + ); + $this->assertEquals('pre_test_tmp', $this->_model->getTableName('test')); + $this->_model->setUseIdxTable(true); + $this->assertEquals('pre_test_idx', $this->_model->getTableName('test')); + } +} diff --git a/app/code/Magento/Indexer/Test/Unit/Model/Processor/InvalidateCacheTest.php b/app/code/Magento/Indexer/Test/Unit/Model/Processor/InvalidateCacheTest.php index 29628de82f5459902a9996b0e47e4beeb179ac2b..90c5606b85da7ec8612250701c9adfbc9d075742 100644 --- a/app/code/Magento/Indexer/Test/Unit/Model/Processor/InvalidateCacheTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Model/Processor/InvalidateCacheTest.php @@ -4,33 +4,41 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Indexer\Test\Unit\Model\Processor; class InvalidateCacheTest extends \PHPUnit_Framework_TestCase { /** + * Tested plugin + * * @var \Magento\Indexer\Model\Processor\InvalidateCache */ protected $plugin; /** + * Mock for context + * * @var \Magento\Indexer\Model\CacheContext|\PHPUnit_Framework_MockObject_MockObject */ protected $contextMock; /** + * Subject mock + * * @var \Magento\Indexer\Model\ActionInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $subjectMock; /** + * Event manager mock + * * @var \Magento\Framework\Event\Manager|\PHPUnit_Framework_MockObject_MockObject */ protected $eventManagerMock; /** + * Module manager mock + * * @var \Magento\Framework\Module\Manager|\PHPUnit_Framework_MockObject_MockObject */ protected $moduleManager; @@ -40,20 +48,21 @@ class InvalidateCacheTest extends \PHPUnit_Framework_TestCase */ public function setUp() { - $this->subjectMock = $this->getMock('Magento\Indexer\Model\Processor', - [], [], '', false); - $this->contextMock = $this->getMock('Magento\Indexer\Model\CacheContext', - [], [], '', false); - $this->eventManagerMock = $this->getMock('Magento\Framework\Event\Manager', - [], [], '', false); - $this->moduleManager = $this->getMock('Magento\Framework\Module\Manager', - [], [], '', false); + $this->subjectMock = $this->getMock('Magento\Indexer\Model\Processor', [], [], '', false); + $this->contextMock = $this->getMock('Magento\Indexer\Model\CacheContext', [], [], '', false); + $this->eventManagerMock = $this->getMock('Magento\Framework\Event\Manager', [], [], '', false); + $this->moduleManager = $this->getMock('Magento\Framework\Module\Manager', [], [], '', false); $this->plugin = new \Magento\Indexer\Model\Processor\InvalidateCache( - $this->contextMock, $this->eventManagerMock, $this->moduleManager); + $this->contextMock, + $this->eventManagerMock, + $this->moduleManager + ); } /** * Test afterUpdateMview with enabled PageCache module + * + * @return void */ public function testAfterUpdateMviewPageCacheEnabled() { @@ -63,14 +72,17 @@ class InvalidateCacheTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue(true)); $this->eventManagerMock->expects($this->once()) ->method('dispatch') - ->with($this->equalTo('clean_cache_after_reindex'), - $this->equalTo(['object' => $this->contextMock])); - $actualResult = $this->plugin->afterUpdateMview($this->subjectMock); - $this->assertNull($actualResult); + ->with( + $this->equalTo('clean_cache_after_reindex'), + $this->equalTo(['object' => $this->contextMock]) + ); + $this->plugin->afterUpdateMview($this->subjectMock); } /** - * afterUpdateMview with disabled PageCache module + * Test afterUpdateMview with disabled PageCache module + * + * @return void */ public function testAfterUpdateMviewPageCacheDisabled() { @@ -80,7 +92,6 @@ class InvalidateCacheTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue(false)); $this->eventManagerMock->expects($this->never()) ->method('dispatch'); - $actualResult = $this->plugin->afterUpdateMview($this->subjectMock); - $this->assertNull($actualResult); + $this->plugin->afterUpdateMview($this->subjectMock); } } diff --git a/app/code/Magento/Indexer/Test/Unit/Model/Resource/AbstractResourceTest.php b/app/code/Magento/Indexer/Test/Unit/Model/Resource/AbstractResourceTest.php index 79e058df703750c0242663308e62b9555296e379..07b7bf63f7c8ca71d7d146d0ad56e0b59ea624ec 100644 --- a/app/code/Magento/Indexer/Test/Unit/Model/Resource/AbstractResourceTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Model/Resource/AbstractResourceTest.php @@ -17,6 +17,11 @@ class AbstractResourceTest extends \PHPUnit_Framework_TestCase */ protected $_resourceMock; + /** + * @var \Magento\Indexer\Model\Indexer\Table\StrategyInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $_tableStrategyInterface; + protected function setUp() { @@ -24,10 +29,20 @@ class AbstractResourceTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); + $this->_tableStrategyInterface = $this->getMock( + 'Magento\Indexer\Model\Indexer\Table\StrategyInterface', + [], + [], + '', + false + ); $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $arguments = $objectManager->getConstructArguments( '\Magento\Indexer\Test\Unit\Model\Resource\AbstractResourceStub', - ['resource' => $this->_resourceMock] + [ + 'resource' => $this->_resourceMock, + 'tableStrategy' => $this->_tableStrategyInterface + ] ); $this->model = $objectManager->getObject( '\Magento\Indexer\Test\Unit\Model\Resource\AbstractResourceStub', @@ -37,18 +52,17 @@ class AbstractResourceTest extends \PHPUnit_Framework_TestCase public function testReindexAll() { + $this->_tableStrategyInterface->expects($this->once()) + ->method('setUseIdxTable') + ->with(true); + $this->_tableStrategyInterface->expects($this->once()) + ->method('prepareTableName') + ->with('test') + ->will($this->returnValue('test_idx')); $this->model->reindexAll(); $this->assertEquals('test_idx', $this->model->getIdxTable('test')); } - public function testUseIdxTable() - { - $this->model->useIdxTable(true); - $this->assertEquals('test_idx', $this->model->getIdxTable('test')); - $this->model->useIdxTable(false); - $this->assertEquals('test_tmp', $this->model->getIdxTable('test')); - } - public function testClearTemporaryIndexTable() { $connectionMock = $this->getMock('Magento\Framework\DB\Adapter\AdapterInterface', [], [], '', false); diff --git a/app/code/Magento/Indexer/composer.json b/app/code/Magento/Indexer/composer.json index 5334b4ad74bf65576c1ccec4ad8f4294e9dddf87..5c2d70fd3ba1f4706522b5534b358eed397bb3d7 100644 --- a/app/code/Magento/Indexer/composer.json +++ b/app/code/Magento/Indexer/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Indexer/etc/crontab.xml b/app/code/Magento/Indexer/etc/crontab.xml index 33e6a27040f939cca18a0ccf2418ffa0fa3ee5b7..2dd222c0e0166f7a4c5f1800e8655c83dccb0cec 100644 --- a/app/code/Magento/Indexer/etc/crontab.xml +++ b/app/code/Magento/Indexer/etc/crontab.xml @@ -6,7 +6,7 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Cron/etc/crontab.xsd"> - <group id="index"> + <group id="default"> <job name="indexer_reindex_all_invalid" instance="Magento\Indexer\Model\Processor" method="reindexAllInvalid"> <schedule>* * * * *</schedule> </job> diff --git a/app/code/Magento/Indexer/etc/di.xml b/app/code/Magento/Indexer/etc/di.xml index 8c6730dffb5c959d732d78f590c366eae74ef1bb..d6c354590a60c3ab39544872c966aa98eb1f5572 100644 --- a/app/code/Magento/Indexer/etc/di.xml +++ b/app/code/Magento/Indexer/etc/di.xml @@ -10,6 +10,8 @@ <preference for="Magento\Framework\Mview\View\StateInterface" type="Magento\Indexer\Model\Mview\View\State" /> <preference for="Magento\Indexer\Model\ConfigInterface" type="Magento\Indexer\Model\Config" /> <preference for="Magento\Indexer\Model\IndexerInterface" type="Magento\Indexer\Model\Indexer" /> + <preference for="Magento\Indexer\Model\Indexer\Table\StrategyInterface" type="Magento\Indexer\Model\Indexer\Table\Strategy" /> + <type name="Magento\Indexer\Model\Indexer\Table\StrategyInterface" shared="false" /> <type name="Magento\Indexer\Model\Indexer"> <arguments> <argument name="view" xsi:type="object" shared="false">Magento\Framework\Mview\View</argument> diff --git a/app/code/Magento/Integration/composer.json b/app/code/Magento/Integration/composer.json index e7522cbdd35551484344ff6d2e89df0259344269..71e7696d8ef28184f8fd128d60231cac19b28ca4 100644 --- a/app/code/Magento/Integration/composer.json +++ b/app/code/Magento/Integration/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-user": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-user": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/LayeredNavigation/composer.json b/app/code/Magento/LayeredNavigation/composer.json index bdc20c0270c5158053c633cfcfad014a842cbcb3..5fb0f54db609de19157dbbe5a22daf6d3025c950 100644 --- a/app/code/Magento/LayeredNavigation/composer.json +++ b/app/code/Magento/LayeredNavigation/composer.json @@ -3,13 +3,13 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Log/composer.json b/app/code/Magento/Log/composer.json index 1e5b22c27320a7ab072789131a4b60f59b9dbdac..226458dacc1e2acfe398cfea0d658fb0ec2ab22e 100644 --- a/app/code/Magento/Log/composer.json +++ b/app/code/Magento/Log/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/MediaStorage/composer.json b/app/code/Magento/MediaStorage/composer.json index d6eb3484a3966987d8d3278506a3ba04abba6b52..da20bf9f3dc3d8790f4710a3027cbd22335b0d34 100644 --- a/app/code/Magento/MediaStorage/composer.json +++ b/app/code/Magento/MediaStorage/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Msrp/composer.json b/app/code/Magento/Msrp/composer.json index 264b8eb51dba8d26cd6487ab3a4c05374119152b..552af5d5da3518251046821ba504ab4608661fd3 100644 --- a/app/code/Magento/Msrp/composer.json +++ b/app/code/Magento/Msrp/composer.json @@ -3,19 +3,19 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-bundle": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-downloadable": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-grouped-product": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-bundle": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-downloadable": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-grouped-product": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Multishipping/composer.json b/app/code/Magento/Multishipping/composer.json index 1d8a0325c2eb0998dc4e53af4125e2204ad25f50..3f6d9e22a139d0932d538424871afc49b49baa40 100644 --- a/app/code/Magento/Multishipping/composer.json +++ b/app/code/Magento/Multishipping/composer.json @@ -3,19 +3,19 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Newsletter/Model/Queue.php b/app/code/Magento/Newsletter/Model/Queue.php index 4c34f3419f10ad6f41717fd31d5b656d2d849ffb..3a42e4ac6e36ba5b352caffd24f13cf5e23c48d7 100644 --- a/app/code/Magento/Newsletter/Model/Queue.php +++ b/app/code/Magento/Newsletter/Model/Queue.php @@ -119,13 +119,15 @@ class Queue extends \Magento\Email\Model\AbstractTemplate * @param \Magento\Newsletter\Model\ProblemFactory $problemFactory * @param \Magento\Newsletter\Model\Resource\Subscriber\CollectionFactory $subscriberCollectionFactory * @param \Magento\Newsletter\Model\Queue\TransportBuilder $transportBuilder + * @param \Magento\Framework\Model\Resource\AbstractResource $resource + * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( \Magento\Framework\Model\Context $context, - \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, + \Magento\Framework\View\DesignInterface $design, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Newsletter\Model\Template\Filter $templateFilter, @@ -134,9 +136,20 @@ class Queue extends \Magento\Email\Model\AbstractTemplate \Magento\Newsletter\Model\ProblemFactory $problemFactory, \Magento\Newsletter\Model\Resource\Subscriber\CollectionFactory $subscriberCollectionFactory, \Magento\Newsletter\Model\Queue\TransportBuilder $transportBuilder, + \Magento\Framework\Model\Resource\AbstractResource $resource = null, + \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $design, $registry, $appEmulation, $storeManager, $data); + parent::__construct( + $context, + $registry, + $design, + $appEmulation, + $storeManager, + $data, + $resource, + $resourceCollection + ); $this->_templateFilter = $templateFilter; $this->_date = $date; $this->_templateFactory = $templateFactory; diff --git a/app/code/Magento/Newsletter/Model/Template.php b/app/code/Magento/Newsletter/Model/Template.php index 9f2dc723b155c0da2015d5cae3d906f5069ec660..9f439f7192713eb30dfff6dbc279b615cc53a6ff 100644 --- a/app/code/Magento/Newsletter/Model/Template.php +++ b/app/code/Magento/Newsletter/Model/Template.php @@ -106,8 +106,8 @@ class Template extends \Magento\Email\Model\AbstractTemplate */ public function __construct( \Magento\Framework\Model\Context $context, - \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, + \Magento\Framework\View\DesignInterface $design, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\App\RequestInterface $request, @@ -117,7 +117,7 @@ class Template extends \Magento\Email\Model\AbstractTemplate \Magento\Framework\Filter\FilterManager $filterManager, array $data = [] ) { - parent::__construct($context, $design, $registry, $appEmulation, $storeManager, $data); + parent::__construct($context, $registry, $design, $appEmulation, $storeManager, $data); $this->_storeManager = $storeManager; $this->_request = $request; $this->_filter = $filter; diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/Plugin/CustomerPluginTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/Plugin/CustomerPluginTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0c97d3ef5ef8a0b28513411058c1604b81aa6bed --- /dev/null +++ b/app/code/Magento/Newsletter/Test/Unit/Model/Plugin/CustomerPluginTest.php @@ -0,0 +1,94 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Newsletter\Test\Unit\Model\Plugin; + +class CustomerPluginTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Newsletter\Model\Plugin\CustomerPlugin + */ + protected $plugin; + + /** + * @var \Magento\Newsletter\Model\SubscriberFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $subscriberFactory; + + /** + * @var \Magento\Newsletter\Model\Subscriber|\PHPUnit_Framework_MockObject_MockObject + */ + private $subscriber; + + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + protected $objectManager; + + public function setUp() + { + $this->subscriberFactory = $this->getMockBuilder('\Magento\Newsletter\Model\SubscriberFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->subscriber = $this->getMockBuilder('\Magento\Newsletter\Model\Subscriber') + ->setMethods(['loadByEmail', 'getId', 'delete', 'updateSubscription']) + ->disableOriginalConstructor() + ->getMock(); + $this->subscriberFactory->expects($this->any())->method('create')->willReturn($this->subscriber); + + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->plugin = $this->objectManager->getObject( + 'Magento\Newsletter\Model\Plugin\CustomerPlugin', + [ + 'subscriberFactory' => $this->subscriberFactory + ] + ); + } + + public function testAfterSave() + { + $customerId = 1; + $subject = $this->getMock('\Magento\Customer\Api\CustomerRepositoryInterface'); + $customer = $this->getMock('Magento\Customer\Api\Data\CustomerInterface'); + $customer->expects($this->once())->method('getId')->willReturn($customerId); + $this->subscriber->expects($this->once())->method('updateSubscription')->with($customerId)->willReturnSelf(); + + $this->assertEquals($customer, $this->plugin->afterSave($subject, $customer)); + } + + public function testAroundDelete() + { + $deleteCustomer = function () { + return true; + }; + $subject = $this->getMock('\Magento\Customer\Api\CustomerRepositoryInterface'); + $customer = $this->getMock('Magento\Customer\Api\Data\CustomerInterface'); + $customer->expects($this->once())->method('getEmail')->willReturn('test@test.com'); + $this->subscriber->expects($this->once())->method('loadByEmail')->with('test@test.com')->willReturnSelf(); + $this->subscriber->expects($this->once())->method('getId')->willReturn(1); + $this->subscriber->expects($this->once())->method('delete')->willReturnSelf(); + + $this->assertEquals(true, $this->plugin->aroundDelete($subject, $deleteCustomer, $customer)); + } + + public function testAroundDeleteById() + { + $customerId = 1; + $deleteCustomerById = function () { + return true; + }; + $subject = $this->getMock('\Magento\Customer\Api\CustomerRepositoryInterface'); + $customer = $this->getMock('Magento\Customer\Api\Data\CustomerInterface'); + $subject->expects($this->once())->method('getById')->willReturn($customer); + $customer->expects($this->once())->method('getEmail')->willReturn('test@test.com'); + $this->subscriber->expects($this->once())->method('loadByEmail')->with('test@test.com')->willReturnSelf(); + $this->subscriber->expects($this->once())->method('getId')->willReturn(1); + $this->subscriber->expects($this->once())->method('delete')->willReturnSelf(); + + $this->assertEquals(true, $this->plugin->aroundDeleteById($subject, $deleteCustomerById, $customerId)); + } +} diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/QueueTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/QueueTest.php new file mode 100644 index 0000000000000000000000000000000000000000..bb8ec3b719f54c143447aececfde24daccbcc5ce --- /dev/null +++ b/app/code/Magento/Newsletter/Test/Unit/Model/QueueTest.php @@ -0,0 +1,205 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Newsletter\Test\Unit\Model; + +class QueueTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Newsletter\Model\Queue + */ + protected $queue; + + /** + * @var \Magento\Newsletter\Model\Template\Filter|\PHPUnit_Framework_MockObject_MockObject + */ + protected $templateFilter; + + /** + * @var \Magento\Framework\Stdlib\DateTime\DateTime|\PHPUnit_Framework_MockObject_MockObject + */ + protected $date; + + /** + * @var \Magento\Newsletter\Model\TemplateFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $templateFactory; + + /** + * @var \Magento\Newsletter\Model\ProblemFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $problemFactory; + + /** + * @var \Magento\Newsletter\Model\Resource\Subscriber\Collection|\PHPUnit_Framework_MockObject_MockObject + */ + protected $subscribersCollection; + + /** + * @var \Magento\Newsletter\Model\Resource\Subscriber\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $subscribersCollectionFactory; + + /** + * @var \Magento\Newsletter\Model\Queue\TransportBuilder|\PHPUnit_Framework_MockObject_MockObject + */ + protected $transportBuilder; + + /** + * @var \Magento\Newsletter\Model\Resource\Queue|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resource; + + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + protected $objectManager; + + public function setUp() + { + $this->templateFilter = $this->getMockBuilder('\Magento\Newsletter\Model\Template\Filter') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->date = $this->getMockBuilder('\Magento\Framework\Stdlib\DateTime\DateTime') + ->disableOriginalConstructor() + ->getMock(); + $this->templateFactory = $this->getMockBuilder('\Magento\Newsletter\Model\TemplateFactory') + ->disableOriginalConstructor() + ->setMethods(['create', 'load']) + ->getMock(); + $this->problemFactory = $this->getMockBuilder('\Magento\Newsletter\Model\ProblemFactory') + ->disableOriginalConstructor() + ->getMock(); + $this->transportBuilder = $this->getMockBuilder('\Magento\Newsletter\Model\Queue\TransportBuilder') + ->disableOriginalConstructor() + ->setMethods( + ['setTemplateData', 'setTemplateOptions', 'setTemplateVars', 'setFrom', 'addTo', 'getTransport'] + ) + ->getMock(); + $this->subscribersCollection = $this->getMockBuilder('\Magento\Newsletter\Model\Resource\Subscriber\Collection') + ->disableOriginalConstructor() + ->getMock(); + $this->resource = $this->getMockBuilder('\Magento\Newsletter\Model\Resource\Queue') + ->disableOriginalConstructor() + ->getMock(); + $this->subscribersCollectionFactory = $this->getMockBuilder( + '\Magento\Newsletter\Model\Resource\Subscriber\CollectionFactory' + ) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->subscribersCollectionFactory->expects($this->any())->method('create')->willReturn( + $this->subscribersCollection + ); + + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->queue = $this->objectManager->getObject( + '\Magento\Newsletter\Model\Queue', + [ + 'templateFilter' => $this->templateFilter, + 'date' => $this->date, + 'templateFactory' => $this->templateFactory, + 'problemFactory' => $this->problemFactory, + 'subscriberCollectionFactory' => $this->subscribersCollectionFactory, + 'transportBuilder' => $this->transportBuilder, + 'resource' => $this->resource + ] + ); + } + + public function testSendPerSubscriber1() + { + $this->queue->setQueueStatus(2); + $this->queue->setQueueStartAt(1); + + $this->assertEquals($this->queue, $this->queue->sendPerSubscriber()); + } + + public function testSendPerSubscriberZeroSize() + { + $this->queue->setQueueStatus(1); + $this->queue->setQueueStartAt(1); + $this->subscribersCollection->expects($this->once())->method('getQueueJoinedFlag')->willReturn(false); + $this->subscribersCollection->expects($this->once())->method('useQueue')->with($this->queue)->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('getSize')->willReturn(0); + $this->date->expects($this->once())->method('gmtDate')->willReturn('any_date'); + + $this->assertEquals($this->queue, $this->queue->sendPerSubscriber()); + } + + public function testSendPerSubscriber2() + { + $this->queue->setQueueStatus(1); + $this->queue->setQueueStartAt(1); + $collection = $this->getMockBuilder('\Magento\Framework\Data\Collection') + ->disableOriginalConstructor() + ->setMethods(['getItems']) + ->getMock(); + $item = $this->getMockBuilder('\Magento\Newsletter\Model\Subscriber') + ->disableOriginalConstructor() + ->setMethods(['getStoreId', 'getSubscriberEmail', 'getSubscriberFullName', 'received']) + ->getMock(); + $transport = $this->getMock('\Magento\Framework\Mail\TransportInterface'); + $this->subscribersCollection->expects($this->once())->method('getQueueJoinedFlag')->willReturn(false); + $this->subscribersCollection->expects($this->once())->method('useQueue')->with($this->queue)->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('getSize')->willReturn(5); + $this->subscribersCollection->expects($this->once())->method('useOnlyUnsent')->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('showCustomerInfo')->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('setPageSize')->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('setCurPage')->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('load')->willReturn($collection); + $this->transportBuilder->expects($this->once())->method('setTemplateData')->willReturnSelf(); + $collection->expects($this->atLeastOnce())->method('getItems')->willReturn([$item]); + $item->expects($this->once())->method('getStoreId')->willReturn('store_id'); + $item->expects($this->once())->method('getSubscriberEmail')->willReturn('email'); + $item->expects($this->once())->method('getSubscriberFullName')->willReturn('full_name'); + $this->transportBuilder->expects($this->once())->method('setTemplateOptions')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('setTemplateVars')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('setFrom')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('addTo')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('getTransport')->willReturn($transport); + $item->expects($this->once())->method('received')->with($this->queue)->willReturnSelf(); + + $this->assertEquals($this->queue, $this->queue->sendPerSubscriber()); + } + + public function testGetDataForSave() + { + $result = [ + 'template_id' => 'id', + 'queue_status' => 'status', + 'queue_start_at' => 'start_at', + 'queue_finish_at' => 'finish_at' + ]; + $this->queue->setTemplateId('id'); + $this->queue->setQueueStatus('status'); + $this->queue->setQueueStartAt('start_at'); + $this->queue->setQueueFinishAt('finish_at'); + + $this->assertEquals($result, $this->queue->getDataForSave()); + } + + public function testGetTemplate() + { + $template = $this->getMockBuilder('\Magento\Newsletter\Model\Template') + ->disableOriginalConstructor() + ->getMock(); + $this->queue->setTemplateId(2); + $this->templateFactory->expects($this->once())->method('create')->willReturn($template); + $template->expects($this->once())->method('load')->with(2)->willReturnSelf(); + + $this->assertEquals($template, $this->queue->getTemplate()); + } + + public function testGetStores() + { + $stores = ['store']; + $this->resource->expects($this->once())->method('getStores')->willReturn($stores); + + $this->assertEquals($stores, $this->queue->getStores()); + } +} diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/SubscriberTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/SubscriberTest.php index bd8380299a52ee06f8d95a9ddea229ae2649160e..90d5c2ca0a4886deac1ab31f7acf72a004ace884 100644 --- a/app/code/Magento/Newsletter/Test/Unit/Model/SubscriberTest.php +++ b/app/code/Magento/Newsletter/Test/Unit/Model/SubscriberTest.php @@ -100,7 +100,9 @@ class SubscriberTest extends \PHPUnit_Framework_TestCase [ 'loadByEmail', 'getIdFieldName', - 'save' + 'save', + 'loadByCustomerData', + 'received' ], [], '', @@ -134,7 +136,6 @@ class SubscriberTest extends \PHPUnit_Framework_TestCase 'name' => 'subscriber_name' ] ); - $this->resource->expects($this->any())->method('getIdFieldName')->willReturn('id_field'); $this->scopeConfig->expects($this->any())->method('getValue')->willReturn(true); $this->customerSession->expects($this->any())->method('isLoggedIn')->willReturn(true); $customerDataModel = $this->getMock('\Magento\Customer\Api\Data\CustomerInterface'); @@ -144,21 +145,193 @@ class SubscriberTest extends \PHPUnit_Framework_TestCase $this->customerRepository->expects($this->any())->method('getById')->willReturn($customerDataModel); $customerDataModel->expects($this->any())->method('getStoreId')->willReturn(1); $customerDataModel->expects($this->any())->method('getId')->willReturn(1); - $this->transportBuilder->expects($this->any())->method('setTemplateIdentifier')->willReturnSelf(); - $this->transportBuilder->expects($this->any())->method('setTemplateOptions')->willReturnSelf(); - $this->transportBuilder->expects($this->any())->method('setTemplateVars')->willReturnSelf(); - $this->transportBuilder->expects($this->any())->method('setFrom')->willReturnSelf(); - $this->transportBuilder->expects($this->any())->method('addTo')->willReturnSelf(); - $storeModel = $this->getMock('\Magento\Store\Model\Store', ['getId'], [], '', false); - $this->scopeConfig->expects($this->any())->method('getValue')->willReturn('owner_email@magento.com'); - $this->storeManager->expects($this->any())->method('getStore')->willReturn($storeModel); - $storeModel->expects($this->any())->method('getId')->willReturn(1); - $transport = $this->getMock('\Magento\Framework\Mail\TransportInterface'); - $this->transportBuilder->expects($this->any())->method('getTransport')->willReturn($transport); - $transport->expects($this->any())->method('sendMessage')->willReturnSelf(); - $inlineTranslation = $this->getMock('Magento\Framework\Translate\Inline\StateInterface'); - $inlineTranslation->expects($this->any())->method('resume')->willReturnSelf(); + $this->sendEmailCheck(); $this->resource->expects($this->atLeastOnce())->method('save')->willReturnSelf(); + $this->assertEquals(1, $this->subscriber->subscribe($email)); } + + public function testSubscribeNotLoggedIn() + { + $email = 'subscriber_email@magento.com'; + $this->resource->expects($this->any())->method('loadByEmail')->willReturn( + [ + 'subscriber_status' => 3, + 'subscriber_email' => $email, + 'name' => 'subscriber_name' + ] + ); + $this->scopeConfig->expects($this->any())->method('getValue')->willReturn(true); + $this->customerSession->expects($this->any())->method('isLoggedIn')->willReturn(false); + $customerDataModel = $this->getMock('\Magento\Customer\Api\Data\CustomerInterface'); + $this->customerSession->expects($this->any())->method('getCustomerDataObject')->willReturn($customerDataModel); + $this->customerSession->expects($this->any())->method('getCustomerId')->willReturn(1); + $customerDataModel->expects($this->any())->method('getEmail')->willReturn($email); + $this->customerRepository->expects($this->any())->method('getById')->willReturn($customerDataModel); + $customerDataModel->expects($this->any())->method('getStoreId')->willReturn(1); + $customerDataModel->expects($this->any())->method('getId')->willReturn(1); + $this->sendEmailCheck(); + $this->resource->expects($this->atLeastOnce())->method('save')->willReturnSelf(); + + $this->assertEquals(2, $this->subscriber->subscribe($email)); + } + + public function testUpdateSubscription() + { + $customerId = 1; + $customerDataMock = $this->getMockBuilder('\Magento\Customer\Api\Data\CustomerInterface') + ->getMock(); + $this->customerRepository->expects($this->atLeastOnce()) + ->method('getById') + ->with($customerId)->willReturn($customerDataMock); + $this->resource->expects($this->atLeastOnce()) + ->method('loadByCustomerData') + ->with($customerDataMock) + ->willReturn( + [ + 'subscriber_id' => 1, + 'subscriber_status' => 1 + ] + ); + $customerDataMock->expects($this->atLeastOnce())->method('getId')->willReturn('id'); + $this->resource->expects($this->atLeastOnce())->method('save')->willReturnSelf(); + $this->customerAccountManagement->expects($this->once()) + ->method('getConfirmationStatus') + ->with($customerId) + ->willReturn('account_confirmation_required'); + $customerDataMock->expects($this->once())->method('getStoreId')->willReturn('store_id'); + $customerDataMock->expects($this->once())->method('getEmail')->willReturn('email'); + + $this->assertEquals($this->subscriber, $this->subscriber->updateSubscription($customerId)); + } + + public function testUnsubscribeCustomerById() + { + $customerId = 1; + $customerDataMock = $this->getMockBuilder('\Magento\Customer\Api\Data\CustomerInterface') + ->getMock(); + $this->customerRepository->expects($this->atLeastOnce()) + ->method('getById') + ->with($customerId)->willReturn($customerDataMock); + $this->resource->expects($this->atLeastOnce()) + ->method('loadByCustomerData') + ->with($customerDataMock) + ->willReturn( + [ + 'subscriber_id' => 1, + 'subscriber_status' => 1 + ] + ); + $customerDataMock->expects($this->atLeastOnce())->method('getId')->willReturn('id'); + $this->resource->expects($this->atLeastOnce())->method('save')->willReturnSelf(); + $customerDataMock->expects($this->once())->method('getStoreId')->willReturn('store_id'); + $customerDataMock->expects($this->once())->method('getEmail')->willReturn('email'); + $this->sendEmailCheck(); + + $this->subscriber->unsubscribeCustomerById($customerId); + } + + public function testSubscribeCustomerById() + { + $customerId = 1; + $customerDataMock = $this->getMockBuilder('\Magento\Customer\Api\Data\CustomerInterface') + ->getMock(); + $this->customerRepository->expects($this->atLeastOnce()) + ->method('getById') + ->with($customerId)->willReturn($customerDataMock); + $this->resource->expects($this->atLeastOnce()) + ->method('loadByCustomerData') + ->with($customerDataMock) + ->willReturn( + [ + 'subscriber_id' => 1, + 'subscriber_status' => 3 + ] + ); + $customerDataMock->expects($this->atLeastOnce())->method('getId')->willReturn('id'); + $this->resource->expects($this->atLeastOnce())->method('save')->willReturnSelf(); + $customerDataMock->expects($this->once())->method('getStoreId')->willReturn('store_id'); + $customerDataMock->expects($this->once())->method('getEmail')->willReturn('email'); + $this->sendEmailCheck(); + + $this->subscriber->subscribeCustomerById($customerId); + } + + public function testUnsubscribe() + { + $this->resource->expects($this->once())->method('save')->willReturnSelf(); + $this->sendEmailCheck(); + + $this->assertEquals($this->subscriber, $this->subscriber->unsubscribe()); + } + + /** + * @expectedException \Magento\Framework\Exception\LocalizedException + * @expectedExceptionMessage This is an invalid subscription confirmation code. + */ + public function testUnsubscribeException() + { + $this->subscriber->setCode(111); + $this->subscriber->setCheckCode(222); + + $this->subscriber->unsubscribe(); + } + + public function testGetSubscriberFullName() + { + $this->subscriber->setCustomerFirstname('John'); + $this->subscriber->setCustomerLastname('Doe'); + + $this->assertEquals('John Doe', $this->subscriber->getSubscriberFullName()); + } + + public function testConfirm() + { + $code = 111; + $this->subscriber->setCode($code); + $this->resource->expects($this->once())->method('save')->willReturnSelf(); + + $this->assertTrue($this->subscriber->confirm($code)); + } + + public function testConfirmWrongCode() + { + $code = 111; + $this->subscriber->setCode(222); + + $this->assertFalse($this->subscriber->confirm($code)); + } + + public function testReceived() + { + $queue = $this->getMockBuilder('\Magento\Newsletter\Model\Queue') + ->disableOriginalConstructor() + ->getMock(); + $this->resource->expects($this->once())->method('received')->with($this->subscriber, $queue)->willReturnSelf(); + + $this->assertEquals($this->subscriber, $this->subscriber->received($queue)); + } + + protected function sendEmailCheck() + { + $storeModel = $this->getMockBuilder('\Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->setMethods(['getId']) + ->getMock(); + $transport = $this->getMock('\Magento\Framework\Mail\TransportInterface'); + $this->scopeConfig->expects($this->any())->method('getValue')->willReturn(true); + $this->transportBuilder->expects($this->once())->method('setTemplateIdentifier')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('setTemplateOptions')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('setTemplateVars')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('setFrom')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('addTo')->willReturnSelf(); + $this->storeManager->expects($this->any())->method('getStore')->willReturn($storeModel); + $storeModel->expects($this->any())->method('getId')->willReturn(1); + $this->transportBuilder->expects($this->once())->method('getTransport')->willReturn($transport); + $transport->expects($this->once())->method('sendMessage')->willReturnSelf(); + $this->inlineTranslation->expects($this->once())->method('suspend')->willReturnSelf(); + $this->inlineTranslation->expects($this->once())->method('resume')->willReturnSelf(); + + return $this; + } } diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/TemplateTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/TemplateTest.php index 1b599897715f903b48a95b6432f14c96a74f3f4f..0bbd428237b19edb86a68947a8964696d138baa9 100644 --- a/app/code/Magento/Newsletter/Test/Unit/Model/TemplateTest.php +++ b/app/code/Magento/Newsletter/Test/Unit/Model/TemplateTest.php @@ -65,8 +65,8 @@ class TemplateTest extends \PHPUnit_Framework_TestCase ['_init'], [ $context, - $design, $registry, + $design, $appEmulation, $storeManager, $request, diff --git a/app/code/Magento/Newsletter/composer.json b/app/code/Magento/Newsletter/composer.json index 5e9806a6fab8fd93f56c0a0ccca0256ca1771bc6..1ac1fb8c9d929acbe852fb2c8c0fa93ee1e42409 100644 --- a/app/code/Magento/Newsletter/composer.json +++ b/app/code/Magento/Newsletter/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-email": "0.74.0-beta13", - "magento/module-cron": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-require-js": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-email": "0.74.0-beta14", + "magento/module-cron": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-require-js": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/OfflinePayments/composer.json b/app/code/Magento/OfflinePayments/composer.json index 90045a9378f6e5f6b38fe5824ccfb2deea5770b6..5118d798b7ee7a9f2a5c5f1291afd3a9f9ade93d 100644 --- a/app/code/Magento/OfflinePayments/composer.json +++ b/app/code/Magento/OfflinePayments/composer.json @@ -3,13 +3,13 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/OfflineShipping/composer.json b/app/code/Magento/OfflineShipping/composer.json index 9e6c4caa47f24bf81041f76336168cdaf9256b15..5a4bc6de203315f49cc562f6c3561279bc5febe8 100644 --- a/app/code/Magento/OfflineShipping/composer.json +++ b/app/code/Magento/OfflineShipping/composer.json @@ -3,21 +3,21 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-sales-rule": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-sales-rule": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/PageCache/composer.json b/app/code/Magento/PageCache/composer.json index bc812b12e6d5c3b4ed3047b46623a6a0b2fb5f19..ce7896f50957edfc63dc32ca1c2b335c880bd0d9 100644 --- a/app/code/Magento/PageCache/composer.json +++ b/app/code/Magento/PageCache/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Payment/composer.json b/app/code/Magento/Payment/composer.json index 87f3a9ef1cd080f2b0da3e1e42532f71dc39d4b4..b78f45d789049bbd5d2a03a892e688dbd0d40535 100644 --- a/app/code/Magento/Payment/composer.json +++ b/app/code/Magento/Payment/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Persistent/composer.json b/app/code/Magento/Persistent/composer.json index 379f16a66b2f4879c1c315c5a33c6d93cd69f64b..b81c38561e3dfc1e24c9565dec1988e79ff43715 100644 --- a/app/code/Magento/Persistent/composer.json +++ b/app/code/Magento/Persistent/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-cron": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-cron": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/ProductAlert/composer.json b/app/code/Magento/ProductAlert/composer.json index 3e993546d08a901e3e7f7feda86c18e19e2cfd7e..715f9607506075b3e7fd70a2f1f691c63f78f3f5 100644 --- a/app/code/Magento/ProductAlert/composer.json +++ b/app/code/Magento/ProductAlert/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Quote/Api/Data/EstimateAddressInterface.php b/app/code/Magento/Quote/Api/Data/EstimateAddressInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..5d5eb86351846141bfbd6c6bdca9ef58b6fa63bb --- /dev/null +++ b/app/code/Magento/Quote/Api/Data/EstimateAddressInterface.php @@ -0,0 +1,103 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Quote\Api\Data; + +/** + * Interface EstimateAddressInterface + * @api + */ +interface EstimateAddressInterface extends \Magento\Framework\Api\CustomAttributesDataInterface +{ + /**#@+ + * Constants defined for keys of array, makes typos less likely + */ + const KEY_COUNTRY_ID = 'country_id'; + + const KEY_REGION_ID = 'region_id'; + + const KEY_REGION = 'region'; + + const KEY_POSTCODE = 'postcode'; + + /**#@-*/ + + /** + * Get region name + * + * @return string + */ + public function getRegion(); + + /** + * Set region name + * + * @param string $region + * @return $this + */ + public function setRegion($region); + + /** + * Get region id + * + * @return int + */ + public function getRegionId(); + + /** + * Set region id + * + * @param int $regionId + * @return $this + */ + public function setRegionId($regionId); + + /** + * Get country id + * + * @return string + */ + public function getCountryId(); + + /** + * Set country id + * + * @param string $countryId + * @return $this + */ + public function setCountryId($countryId); + + /** + * Get postcode + * + * @return string + */ + public function getPostcode(); + + /** + * Set postcode + * + * @param string $postcode + * @return $this + */ + public function setPostcode($postcode); + + /** + * Retrieve existing extension attributes object or create a new one. + * + * @return \Magento\Quote\Api\Data\EstimateAddressExtensionInterface|null + */ + public function getExtensionAttributes(); + + /** + * Set an extension attributes object. + * + * @param \Magento\Quote\Api\Data\EstimateAddressExtensionInterface $extensionAttributes + * @return $this + */ + public function setExtensionAttributes( + \Magento\Quote\Api\Data\EstimateAddressExtensionInterface $extensionAttributes + ); +} diff --git a/app/code/Magento/Quote/Api/ShippingMethodManagementInterface.php b/app/code/Magento/Quote/Api/ShippingMethodManagementInterface.php index 51044998e15e0e20520f690e21bcb0fd51f581d5..e9edbf4241fd0fa6d0decfeacad347b10aa2c04a 100644 --- a/app/code/Magento/Quote/Api/ShippingMethodManagementInterface.php +++ b/app/code/Magento/Quote/Api/ShippingMethodManagementInterface.php @@ -26,6 +26,24 @@ interface ShippingMethodManagementInterface */ public function set($cartId, $carrierCode, $methodCode); + /** + * Estimate shipping + * + * @param int $cartId The shopping cart ID. + * @param \Magento\Quote\Api\Data\EstimateAddressInterface $address The estimate address + * @return \Magento\Quote\Api\Data\ShippingMethodInterface[] An array of shipping methods. + */ + public function estimateByAddress($cartId, \Magento\Quote\Api\Data\EstimateAddressInterface $address); + + /** + * Estimate shipping + * + * @param int $cartId The shopping cart ID. + * @param int $addressId The estimate address id + * @return \Magento\Quote\Api\Data\ShippingMethodInterface[] An array of shipping methods. + */ + public function estimateByAddressId($cartId, $addressId); + /** * Returns selected shipping method for a specified quote. * diff --git a/app/code/Magento/Quote/Model/EstimateAddress.php b/app/code/Magento/Quote/Model/EstimateAddress.php new file mode 100644 index 0000000000000000000000000000000000000000..652f8a00f685c9ac36752c1463dda9a5e9f592d4 --- /dev/null +++ b/app/code/Magento/Quote/Model/EstimateAddress.php @@ -0,0 +1,119 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Quote\Model; + +use Magento\Framework\Model\AbstractExtensibleModel; +use Magento\Quote\Api\Data\EstimateAddressInterface; + +class EstimateAddress extends AbstractExtensibleModel implements EstimateAddressInterface +{ + /** + * Get region name + * + * @return string + */ + public function getRegion() + { + return $this->getData(self::KEY_REGION); + } + + /** + * Set region name + * + * @param string $region + * @return $this + */ + public function setRegion($region) + { + return $this->setData(self::KEY_REGION, $region); + } + + /** + * Get region id + * + * @return int + */ + public function getRegionId() + { + return $this->getData(self::KEY_REGION_ID); + } + + /** + * Set region id + * + * @param int $regionId + * @return $this + */ + public function setRegionId($regionId) + { + return $this->setData(self::KEY_REGION_ID, $regionId); + } + + /** + * Get country id + * + * @return string + */ + public function getCountryId() + { + return $this->getData(self::KEY_COUNTRY_ID); + } + + /** + * Set country id + * + * @param string $countryId + * @return $this + */ + public function setCountryId($countryId) + { + return $this->setData(self::KEY_COUNTRY_ID, $countryId); + } + + /** + * Get postcode + * + * @return string + */ + public function getPostcode() + { + return $this->getData(self::KEY_POSTCODE); + } + + /** + * Set postcode + * + * @param string $postcode + * @return $this + */ + public function setPostcode($postcode) + { + return $this->setData(self::KEY_POSTCODE, $postcode); + } + + /** + * Retrieve existing extension attributes object or create a new one. + * + * @return \Magento\Quote\Api\Data\EstimateAddressExtensionInterface|null + */ + public function getExtensionAttributes() + { + return $this->_getExtensionAttributes(); + } + + /** + * Set an extension attributes object. + * + * @param \Magento\Quote\Api\Data\EstimateAddressExtensionInterface $extensionAttributes + * @return $this + */ + public function setExtensionAttributes( + \Magento\Quote\Api\Data\EstimateAddressExtensionInterface $extensionAttributes + ) { + $this->_setExtensionAttributes($extensionAttributes); + } +} diff --git a/app/code/Magento/Quote/Model/ShippingMethodManagement.php b/app/code/Magento/Quote/Model/ShippingMethodManagement.php index c1dc45aee4a479b3bfaa1f8671aadd57f9a8ad01..f8a39533b4233cf77b9365821857ca0e973ada0c 100644 --- a/app/code/Magento/Quote/Model/ShippingMethodManagement.php +++ b/app/code/Magento/Quote/Model/ShippingMethodManagement.php @@ -33,18 +33,29 @@ class ShippingMethodManagement implements ShippingMethodManagementInterface */ protected $converter; + /** + * Customer Address repository + * + * @var \Magento\Customer\Api\AddressRepositoryInterface + */ + protected $addressRepository; + /** * Constructs a shipping method read service object. * * @param QuoteRepository $quoteRepository Quote repository. * @param \Magento\Quote\Model\Cart\ShippingMethodConverter $converter Shipping method converter. + * @param \Magento\Customer\Api\AddressRepositoryInterface $addressRepository Customer Address repository + * */ public function __construct( QuoteRepository $quoteRepository, - Cart\ShippingMethodConverter $converter + Cart\ShippingMethodConverter $converter, + \Magento\Customer\Api\AddressRepositoryInterface $addressRepository ) { $this->quoteRepository = $quoteRepository; $this->converter = $converter; + $this->addressRepository = $addressRepository; } /** @@ -146,4 +157,78 @@ class ShippingMethodManagement implements ShippingMethodManagementInterface } return true; } + + /** + * {@inheritDoc} + */ + public function estimateByAddress($cartId, \Magento\Quote\Api\Data\EstimateAddressInterface $address) + { + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->quoteRepository->getActive($cartId); + + // no methods applicable for empty carts or carts with virtual products + if ($quote->isVirtual() || 0 == $quote->getItemsCount()) { + return []; + } + + return $this->getEstimatedRates( + $quote, + $address->getCountryId(), + $address->getPostcode(), + $address->getRegionId(), + $address->getRegion() + ); + } + + /** + * {@inheritDoc} + */ + public function estimateByAddressId($cartId, $addressId) + { + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->quoteRepository->getActive($cartId); + + // no methods applicable for empty carts or carts with virtual products + if ($quote->isVirtual() || 0 == $quote->getItemsCount()) { + return []; + } + $address = $this->addressRepository->getById($addressId); + + return $this->getEstimatedRates( + $quote, + $address->getCountryId(), + $address->getPostcode(), + $address->getRegionId(), + $address->getRegion() + ); + } + + /** + * Get estimated rates + * + * @param Quote $quote + * @param int $country + * @param string $postcode + * @param int $regionId + * @param string $region + * @return \Magento\Quote\Api\Data\ShippingMethodInterface[] An array of shipping methods. + */ + protected function getEstimatedRates(\Magento\Quote\Model\Quote $quote, $country, $postcode, $regionId, $region) + { + $output = []; + $shippingAddress = $quote->getShippingAddress(); + $shippingAddress->setCountryId($country); + $shippingAddress->setPostcode($postcode); + $shippingAddress->setRegionId($regionId); + $shippingAddress->setRegion($region); + $shippingAddress->setCollectShippingRates(true); + $shippingAddress->collectShippingRates(); + $shippingRates = $shippingAddress->getGroupedAllShippingRates(); + foreach ($shippingRates as $carrierRates) { + foreach ($carrierRates as $rate) { + $output[] = $this->converter->modelToDataObject($rate, $quote->getQuoteCurrencyCode()); + } + } + return $output; + } } diff --git a/app/code/Magento/Quote/composer.json b/app/code/Magento/Quote/composer.json index f58331308612ac84cf4b8e0e7a42328671b2450e..05d09f86f706c1689b7d04bf1f05527d584c2ff2 100644 --- a/app/code/Magento/Quote/composer.json +++ b/app/code/Magento/Quote/composer.json @@ -3,26 +3,26 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-rule": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-sales-sequence": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-rule": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-sales-sequence": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Quote/etc/di.xml b/app/code/Magento/Quote/etc/di.xml index a9c14a1991ffbe85f900d457d5fb7c7193f554a8..66cae592e21018589902a907529cbcc87007c8e4 100644 --- a/app/code/Magento/Quote/etc/di.xml +++ b/app/code/Magento/Quote/etc/di.xml @@ -37,6 +37,7 @@ <preference for="Magento\Quote\Api\GuestBillingAddressManagementInterface" type="Magento\Quote\Model\GuestCart\GuestBillingAddressManagement" /> <preference for="Magento\Quote\Api\GuestAddressDetailsManagementInterface" type="Magento\Quote\Model\GuestCart\GuestAddressDetailsManagement" /> <preference for="Magento\Quote\Api\GuestCartTotalManagementInterface" type="\Magento\Quote\Model\GuestCart\GuestCartTotalManagement" /> + <preference for="Magento\Quote\Api\Data\EstimateAddressInterface" type="Magento\Quote\Model\EstimateAddress" /> <type name="Magento\Webapi\Controller\Rest\ParamsOverrider"> <arguments> <argument name="paramOverriders" xsi:type="array"> diff --git a/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php index f786c95ab8b8a38faab8fbea1e2ff5e0d26fab18..335952ca4de8b007e49860881a68faea0f09d3dc 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Filter; /** @@ -42,6 +40,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic * @param string $fieldId * @param bool $visibility * + * @codeCoverageIgnore * @return void */ public function setFieldVisibility($fieldId, $visibility) @@ -95,6 +94,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic * @param string $key * @param string $value * @return $this + * @codeCoverageIgnore */ public function addReportTypeOption($key, $value) { @@ -113,7 +113,13 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic /** @var \Magento\Framework\Data\Form $form */ $form = $this->_formFactory->create( - ['data' => ['id' => 'filter_form', 'action' => $actionUrl, 'method' => 'get']] + [ + 'data' => [ + 'id' => 'filter_form', + 'action' => $actionUrl, + 'method' => 'get' + ] + ] ); $htmlIdPrefix = 'sales_report_'; @@ -127,7 +133,11 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic $fieldset->addField( 'report_type', 'select', - ['name' => 'report_type', 'options' => $this->_reportTypeOptions, 'label' => __('Date Used')] + [ + 'name' => 'report_type', + 'options' => $this->_reportTypeOptions, + 'label' => __('Date Used') + ] ); $fieldset->addField( diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid.php index 9fe1fa27a2c481ff73d35930f66aec1e5ea298e6..463339d2949ad37ca67bdb46c17ea109bb77ddb5 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml; /** @@ -81,7 +79,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid { $filter = $this->getParam($this->getVarNameFilter(), null); - if (is_null($filter)) { + if (null === $filter) { $filter = $this->_defaultFilter; } @@ -154,7 +152,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Get allowed stores * - * @return array + * @return array|\int[] */ protected function _getAllowedStoreIds() { @@ -205,7 +203,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid * Set visibility of store switcher * * @param bool $visible - * + * @codeCoverageIgnore * @return void */ public function setStoreSwitcherVisibility($visible = true) @@ -215,6 +213,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return visibility of store switcher + * @codeCoverageIgnore * * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) @@ -226,6 +225,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return store switcher html + * @codeCoverageIgnore * * @return string */ @@ -238,8 +238,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid * Set visibility of date filter * * @param bool $visible - * * @return void + * @codeCoverageIgnore */ public function setDateFilterVisibility($visible = true) { @@ -248,6 +248,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return visibility of date filter + * @codeCoverageIgnore * * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) @@ -259,6 +260,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return date filter html + * @codeCoverageIgnore * * @return string */ @@ -289,6 +291,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return refresh button html + * @codeCoverageIgnore * * @return string */ @@ -302,8 +305,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid * * @param string $name * @param string $value - * * @return void + * @codeCoverageIgnore */ public function setFilter($name, $value) { @@ -331,8 +334,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid * Set sub-report rows count * * @param int $size - * * @return void + * @codeCoverageIgnore */ public function setSubReportSize($size) { @@ -341,6 +344,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return sub-report rows count + * @codeCoverageIgnore * * @return int */ @@ -353,6 +357,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid * Retrieve errors * * @return array + * @codeCoverageIgnore */ public function getErrors() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php index a8507b2bc510f322728ea1775d729e34e19c10c1..f169dd2c8e5dea332af923133738b55536462e34 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php @@ -71,6 +71,8 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended } /** + * Pseudo constructor + * * @return void */ protected function _construct() @@ -86,6 +88,10 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended } /** + * Get resource collection name + * + * @codeCoverageIgnore + * * @return string */ public function getResourceCollectionName() @@ -339,9 +345,11 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended } /** - * @param array $storeIds + * StoreIds setter * + * @param array $storeIds * @return $this + * @codeCoverageIgnore */ public function setStoreIds($storeIds) { @@ -396,6 +404,7 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended * @param \Magento\Framework\Object $filterData * @return $this * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * @codeCoverageIgnore */ protected function _addCustomFilter($collection, $filterData) { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid/Column/Renderer/Currency.php b/app/code/Magento/Reports/Block/Adminhtml/Grid/Column/Renderer/Currency.php index ac9cf8c700bd7efc13558d6fb0161388dd2de4e3..30555dbca8d2b14a12cff014d8e3da1b667a6591 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid/Column/Renderer/Currency.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid/Column/Renderer/Currency.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Grid\Column\Renderer; /** @@ -24,15 +22,15 @@ class Currency extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\Curren public function render(\Magento\Framework\Object $row) { $data = $row->getData($this->getColumn()->getIndex()); - $currency_code = $this->_getCurrencyCode($row); + $currencyCode = $this->_getCurrencyCode($row); - if (!$currency_code) { + if (!$currencyCode) { return $data; } $data = floatval($data) * $this->_getRate($row); $data = sprintf("%f", $data); - $data = $this->_localeCurrency->getCurrency($currency_code)->toCurrency($data); + $data = $this->_localeCurrency->getCurrency($currencyCode)->toCurrency($data); return $data; } } diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid/Shopcart.php b/app/code/Magento/Reports/Block/Adminhtml/Grid/Shopcart.php index 023f4f4bac729ed0fb6e44b7ffc123a595464b1a..0c635887cf0bc156ba384355eacf96de09ab76cd 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid/Shopcart.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid/Shopcart.php @@ -28,6 +28,7 @@ class Shopcart extends \Magento\Backend\Block\Widget\Grid\Extended /** * StoreIds setter + * @codeCoverageIgnore * * @param array $storeIds * @return $this diff --git a/app/code/Magento/Reports/Block/Adminhtml/Product.php b/app/code/Magento/Reports/Block/Adminhtml/Product.php index 9c5cad9fc76f8398a9cef6677f51183ee0d94e9d..4adc6dccbc09aa166b571c6e73e39ace1ed60187 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Product.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Product.php @@ -13,7 +13,7 @@ namespace Magento\Reports\Block\Adminhtml; class Product extends \Magento\Backend\Block\Widget\Grid\Container { /** - * @return void + * {@inheritdoc} */ protected function _construct() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers.php index d872439b7f8e6417d2ea613f868105c0764a20fb..32a25599702e9d312ac79160b5d0d5b8f38199ca 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Bestsellers extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Bestsellers extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers/Grid.php index d6820a811970fded00679f36d5ad6564ccae7e36..bedef6d74acceb8be7e61ef3d045faf17f1c98be 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers/Grid.php @@ -14,12 +14,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Bestsellers; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -28,7 +31,8 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} + * @codeCoverageIgnore */ public function getResourceCollectionName() { @@ -36,7 +40,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} */ protected function _prepareColumns() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons.php index c14f1c248b15bdbd2c3ee8a859d9a3fe32c41c6d..cfd20f5e3a468e5948e746da801ddc2b8291db3d 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Coupons extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Coupons extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons/Grid.php index c04265b1c531f9c8eaef861a81eacdd8998afc84..cf79f4c06682831286c114354b47d1943008b5ed 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons/Grid.php @@ -14,12 +14,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Coupons; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -29,7 +32,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { @@ -41,7 +44,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function _prepareColumns() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Grid/Column/Renderer/Date.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Grid/Column/Renderer/Date.php index b18faf62ef5530eefda4516a5de9410c0277468a..30b6fccb13435e396ce06d6383768b301f0f399c 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Grid/Column/Renderer/Date.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Grid/Column/Renderer/Date.php @@ -13,6 +13,8 @@ use Magento\Framework\Locale\Bundle\DataBundle; class Date extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\Date { /** + * Constructor + * * @param \Magento\Backend\Block\Context $context * @param \Magento\Framework\Locale\ResolverInterface $localeResolver * @param array $data diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced.php index 3b6cf45846551dae90daad88e9d1b02f3e186793..e6de75fb9545e9723b5a02f1e87ee9f4cc434259 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Invoiced extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Invoiced extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php index 414c2e775872a1e9a36795e820c9b417533c1416..854520bafad351539f350b4f1c9369db8fdd0372 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Sales\Invoiced; /** @@ -17,12 +15,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Invoiced; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY condition + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -31,18 +32,17 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { - return $this->getFilterData()->getData( - 'report_type' - ) == - 'created_at_invoice' ? 'Magento\Sales\Model\Resource\Report\Invoiced\Collection\Invoiced' : 'Magento\Sales\Model\Resource\Report\Invoiced\Collection\Order'; + return ($this->getFilterData()->getData('report_type')) == 'created_at_invoice' + ? 'Magento\Sales\Model\Resource\Report\Invoiced\Collection\Invoiced' + : 'Magento\Sales\Model\Resource\Report\Invoiced\Collection\Order'; } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} */ protected function _prepareColumns() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded.php index 6ff26a3822b8a7f76f37ff4a046314317f538db0..c48dee92771a07839ef2e352350d0ed9a52f8446 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Refunded extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Refunded extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php index e5f68a315f74013a51de8df19dc74cfbc996efb5..c3964e9675cd7f4b67807df54e548cef34028d13 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Sales\Refunded; /** @@ -17,12 +15,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Refunded; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -31,18 +32,17 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { - return $this->getFilterData()->getData( - 'report_type' - ) == - 'created_at_refunded' ? 'Magento\Sales\Model\Resource\Report\Refunded\Collection\Refunded' : 'Magento\Sales\Model\Resource\Report\Refunded\Collection\Order'; + return $this->getFilterData()->getData('report_type') == 'created_at_refunded' + ? 'Magento\Sales\Model\Resource\Report\Refunded\Collection\Refunded' + : 'Magento\Sales\Model\Resource\Report\Refunded\Collection\Order'; } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} */ protected function _prepareColumns() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales.php index 6c6ca70730a2111e637426a159365a973a5be8e3..ad43f74e52646da9445d0d8a2c12500f3b761f8f 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Sales extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Sales extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php index 012e170b2c269dac90cdd6b43d1461edf4aa4ee4..6f7b99bb8941fe4cef1547a952e9e00583bfb9c0 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Sales\Sales; /** @@ -17,12 +15,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Sales; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -31,18 +32,18 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { - return $this->getFilterData()->getData( - 'report_type' - ) == - 'updated_at_order' ? 'Magento\Sales\Model\Resource\Report\Order\Updatedat\Collection' : 'Magento\Sales\Model\Resource\Report\Order\Collection'; + return $this->getFilterData()->getData('report_type') == 'updated_at_order' + ? 'Magento\Sales\Model\Resource\Report\Order\Updatedat\Collection' + : 'Magento\Sales\Model\Resource\Report\Order\Collection'; } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} + * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function _prepareColumns() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping.php index 0499c0ee07af14dbf113e5a4fc6aa388bdb4f04e..e72406788d3ec9a30fe366c536e7d68d80fb222d 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Shipping extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Shipping extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php index ee594aaa3447565990652114cee7ba498b1f3011..28d8bbe6b196fb55963f61797c95a09962960e50 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Sales\Shipping; /** @@ -17,12 +15,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Shipping; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * Group by criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -32,18 +33,17 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { - return $this->getFilterData()->getData( - 'report_type' - ) == - 'created_at_shipment' ? 'Magento\Sales\Model\Resource\Report\Shipping\Collection\Shipment' : 'Magento\Sales\Model\Resource\Report\Shipping\Collection\Order'; + return $this->getFilterData()->getData('report_type') == 'created_at_shipment' + ? 'Magento\Sales\Model\Resource\Report\Shipping\Collection\Shipment' + : 'Magento\Sales\Model\Resource\Report\Shipping\Collection\Order'; } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} */ protected function _prepareColumns() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax.php index 767760eabb655e8849f345c7db16503ce145432e..ed27f1616518c78751c902e7433f2c8a35b86511 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Tax extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Tax extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php index 48c3a647299b4b3cc76dde1dd63ed36a0e05f7a2..7196f1ff332533630ba0241383ffc6cd6a12e030 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Sales\Tax; /** @@ -17,16 +15,22 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Tax; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** + * Config factory + * * @var \Magento\Sales\Model\Order\ConfigFactory */ protected $_configFactory; /** + * Constructor + * * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Backend\Helper\Data $backendHelper * @param \Magento\Reports\Model\Resource\Report\Collection\Factory $resourceFactory @@ -49,7 +53,8 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -59,18 +64,17 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { - return $this->getFilterData()->getData( - 'report_type' - ) == - 'updated_at_order' ? 'Magento\Tax\Model\Resource\Report\Updatedat\Collection' : 'Magento\Tax\Model\Resource\Report\Collection'; + return $this->getFilterData()->getData('report_type') == 'updated_at_order' + ? 'Magento\Tax\Model\Resource\Report\Updatedat\Collection' + : 'Magento\Tax\Model\Resource\Report\Collection'; } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} */ protected function _prepareColumns() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php b/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php index 690c98b4d692559de2d645c23623801f0ebe4705..df114f5e653e6b121874ab9aad21a71174abcb43 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml; /** @@ -16,36 +14,8 @@ namespace Magento\Reports\Block\Adminhtml; class Wishlist extends \Magento\Backend\Block\Template { /** - * @var int - */ - public $wishlists_count; - - /** - * @var int - */ - public $items_bought; - - /** - * @var int - */ - public $shared_count; - - /** - * @var int - */ - public $referrals_count; - - /** - * @var int - */ - public $conversions_count; - - /** - * @var int - */ - public $customer_with_wishlist; - - /** + * Template file + * * @var string */ protected $_template = 'report/wishlist.phtml'; @@ -58,6 +28,8 @@ class Wishlist extends \Magento\Backend\Block\Template protected $_wishlistFactory; /** + * Constructor + * * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Reports\Model\Resource\Wishlist\CollectionFactory $wishlistFactory * @param array $data @@ -72,9 +44,9 @@ class Wishlist extends \Magento\Backend\Block\Template } /** - * @return $this + * {@inheritdoc} */ - public function _beforeToHtml() + protected function _beforeToHtml() { $this->setChild( 'grid', diff --git a/app/code/Magento/Reports/Block/Product/AbstractProduct.php b/app/code/Magento/Reports/Block/Product/AbstractProduct.php index dfe51eea66fed23301c4f8d4a0d9bdb6945e4d69..cf420b4d3cebeddc38077c1f3619ac4ae5fcf403 100644 --- a/app/code/Magento/Reports/Block/Product/AbstractProduct.php +++ b/app/code/Magento/Reports/Block/Product/AbstractProduct.php @@ -81,11 +81,11 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr } /** - * Retrieve Product Index model instance + * Public method for retrieve Product Index model * * @return \Magento\Reports\Model\Product\Index\AbstractIndex */ - protected function _getModel() + public function getModel() { try { $model = $this->_indexFactory->get($this->_indexType); @@ -96,16 +96,6 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr return $model; } - /** - * Public method for retrieve Product Index model - * - * @return \Magento\Reports\Model\Product\Index\AbstractIndex - */ - public function getModel() - { - return $this->_getModel(); - } - /** * Retrieve Index Product Collection * @@ -116,14 +106,14 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr if ($this->_collection === null) { $attributes = $this->_catalogConfig->getProductAttributes(); - $this->_collection = $this->_getModel()->getCollection()->addAttributeToSelect($attributes); + $this->_collection = $this->getModel()->getCollection()->addAttributeToSelect($attributes); if ($this->getCustomerId()) { $this->_collection->setCustomerId($this->getCustomerId()); } $this->_collection->excludeProductIds( - $this->_getModel()->getExcludeProductIds() + $this->getModel()->getExcludeProductIds() )->addUrlRewrite()->setPageSize( $this->getPageSize() )->setCurPage( @@ -152,7 +142,7 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr */ public function getCount() { - if (!$this->_getModel()->getCount()) { + if (!$this->getModel()->getCount()) { return 0; } return $this->getItemsCollection()->count(); diff --git a/app/code/Magento/Reports/Block/Product/Compared.php b/app/code/Magento/Reports/Block/Product/Compared.php index 6693d0053ea87edac053ff4e54bb3ada3de04152..67e3d641b829a4c8add0ba1df7fa85749c9f79f7 100644 --- a/app/code/Magento/Reports/Block/Product/Compared.php +++ b/app/code/Magento/Reports/Block/Product/Compared.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Product; /** @@ -15,6 +13,9 @@ namespace Magento\Reports\Block\Product; */ class Compared extends \Magento\Reports\Block\Product\AbstractProduct { + /** + * Config path for compared products count + */ const XML_PATH_RECENTLY_COMPARED_COUNT = 'catalog/recently_products/compared_count'; /** @@ -34,7 +35,10 @@ class Compared extends \Magento\Reports\Block\Product\AbstractProduct if ($this->hasData('page_size')) { return $this->getData('page_size'); } - return $this->_scopeConfig->getValue(self::XML_PATH_RECENTLY_COMPARED_COUNT, \Magento\Store\Model\ScopeInterface::SCOPE_STORE); + return $this->_scopeConfig->getValue( + self::XML_PATH_RECENTLY_COMPARED_COUNT, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ); } /** diff --git a/app/code/Magento/Reports/Block/Product/Viewed.php b/app/code/Magento/Reports/Block/Product/Viewed.php index 947c90c89505ce4e8957ff7870c13862da31f526..9a689ec5a6da59c758e9b85e01125a27f897089e 100644 --- a/app/code/Magento/Reports/Block/Product/Viewed.php +++ b/app/code/Magento/Reports/Block/Product/Viewed.php @@ -4,17 +4,20 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Product; +use \Magento\Framework\Object\IdentityInterface; + /** * Reports Recently Viewed Products Block * * @author Magento Core Team <core@magentocommerce.com> */ -class Viewed extends \Magento\Reports\Block\Product\AbstractProduct implements \Magento\Framework\Object\IdentityInterface +class Viewed extends AbstractProduct implements IdentityInterface { + /** + * Config path to recently viewed product count + */ const XML_PATH_RECENTLY_VIEWED_COUNT = 'catalog/recently_products/viewed_count'; /** @@ -34,7 +37,10 @@ class Viewed extends \Magento\Reports\Block\Product\AbstractProduct implements \ if ($this->hasData('page_size')) { return $this->getData('page_size'); } - return $this->_scopeConfig->getValue(self::XML_PATH_RECENTLY_VIEWED_COUNT, \Magento\Store\Model\ScopeInterface::SCOPE_STORE); + return $this->_scopeConfig->getValue( + self::XML_PATH_RECENTLY_VIEWED_COUNT, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ); } /** diff --git a/app/code/Magento/Reports/Helper/Data.php b/app/code/Magento/Reports/Helper/Data.php index 50856d3b37cde36d9b1066dcc9aa5d608a004b9b..c33b0791a559ec899c8477972f803320245df473 100644 --- a/app/code/Magento/Reports/Helper/Data.php +++ b/app/code/Magento/Reports/Helper/Data.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - /** * Reports data helper */ @@ -23,16 +21,22 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper const REPORT_PERIOD_TYPE_YEAR = 'year'; /** + * Item factory + * * @var \Magento\Reports\Model\ItemFactory */ protected $_itemFactory; /** + * Constructor + * * @param \Magento\Framework\App\Helper\Context $context * @param \Magento\Reports\Model\ItemFactory $itemFactory */ - public function __construct(\Magento\Framework\App\Helper\Context $context, \Magento\Reports\Model\ItemFactory $itemFactory) - { + public function __construct( + \Magento\Framework\App\Helper\Context $context, + \Magento\Reports\Model\ItemFactory $itemFactory + ) { parent::__construct($context); $this->_itemFactory = $itemFactory; } @@ -55,7 +59,7 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper $dateStart = new \DateTime($from); $dateEnd = new \DateTime($to); - while ($dateStart->diff($dateEnd)->invert = 0) { + while ($dateStart->diff($dateEnd)->invert == 0) { switch ($period) { case self::REPORT_PERIOD_TYPE_DAY: $intervals[] = $dateStart->format('Y-m-d'); diff --git a/app/code/Magento/Reports/Model/Flag.php b/app/code/Magento/Reports/Model/Flag.php index d289a0ce35412498b963fb7ce3e3059591fcf7f5..3782a655f24862cbf5dee4291ed8ab0832a9fa3e 100644 --- a/app/code/Magento/Reports/Model/Flag.php +++ b/app/code/Magento/Reports/Model/Flag.php @@ -30,6 +30,7 @@ class Flag extends \Magento\Framework\Flag /** * Setter for flag code + * @codeCoverageIgnore * * @param string $code * @return $this diff --git a/app/code/Magento/Reports/Model/Grouped/Collection.php b/app/code/Magento/Reports/Model/Grouped/Collection.php index 6f8e9d561dad6cd65a5ea80b76e2a15465c1f50f..3f00e36c1a7a7ec4d78f975baaa33bd3bc3f747d 100644 --- a/app/code/Magento/Reports/Model/Grouped/Collection.php +++ b/app/code/Magento/Reports/Model/Grouped/Collection.php @@ -25,6 +25,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Set column to group by + * @codeCoverageIgnore * * @param string $column * @return $this @@ -61,6 +62,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Setter for resource collection + * @codeCoverageIgnore * * @param DbCollection $collection * @return $this diff --git a/app/code/Magento/Reports/Model/Item.php b/app/code/Magento/Reports/Model/Item.php index ecc9c805e91722136affdff251c4123ca873613c..01a60c397c5eab8bc83b6345979e1f982601ee9b 100644 --- a/app/code/Magento/Reports/Model/Item.php +++ b/app/code/Magento/Reports/Model/Item.php @@ -19,6 +19,7 @@ class Item extends \Magento\Framework\Object /** * Set is empty indicator + * @codeCoverageIgnore * * @param bool $flag * @return $this @@ -31,6 +32,7 @@ class Item extends \Magento\Framework\Object /** * Get is empty indicator + * @codeCoverageIgnore * * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) @@ -49,6 +51,7 @@ class Item extends \Magento\Framework\Object /** * Get children + * @codeCoverageIgnore * * @return array */ @@ -59,6 +62,7 @@ class Item extends \Magento\Framework\Object /** * Set children + * @codeCoverageIgnore * * @param array $children * @return $this diff --git a/app/code/Magento/Reports/Model/Resource/Event/Collection.php b/app/code/Magento/Reports/Model/Resource/Event/Collection.php index 7a515823998ef5c5787fbd9fdb1fd72f4f30ee00..94124028fdb3716c430e6c44bfdf3497786988b0 100644 --- a/app/code/Magento/Reports/Model/Resource/Event/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Event/Collection.php @@ -32,6 +32,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac /** * Add store ids filter + * @codeCoverageIgnore * * @param array $storeIds * @return $this diff --git a/app/code/Magento/Reports/Model/Resource/Order/Collection.php b/app/code/Magento/Reports/Model/Resource/Order/Collection.php index 60b24016381f63220ffc29feabe48525f12be626..07c2e2aa8c4a76d1d262f38904d52b00ea622f99 100644 --- a/app/code/Magento/Reports/Model/Resource/Order/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Order/Collection.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Model\Resource\Order; use Magento\Framework\DB\Select; @@ -40,26 +38,36 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection protected $_scopeConfig; /** + * Store manager instance + * * @var \Magento\Store\Model\StoreManagerInterface */ protected $_storeManager; /** + * Locale date instance + * * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface */ protected $_localeDate; /** + * Order config instance + * * @var \Magento\Sales\Model\Order\Config */ protected $_orderConfig; /** + * Reports order factory + * * @var \Magento\Sales\Model\Resource\Report\OrderFactory */ protected $_reportOrderFactory; /** + * Constructor + * * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy @@ -128,6 +136,7 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection * Retrieve is live flag for rep * * @return bool + * @codeCoverageIgnore */ public function isLive() { @@ -162,7 +171,7 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection */ protected function _getSalesAmountExpression() { - if (is_null($this->_salesAmountExpression)) { + if (null === $this->_salesAmountExpression) { $adapter = $this->getConnection(); $expressionTransferObject = new \Magento\Framework\Object( [ @@ -257,8 +266,8 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection * Prepare report summary from aggregated data * * @param string $range - * @param mixed $customStart - * @param mixed $customEnd + * @param string|null $customStart + * @param string|null $customEnd * @return $this */ protected function _prepareSummaryAggregated($range, $customStart, $customEnd) @@ -271,13 +280,13 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection $rangePeriod = $this->_getRangeExpressionForAttribute($range, 'main_table.period'); $tableName = $this->getConnection()->quoteIdentifier('main_table.period'); - $rangePeriod2 = str_replace($tableName, "MIN({$tableName})", $rangePeriod); + $rangePeriodAggregateStmt = str_replace($tableName, "MIN({$tableName})", $rangePeriod); $this->getSelect()->columns( [ 'revenue' => 'SUM(main_table.total_revenue_amount)', 'quantity' => 'SUM(main_table.orders_count)', - 'range' => $rangePeriod2, + 'range' => $rangePeriodAggregateStmt, ] )->order( 'range' @@ -349,8 +358,8 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection * * @param string $range * @param string $attribute - * @param mixed $from - * @param mixed $to + * @param string|null $from + * @param string|null $to * @return string */ protected function _getTZRangeOffsetExpression($range, $attribute, $from = null, $to = null) @@ -665,7 +674,7 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection /** * Set store filter collection * - * @param array $storeIds + * @param int[] $storeIds * @return $this */ public function setStoreIds($storeIds) @@ -778,16 +787,15 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection */ public function addSumAvgTotals($storeId = 0) { - $adapter = $this->getConnection(); - $baseSubtotalRefunded = $adapter->getIfNullSql('main_table.base_subtotal_refunded', 0); - $baseSubtotalCanceled = $adapter->getIfNullSql('main_table.base_subtotal_canceled', 0); - $baseDiscountCanceled = $adapter->getIfNullSql('main_table.base_discount_canceled', 0); - /** * calculate average and total amount */ - $expr = $storeId == - 0 ? "(main_table.base_subtotal -\n {$baseSubtotalRefunded} - {$baseSubtotalCanceled} - ABS(main_table.base_discount_amount) -\n {$baseDiscountCanceled}) * main_table.base_to_global_rate" : "main_table.base_subtotal - {$baseSubtotalCanceled} - {$baseSubtotalRefunded} -\n ABS(main_table.base_discount_amount) - {$baseDiscountCanceled}"; + $expr = $this->getTotalsExpression( + $storeId, + $this->getConnection()->getIfNullSql('main_table.base_subtotal_refunded', 0), + $this->getConnection()->getIfNullSql('main_table.base_subtotal_canceled', 0), + $this->getConnection()->getIfNullSql('main_table.base_discount_canceled', 0) + ); $this->getSelect()->columns( ['orders_avg_amount' => "AVG({$expr})"] @@ -798,6 +806,28 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection return $this; } + /** + * Get SQL expression for totals + * + * @param int $storeId + * @param string $baseSubtotalRefunded + * @param string $baseSubtotalCanceled + * @param string $baseDiscountCanceled + * @return string + */ + protected function getTotalsExpression( + $storeId, + $baseSubtotalRefunded, + $baseSubtotalCanceled, + $baseDiscountCanceled + ) { + $template = ($storeId != 0) + ? 'main_table.base_subtotal - %2$s - %1$s - ABS(main_table.base_discount_amount) - %3$s' + : '(main_table.base_subtotal - %1$s - %2$s - ABS(main_table.base_discount_amount) - %3$s) ' + . ' * main_table.base_to_global_rate'; + return sprintf($template, $baseSubtotalRefunded, $baseSubtotalCanceled, $baseDiscountCanceled); + } + /** * Sort order by total amount * @@ -869,6 +899,7 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection * Initialize initial fields to select * * @return $this + * @codeCoverageIgnore */ protected function _initInitialFieldsToSelect() { diff --git a/app/code/Magento/Reports/Model/Resource/Product/Collection.php b/app/code/Magento/Reports/Model/Resource/Product/Collection.php index 3eb9ac629a26e8fdcd075618a98ea3c26357ce1a..7df4b5dc4d9d0bc3616cb6221d4609ad158f8f40 100644 --- a/app/code/Magento/Reports/Model/Resource/Product/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Product/Collection.php @@ -147,8 +147,8 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Set Type for COUNT SQL Select + * @codeCoverageIgnore * - * @codeCoverageIgnoreStart * @param int $type * @return $this */ @@ -160,6 +160,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Set product entity id + * @codeCoverageIgnore * * @param string $entityId * @return $this @@ -172,6 +173,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Get product entity id + * @codeCoverageIgnore * * @return int */ @@ -182,6 +184,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Set product entity table name + * @codeCoverageIgnore * * @param string $value * @return $this @@ -194,6 +197,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Get product entity table name + * @codeCoverageIgnore * * @return string */ @@ -204,6 +208,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Get product attribute set id + * @codeCoverageIgnore * * @return int */ @@ -214,6 +219,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Set product attribute set id + * @codeCoverageIgnore * * @param int $value * @return $this @@ -223,7 +229,6 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection $this->_productEntityAttributeSetId = $value; return $this; } - //@codeCoverageIgnoreEnd /** * Join fields diff --git a/app/code/Magento/Reports/Model/Resource/Product/Index/AbstractIndex.php b/app/code/Magento/Reports/Model/Resource/Product/Index/AbstractIndex.php index 52d72406cb130d56d6a11e75ed1d68e139268287..45b1c2c5e9d51e3bbb6a0633c821187f731434df 100644 --- a/app/code/Magento/Reports/Model/Resource/Product/Index/AbstractIndex.php +++ b/app/code/Magento/Reports/Model/Resource/Product/Index/AbstractIndex.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Model\Resource\Product\Index; /** @@ -14,16 +12,22 @@ namespace Magento\Reports\Model\Resource\Product\Index; abstract class AbstractIndex extends \Magento\Framework\Model\Resource\Db\AbstractDb { /** + * DateItime instance + * * @var \Magento\Framework\Stdlib\DateTime */ protected $dateTime; /** + * Reports helper + * * @var \Magento\Reports\Model\Resource\Helper */ protected $_resourceHelper; /** + * Constructor + * * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Magento\Reports\Model\Resource\Helper $resourceHelper * @param \Magento\Framework\Stdlib\DateTime $dateTime @@ -55,7 +59,9 @@ abstract class AbstractIndex extends \Magento\Framework\Model\Resource\Db\Abstra return $this; } $adapter = $this->_getWriteAdapter(); - $select = $adapter->select()->from($this->getMainTable())->where('visitor_id = ?', $object->getVisitorId()); + $select = $adapter->select() + ->from($this->getMainTable()) + ->where('visitor_id = ?', $object->getVisitorId()); $rowSet = $select->query()->fetchAll(); foreach ($rowSet as $row) { @@ -76,7 +82,7 @@ abstract class AbstractIndex extends \Magento\Framework\Model\Resource\Db\Abstra if ($idx) { /** - * If we are here it means that we have two rows: one with known customer, but second just visitor is set + * If we are here it means that we have two rows: one with known customer and second with guest visitor * One row should be updated with customer_id, second should be deleted */ $adapter->delete($this->getMainTable(), ['index_id = ?' => $row['index_id']]); @@ -192,7 +198,7 @@ abstract class AbstractIndex extends \Magento\Framework\Model\Resource\Db\Abstra * Add information about product ids to visitor/customer * * @param \Magento\Framework\Object|\Magento\Reports\Model\Product\Index\AbstractIndex $object - * @param array $productIds + * @param int[] $productIds * @return $this */ public function registerIds(\Magento\Framework\Object $object, $productIds) diff --git a/app/code/Magento/Reports/Model/Resource/Product/Index/Collection/AbstractCollection.php b/app/code/Magento/Reports/Model/Resource/Product/Index/Collection/AbstractCollection.php index b172b4e053c274e51f42417e56f381343b2abb9d..77ea700b2cc00c843a8df396649870d0e9009b67 100644 --- a/app/code/Magento/Reports/Model/Resource/Product/Index/Collection/AbstractCollection.php +++ b/app/code/Magento/Reports/Model/Resource/Product/Index/Collection/AbstractCollection.php @@ -179,6 +179,7 @@ abstract class AbstractCollection extends \Magento\Catalog\Model\Resource\Produc /** * Set customer id, that will be used in 'whereCondition' + * @codeCoverageIgnore * * @param int $id * @return $this diff --git a/app/code/Magento/Reports/Model/Resource/Product/Index/Viewed.php b/app/code/Magento/Reports/Model/Resource/Product/Index/Viewed.php index 0ad3ffd330f063475affcd8cb56e36a9e5b4b7b8..93a22cf0011189fb11b3306525879f4f7b4685a1 100644 --- a/app/code/Magento/Reports/Model/Resource/Product/Index/Viewed.php +++ b/app/code/Magento/Reports/Model/Resource/Product/Index/Viewed.php @@ -17,6 +17,7 @@ class Viewed extends \Magento\Reports\Model\Resource\Product\Index\AbstractIndex * Initialize connection and main resource table * * @return void + * @codeCoverageIgnore */ protected function _construct() { diff --git a/app/code/Magento/Reports/Model/Resource/Report/AbstractReport.php b/app/code/Magento/Reports/Model/Resource/Report/AbstractReport.php index 84a6d7d6a25efac94bd4ff2f7f3935a5c2ee70c1..777d13232b2a349e64b58ff63cd0b382012232a6 100644 --- a/app/code/Magento/Reports/Model/Resource/Report/AbstractReport.php +++ b/app/code/Magento/Reports/Model/Resource/Report/AbstractReport.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Model\Resource\Report; /** @@ -22,21 +20,29 @@ abstract class AbstractReport extends \Magento\Framework\Model\Resource\Db\Abstr protected $_flag = null; /** + * Logger instance + * * @var \Psr\Log\LoggerInterface */ protected $_logger; /** + * Locale date instance + * * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface */ protected $_localeDate; /** + * Reports flag factory + * * @var \Magento\Reports\Model\FlagFactory */ protected $_reportsFlagFactory; /** + * Constructor + * * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate @@ -179,7 +185,7 @@ abstract class AbstractReport extends \Magento\Framework\Model\Resource\Db\Abstr * @param string $whereColumn * @param null|string|\DateTime $from * @param null|string|\DateTime $to - * @param array $additionalWhere + * @param [][] $additionalWhere * @param string $alias * @return \Magento\Framework\DB\Select */ @@ -281,12 +287,12 @@ abstract class AbstractReport extends \Magento\Framework\Model\Resource\Db\Abstr * * @param string $table * @param string $relatedTable - * @param array $joinCondition + * @param [] $joinCondition * @param string $column * @param string $whereColumn * @param string|null $from * @param string|null $to - * @param array $additionalWhere + * @param [][] $additionalWhere * @param string $alias * @param string $relatedAlias * @return \Magento\Framework\DB\Select @@ -353,7 +359,7 @@ abstract class AbstractReport extends \Magento\Framework\Model\Resource\Db\Abstr /** * Retrieve query for attribute with timezone conversion * - * @param string|array $table + * @param string|[] $table * @param string $column * @param null|mixed $from * @param null|mixed $to diff --git a/app/code/Magento/Reports/Model/Resource/Report/Collection.php b/app/code/Magento/Reports/Model/Resource/Report/Collection.php index 2de5f389f25247113bbb141ddfc84486d8ab7bd6..abc6db15ad0380ba97d6d0efc337961c4b775f65 100644 --- a/app/code/Magento/Reports/Model/Resource/Report/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Report/Collection.php @@ -96,6 +96,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Set period + * @codeCoverageIgnore * * @param int $period * @return $this @@ -108,6 +109,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Set interval + * @codeCoverageIgnore * * @param \DateTime $fromDate * @param \DateTime $toDate @@ -260,6 +262,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Set store ids + * @codeCoverageIgnore * * @param array $storeIds * @return $this @@ -272,6 +275,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Get store ids + * @codeCoverageIgnore * * @return array */ @@ -292,6 +296,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Set page size + * @codeCoverageIgnore * * @param int $size * @return $this @@ -304,6 +309,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Get page size + * @codeCoverageIgnore * * @return int */ diff --git a/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php b/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php index 234d520b32b126a6641fb8288b09c2e990fe19de..4575ec6394c844f38d4d871042095f612de90e9e 100644 --- a/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php +++ b/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php @@ -64,6 +64,7 @@ class AbstractCollection extends \Magento\Framework\Model\Resource\Db\Collection /** * Set array of columns that should be aggregated + * @codeCoverageIgnore * * @param array $columns * @return $this @@ -76,6 +77,7 @@ class AbstractCollection extends \Magento\Framework\Model\Resource\Db\Collection /** * Retrieve array of columns that should be aggregated + * @codeCoverageIgnore * * @return array */ @@ -86,6 +88,7 @@ class AbstractCollection extends \Magento\Framework\Model\Resource\Db\Collection /** * Set date range + * @codeCoverageIgnore * * @param mixed $from * @param mixed $to @@ -100,6 +103,7 @@ class AbstractCollection extends \Magento\Framework\Model\Resource\Db\Collection /** * Set period + * @codeCoverageIgnore * * @param string $period * @return $this @@ -218,6 +222,7 @@ class AbstractCollection extends \Magento\Framework\Model\Resource\Db\Collection /** * Setter for isSubTotals + * @codeCoverageIgnore * * @param bool $flag * @return $this diff --git a/app/code/Magento/Reports/Model/Resource/Report/Product/Viewed.php b/app/code/Magento/Reports/Model/Resource/Report/Product/Viewed.php index 56e658e56db51f51339f45c7d28785fe9281dd62..432ebc9b5d432e6f4653e1789e280a6a0a595c4f 100644 --- a/app/code/Magento/Reports/Model/Resource/Report/Product/Viewed.php +++ b/app/code/Magento/Reports/Model/Resource/Report/Product/Viewed.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - /** * Most viewed product report aggregate resource model * @@ -31,16 +29,22 @@ class Viewed extends \Magento\Sales\Model\Resource\Report\AbstractReport const AGGREGATION_YEARLY = 'report_viewed_product_aggregated_yearly'; /** + * Product resource instance + * * @var \Magento\Catalog\Model\Resource\Product */ protected $_productResource; /** + * Resource helper instance + * * @var \Magento\Reports\Model\Resource\Helper */ protected $_resourceHelper; /** + * Constructor + * * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate diff --git a/app/code/Magento/Reports/Model/Resource/Wishlist/Collection.php b/app/code/Magento/Reports/Model/Resource/Wishlist/Collection.php index 797b20da8555176e603785c511672062d90830ac..ab98d411ca05510003c9c9e4fc1cf7e8e2d7bfa7 100644 --- a/app/code/Magento/Reports/Model/Resource/Wishlist/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Wishlist/Collection.php @@ -60,6 +60,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac /** * Set wishlist table name + * @codeCoverageIgnore * * @param string $value * @return $this @@ -72,6 +73,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac /** * Retrieve wishlist table name + * @codeCoverageIgnore * * @return string */ diff --git a/app/code/Magento/Reports/Setup/InstallData.php b/app/code/Magento/Reports/Setup/InstallData.php index 071ed7c29645029f880b7af63cb0950259590f98..fef292ffb21a02c04131a4a1cd209555951f1496 100644 --- a/app/code/Magento/Reports/Setup/InstallData.php +++ b/app/code/Magento/Reports/Setup/InstallData.php @@ -7,8 +7,6 @@ namespace Magento\Reports\Setup; -// @codingStandardsIgnoreFile - use Magento\Cms\Model\PageFactory; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; @@ -82,11 +80,13 @@ class InstallData implements \Magento\Framework\Setup\InstallDataInterface $cms = $this->pageFactory->create(); $cms->load('home', 'identifier'); + // @codingStandardsIgnoreStart $reportLayoutUpdate = '<!-- <referenceContainer name="right"> <action method="unsetChild"><argument name="alias" xsi:type="string">right.reports.product.viewed</argument></action> <action method="unsetChild"><argument name="alias" xsi:type="string">right.reports.product.compared</argument></action> </referenceContainer>-->'; + // @codingStandardsIgnoreEnd /* * Merge and save old layout update data with report layout data diff --git a/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php b/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php new file mode 100644 index 0000000000000000000000000000000000000000..81eb87c4cac8a1532b08a48e109af0a6c42327fd --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php @@ -0,0 +1,147 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Helper; + +use Magento\Reports\Helper\Data; + +class DataTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Helper\Data + */ + protected $data; + + /** + * @var \Magento\Framework\App\Helper\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $contextMock; + + /** + * @var \Magento\Reports\Model\ItemFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $itemFactoryMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->contextMock = $this->getMockBuilder('Magento\Framework\App\Helper\Context') + ->disableOriginalConstructor() + ->getMock(); + $this->itemFactoryMock = $this->getMockBuilder('Magento\Reports\Model\ItemFactory') + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + + $this->data = new Data( + $this->contextMock, + $this->itemFactoryMock + ); + } + + /** + * @param string $from + * @param string $to + * @param string $period + * @param array $results + * @dataProvider intervalsDataProvider + * @return void + */ + public function testGetIntervals($from, $to, $period, $results) + { + $this->assertEquals($this->data->getIntervals($from, $to, $period), $results); + } + + /** + * @param string $from + * @param string $to + * @param string $period + * @param array $results + * @dataProvider intervalsDataProvider + * @return void + */ + public function testPrepareIntervalsCollection($from, $to, $period, $results) + { + $collection = $this->getMockBuilder('Magento\Framework\Data\Collection') + ->disableOriginalConstructor() + ->setMethods(['addItem']) + ->getMock(); + + $item = $this->getMockBuilder('Magento\Reports\Model\Item') + ->disableOriginalConstructor() + ->setMethods(['setPeriod', 'setIsEmpty']) + ->getMock(); + + $this->itemFactoryMock->expects($this->exactly(count($results))) + ->method('create') + ->willReturn($item); + $item->expects($this->exactly(count($results))) + ->method('setIsEmpty'); + $collection->expects($this->exactly(count($results))) + ->method('addItem'); + + foreach ($results as $key => $result) { + $item->expects($this->at($key + $key)) + ->method('setPeriod') + ->with($result); + } + + $this->data->prepareIntervalsCollection($collection, $from, $to, $period); + } + + /** + * @return array + */ + public function intervalsDataProvider() + { + return [ + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2000-01-15 11:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_DAY, + 'results' => ['2000-01-15'] + ], + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2000-01-17 10:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_MONTH, + 'results' => ['2000-01'] + ], + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2000-02-15 10:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_YEAR, + 'results' => ['2000'] + ], + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2000-01-16 11:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_DAY, + 'results' => ['2000-01-15', '2000-01-16'] + ], + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2000-02-17 10:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_MONTH, + 'results' => ['2000-01', '2000-02'] + ], + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2003-02-15 10:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_YEAR, + 'results' => ['2000', '2001', '2002', '2003'] + ], + [ + 'from' => '', + 'to' => '', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_YEAR, + 'results' => [] + ] + ]; + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Event/ObserverTest.php b/app/code/Magento/Reports/Test/Unit/Model/Event/ObserverTest.php index ba4dc5396b30df834f76dba8b40183af149af079..7e53522ac6680d17587318727bf538a6bebbdd0e 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Event/ObserverTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Event/ObserverTest.php @@ -47,6 +47,14 @@ class ObserverTest extends \PHPUnit_Framework_TestCase */ protected $productCompModelMock; + /** + * @var \Magento\Reports\Model\Product\Index\ViewedFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $productIndexFactoryMock; + + /** + * {@inheritDoc} + */ public function setUp() { $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -56,13 +64,13 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $this->customerVisitorMock = $this->getMockBuilder('Magento\Customer\Model\Visitor') ->disableOriginalConstructor()->getMock(); - $productIndexFactoryMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\ViewedFactory') + $this->productIndexFactoryMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\ViewedFactory') ->setMethods(['create']) ->disableOriginalConstructor()->getMock(); $this->productIndexMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\Viewed') ->disableOriginalConstructor()->getMock(); - $productIndexFactoryMock->expects($this->any()) + $this->productIndexFactoryMock->expects($this->any()) ->method('create') ->willReturn($this->productIndexMock); @@ -84,20 +92,25 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $storeManager->expects($this->any()) ->method('getStore') ->willReturn($this->storeMock); - $this->productCompFactoryMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\ComparedFactory') + + $this->productCompModelMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\Compared') ->disableOriginalConstructor() - ->setMethods(['create']) ->getMock(); - $this->productCompModelMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\Compared') + + $this->productCompFactoryMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\ComparedFactory') ->disableOriginalConstructor() + ->setMethods(['create']) ->getMock(); + $this->productCompFactoryMock->expects($this->any()) + ->method('create') + ->willReturn($this->productCompModelMock); $this->observer = $objectManager->getObject( 'Magento\Reports\Model\Event\Observer', [ 'customerSession' => $this->customerSessionMock, 'customerVisitor' => $this->customerVisitorMock, - 'productIndxFactory' => $productIndexFactoryMock, + 'productIndxFactory' => $this->productIndexFactoryMock, 'productCompFactory' => $this->productCompFactoryMock, 'storeManager' => $storeManager, 'event' => $reportEventFactory @@ -105,6 +118,9 @@ class ObserverTest extends \PHPUnit_Framework_TestCase ); } + /** + * @return void + */ public function testCatalogProductViewCustomer() { $productId = 5; @@ -123,17 +139,10 @@ class ObserverTest extends \PHPUnit_Framework_TestCase 'store_id' => $storeId, ]; - $this->storeMock->expects($this->any()) - ->method('getId') - ->willReturn($storeId); - - $this->customerSessionMock->expects($this->any()) - ->method('isLoggedIn') - ->willReturn(true); + $this->storeMock->expects($this->any())->method('getId')->willReturn($storeId); - $this->customerSessionMock->expects($this->any()) - ->method('getCustomerId') - ->willReturn($customerId); + $this->customerSessionMock->expects($this->any())->method('isLoggedIn')->willReturn(true); + $this->customerSessionMock->expects($this->any())->method('getCustomerId')->willReturn($customerId); $this->prepareProductIndexMock($expectedViewedData); $this->prepareReportEventModel($expectedEventData); @@ -141,6 +150,9 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $this->observer->catalogProductView($eventObserver); } + /** + * @return void + */ public function testCatalogProductViewVisitor() { $productId = 6; @@ -159,17 +171,11 @@ class ObserverTest extends \PHPUnit_Framework_TestCase 'store_id' => $storeId, ]; - $this->storeMock->expects($this->any()) - ->method('getId') - ->willReturn($storeId); + $this->storeMock->expects($this->any())->method('getId')->willReturn($storeId); - $this->customerSessionMock->expects($this->any()) - ->method('isLoggedIn') - ->willReturn(false); + $this->customerSessionMock->expects($this->any())->method('isLoggedIn')->willReturn(false); - $this->customerVisitorMock->expects($this->any()) - ->method('getId') - ->willReturn($visitorId); + $this->customerVisitorMock->expects($this->any())->method('getId')->willReturn($visitorId); $this->prepareProductIndexMock($expectedViewedData); $this->prepareReportEventModel($expectedEventData); @@ -182,6 +188,7 @@ class ObserverTest extends \PHPUnit_Framework_TestCase * @param string $userKey * @param int $userId * @dataProvider catalogProductCompareAddProductDataProvider + * @return void */ public function testCatalogProductCompareAddProduct($isLoggedIn, $userKey, $userId) { @@ -193,31 +200,84 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $userKey => $userId ]; $observerMock = $this->getObserverMock($productId); - $this->customerSessionMock->expects($this->any()) - ->method('isLoggedIn') - ->willReturn($isLoggedIn); - $this->customerSessionMock->expects($this->any()) - ->method('getCustomerId') - ->willReturn($customerId); - $this->customerVisitorMock->expects($this->any()) - ->method('getId') - ->willReturn($visitorId); - $this->productCompFactoryMock->expects($this->any()) - ->method('create') - ->willReturn($this->productCompModelMock); - $this->productCompModelMock->expects($this->any()) - ->method('setData') - ->with($viewData) - ->willReturnSelf(); - $this->productCompModelMock->expects($this->any()) - ->method('save') - ->willReturnSelf(); - $this->productCompModelMock->expects($this->any()) - ->method('calculate') - ->willReturnSelf(); + + $this->customerSessionMock->expects($this->any())->method('isLoggedIn')->willReturn($isLoggedIn); + $this->customerSessionMock->expects($this->any())->method('getCustomerId')->willReturn($customerId); + + $this->customerVisitorMock->expects($this->any())->method('getId')->willReturn($visitorId); + + $this->productCompModelMock->expects($this->any())->method('setData')->with($viewData)->willReturnSelf(); + $this->productCompModelMock->expects($this->any())->method('save')->willReturnSelf(); + $this->productCompModelMock->expects($this->any())->method('calculate')->willReturnSelf(); + $this->assertEquals($this->observer, $this->observer->catalogProductCompareAddProduct($observerMock)); } + /** + * @return void + */ + public function testCustomerLoginLoggedInTrue() + { + $customerId = 222; + $visitorId = 333; + $observerMock = $this->getObserverMock(111); + + $this->customerSessionMock->expects($this->once())->method('isLoggedIn')->willReturn(true); + $this->customerSessionMock->expects($this->once())->method('getCustomerId')->willReturn($customerId); + + $this->customerVisitorMock->expects($this->once())->method('getId')->willReturn($visitorId); + + $this->reportEventMock->expects($this->once())->method('updateCustomerType')->with($visitorId, $customerId); + + $this->productCompModelMock->expects($this->once())->method('updateCustomerFromVisitor')->willReturnSelf(); + $this->productCompModelMock->expects($this->once())->method('calculate')->willReturnSelf(); + + $this->productIndexMock->expects($this->once())->method('updateCustomerFromVisitor')->willReturnSelf(); + $this->productIndexMock->expects($this->once())->method('calculate')->willReturnSelf(); + + $this->assertEquals($this->observer, $this->observer->customerLogin($observerMock)); + } + + /** + * @return void + */ + public function testCustomerLoginLoggedInFalse() + { + $observerMock = $this->getObserverMock(111); + + $this->customerSessionMock->expects($this->once())->method('isLoggedIn')->willReturn(false); + $this->customerSessionMock->expects($this->never())->method('getCustomerId'); + + $this->customerVisitorMock->expects($this->never())->method('getId'); + + $this->productCompModelMock->expects($this->never())->method('updateCustomerFromVisitor')->willReturnSelf(); + $this->productCompModelMock->expects($this->never())->method('calculate')->willReturnSelf(); + + $this->productIndexMock->expects($this->never())->method('updateCustomerFromVisitor')->willReturnSelf(); + $this->productIndexMock->expects($this->never())->method('calculate')->willReturnSelf(); + + $this->assertEquals($this->observer, $this->observer->customerLogin($observerMock)); + } + + /** + * @return void + */ + public function testCustomerLogout() + { + $observerMock = $this->getObserverMock(111); + + $this->productCompModelMock->expects($this->once())->method('purgeVisitorByCustomer')->willReturnSelf(); + $this->productCompModelMock->expects($this->once())->method('calculate')->willReturnSelf(); + + $this->productIndexMock->expects($this->once())->method('purgeVisitorByCustomer')->willReturnSelf(); + $this->productIndexMock->expects($this->once())->method('calculate')->willReturnSelf(); + + $this->assertEquals($this->observer, $this->observer->customerLogout($observerMock)); + } + + /** + * @return array + */ public function catalogProductCompareAddProductDataProvider() { return [ @@ -260,14 +320,8 @@ class ObserverTest extends \PHPUnit_Framework_TestCase */ protected function prepareReportEventModel($expectedEventData) { - $this->reportEventMock->expects($this->any()) - ->method('setData') - ->with($expectedEventData) - ->willReturnSelf(); - - $this->reportEventMock->expects($this->any()) - ->method('save') - ->willReturnSelf(); + $this->reportEventMock->expects($this->any())->method('setData')->with($expectedEventData)->willReturnSelf(); + $this->reportEventMock->expects($this->any())->method('save')->willReturnSelf(); } /** @@ -276,22 +330,21 @@ class ObserverTest extends \PHPUnit_Framework_TestCase */ protected function getObserverMock($productId) { - $eventObserverMock = $this->getMockBuilder('Magento\Framework\Event\Observer')->disableOriginalConstructor() + $eventObserverMock = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() ->getMock(); - $eventMock = $this->getMockBuilder('Magento\Framework\Event')->disableOriginalConstructor() + $eventMock = $this->getMockBuilder('Magento\Framework\Event') + ->disableOriginalConstructor() ->setMethods(['getProduct'])->getMock(); - $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product')->disableOriginalConstructor() + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() ->getMock(); - $productMock->expects($this->any()) - ->method('getId') - ->willReturn($productId); - $eventMock->expects($this->any()) - ->method('getProduct') - ->willReturn($productMock); - $eventObserverMock->expects($this->any()) - ->method('getEvent') - ->willReturn($eventMock); + $productMock->expects($this->any())->method('getId')->willReturn($productId); + + $eventMock->expects($this->any())->method('getProduct')->willReturn($productMock); + + $eventObserverMock->expects($this->any())->method('getEvent')->willReturn($eventMock); return $eventObserverMock; } diff --git a/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php b/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php index a6585041528a549b1d69b10135614c1270f44937..f9ee6d86285e0aad348824a00a26ae17f2e42e7f 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php @@ -3,82 +3,84 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ + namespace Magento\Reports\Test\Unit\Model\Plugin; +use Magento\Reports\Model\Plugin\Log; + class LogTest extends \PHPUnit_Framework_TestCase { /** * @var \Magento\Reports\Model\Plugin\Log */ - protected $model; + protected $log; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Reports\Model\Event|\PHPUnit_Framework_MockObject_MockObject */ - protected $reportEventMock; + protected $eventMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Reports\Model\Product\Index\Compared|\PHPUnit_Framework_MockObject_MockObject */ - protected $cmpProductIdxMock; + protected $comparedMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Reports\Model\Product\Index\Viewed|\PHPUnit_Framework_MockObject_MockObject */ - protected $viewProductIdxMock; + protected $viewedMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Log\Model\Resource\Log|\PHPUnit_Framework_MockObject_MockObject */ protected $logResourceMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Log\Model\Resource\Log|\PHPUnit_Framework_MockObject_MockObject */ protected $subjectMock; + /** + * {@inheritDoc} + */ protected function setUp() { - $this->reportEventMock = $this->getMock('Magento\Reports\Model\Event', [], [], '', false); - $this->cmpProductIdxMock = $this->getMock( - 'Magento\Reports\Model\Product\Index\Compared', - [], - [], - '', - false - ); - $this->viewProductIdxMock = $this->getMock( - 'Magento\Reports\Model\Product\Index\Viewed', - [], - [], - '', - false - ); + $this->eventMock = $this->getMockBuilder('Magento\Reports\Model\Event') + ->disableOriginalConstructor() + ->getMock(); + $this->comparedMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\Compared') + ->disableOriginalConstructor() + ->getMock(); + $this->viewedMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\Viewed') + ->disableOriginalConstructor() + ->getMock(); - $this->logResourceMock = $this->getMock('Magento\Log\Model\Resource\Log', [], [], '', false); + $this->logResourceMock = $this->getMockBuilder('Magento\Log\Model\Resource\Log') + ->disableOriginalConstructor() + ->getMock(); + $this->subjectMock = $this->getMockBuilder('Magento\Log\Model\Resource\Log') + ->disableOriginalConstructor() + ->getMock(); - $this->subjectMock = $this->getMock('Magento\Log\Model\Resource\Log', [], [], '', false); - $this->model = new \Magento\Reports\Model\Plugin\Log( - $this->reportEventMock, - $this->cmpProductIdxMock, - $this->viewProductIdxMock + $this->log = new Log( + $this->eventMock, + $this->comparedMock, + $this->viewedMock ); } /** - * @covers \Magento\Reports\Model\Plugin\Log::afterClean + * @return void */ public function testAfterClean() { - $this->reportEventMock->expects($this->once())->method('clean'); - - $this->cmpProductIdxMock->expects($this->once())->method('clean'); - - $this->viewProductIdxMock->expects($this->once())->method('clean'); + $this->eventMock->expects($this->once())->method('clean'); + $this->comparedMock->expects($this->once())->method('clean'); + $this->viewedMock->expects($this->once())->method('clean'); $this->assertEquals( $this->logResourceMock, - $this->model->afterClean($this->subjectMock, $this->logResourceMock) + $this->log->afterClean($this->subjectMock, $this->logResourceMock) ); } } diff --git a/app/code/Magento/Reports/Test/Unit/Model/Product/Index/ComparedTest.php b/app/code/Magento/Reports/Test/Unit/Model/Product/Index/ComparedTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7a2a7213a6b7899f7f89fd47a04bb66fb31539ea --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Product/Index/ComparedTest.php @@ -0,0 +1,149 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Product\Index; + +use Magento\Reports\Model\Product\Index\Compared; + +class ComparedTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Product\Index\Compared + */ + protected $compared; + + /** + * @var \Magento\Framework\Model\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $contextMock; + + /** + * @var \Magento\Framework\Registry|\PHPUnit_Framework_MockObject_MockObject + */ + protected $registryMock; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManagerMock; + + /** + * @var \Magento\Customer\Model\Visitor|\PHPUnit_Framework_MockObject_MockObject + */ + protected $visitorMock; + + /** + * @var \Magento\Customer\Model\Session|\PHPUnit_Framework_MockObject_MockObject + */ + protected $sessionMock; + + /** + * @var \Magento\Framework\Session\Generic|\PHPUnit_Framework_MockObject_MockObject + */ + protected $genericMock; + + /** + * @var \Magento\Catalog\Model\Product\Visibility|\PHPUnit_Framework_MockObject_MockObject + */ + protected $visibilityMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dateTimeMock; + + /** + * @var \Magento\Catalog\Helper\Product\Compare|\PHPUnit_Framework_MockObject_MockObject + */ + protected $catalogProductHelperMock; + + /** + * @var \Magento\Framework\Model\Resource\AbstractResource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * @var \Magento\Framework\Data\Collection\AbstractDb|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dbMock; + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Context') + ->disableOriginalConstructor() + ->getMock(); + $this->registryMock = $this->getMockBuilder('Magento\Framework\Registry') + ->getMock(); + $this->storeManagerMock = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') + ->getMock(); + $this->visitorMock = $this->getMockBuilder('Magento\Customer\Model\Visitor') + ->disableOriginalConstructor() + ->getMock(); + $this->sessionMock = $this->getMockBuilder('Magento\Customer\Model\Session') + ->disableOriginalConstructor() + ->getMock(); + $this->genericMock = $this->getMockBuilder('Magento\Framework\Session\Generic') + ->disableOriginalConstructor() + ->getMock(); + $this->visibilityMock = $this->getMockBuilder('Magento\Catalog\Model\Product\Visibility') + ->disableOriginalConstructor() + ->getMock(); + $this->dateTimeMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime') + ->getMock(); + $this->catalogProductHelperMock = $this->getMockBuilder('Magento\Catalog\Helper\Product\Compare') + ->disableOriginalConstructor() + ->getMock(); + + $this->resourceMock = $this->getMockBuilder('Magento\Framework\Model\Resource\AbstractResource') + ->disableOriginalConstructor() + ->setMethods(['getIdFieldName', '_construct', '_getReadAdapter', '_getWriteAdapter']) + ->getMock(); + $this->dbMock = $this->getMockBuilder('Magento\Framework\Data\Collection\AbstractDb') + ->disableOriginalConstructor() + ->getMock(); + + $this->compared = new Compared( + $this->contextMock, + $this->registryMock, + $this->storeManagerMock, + $this->visitorMock, + $this->sessionMock, + $this->genericMock, + $this->visibilityMock, + $this->dateTimeMock, + $this->catalogProductHelperMock, + $this->resourceMock, + $this->dbMock + ); + } + + /** + * @return void + */ + public function testGetExcludeProductIds() + { + $collection = $this->getMockBuilder('Magento\Catalog\Model\Resource\Product\Compare\Item\Collection') + ->disableOriginalConstructor() + ->setMethods(['getEntityId']) + ->getMock(); + $collection->expects($this->once())->method('getEntityId')->willReturn(1); + + $product = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->setMethods(['getId']) + ->getMock(); + $product->expects($this->once())->method('getId')->willReturn(2); + + $this->catalogProductHelperMock->expects($this->once())->method('hasItems')->willReturn(true); + $this->catalogProductHelperMock->expects($this->once())->method('getItemCollection')->willReturn([$collection]); + + $this->registryMock->expects($this->any())->method('registry')->willReturn($product); + + $this->assertEquals([1, 2], $this->compared->getExcludeProductIds()); + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/Event/CollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Event/CollectionTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2191830c60ffd3ebdad30f105190cc31f9aa2b7f --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Event/CollectionTest.php @@ -0,0 +1,161 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Resource\Event; + +use Magento\Reports\Model\Resource\Event\Collection; + +class CollectionTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Resource\Event\Collection + */ + protected $collection; + + /** + * @var \Magento\Framework\Data\Collection\EntityFactoryInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entityFactoryMock; + + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $loggerMock; + + /** + * @var \Magento\Framework\Data\Collection\Db\FetchStrategyInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $fetchStrategyMock; + + /** + * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $managerMock; + + /** + * @var \Magento\Framework\Model\Resource\Db\AbstractDb|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * @var \Zend_Db_Adapter_Abstract|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dbMock; + + /** + * @var \Zend_Db_Select|\PHPUnit_Framework_MockObject_MockObject + */ + protected $selectMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->entityFactoryMock = $this->getMockBuilder('Magento\Framework\Data\Collection\EntityFactoryInterface') + ->getMock(); + $this->loggerMock = $this->getMockBuilder('Psr\Log\LoggerInterface') + ->getMock(); + $this->fetchStrategyMock = $this->getMockBuilder('Magento\Framework\Data\Collection\Db\FetchStrategyInterface') + ->getMock(); + $this->managerMock = $this->getMockBuilder('Magento\Framework\Event\ManagerInterface') + ->getMock(); + + $this->selectMock = $this->getMockBuilder('Zend_Db_Select') + ->setMethods(['where', 'from']) + ->disableOriginalConstructor() + ->getMock(); + $this->selectMock->expects($this->any()) + ->method('from') + ->willReturnSelf(); + $this->selectMock->expects($this->any()) + ->method('where') + ->willReturnSelf(); + + $this->dbMock = $this->getMockBuilder('Zend_Db_Adapter_Abstract') + ->disableOriginalConstructor() + ->getMock(); + $this->dbMock->expects($this->any()) + ->method('select') + ->willReturn($this->selectMock); + + $this->resourceMock = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\AbstractDb') + ->disableOriginalConstructor() + ->setMethods(['getReadConnection', 'getCurrentStoreIds', '_construct', 'getMainTable', 'getTable']) + ->getMock(); + $this->resourceMock->expects($this->any()) + ->method('getReadConnection') + ->willReturn($this->dbMock); + + $this->collection = new Collection( + $this->entityFactoryMock, + $this->loggerMock, + $this->fetchStrategyMock, + $this->managerMock, + null, + $this->resourceMock + ); + } + + /** + * @param mixed $ignoreData + * @param 'string' $ignoreSql + * @dataProvider ignoresDataProvider + * @return void + */ + public function testAddStoreFilter($ignoreData, $ignoreSql) + { + $typeId = 1; + $subjectId =2; + $subtype = 3; + $limit = 0; + $stores = [1, 2]; + + $this->resourceMock + ->expects($this->once()) + ->method('getCurrentStoreIds') + ->willReturn($stores); + $this->selectMock + ->expects($this->at(0)) + ->method('where') + ->with('event_type_id = ?', $typeId); + $this->selectMock + ->expects($this->at(1)) + ->method('where') + ->with('subject_id = ?', $subjectId); + $this->selectMock + ->expects($this->at(2)) + ->method('where') + ->with('subtype = ?', $subtype); + $this->selectMock + ->expects($this->at(3)) + ->method('where') + ->with('store_id IN(?)', $stores); + $this->selectMock + ->expects($this->at(4)) + ->method('where') + ->with($ignoreSql, $ignoreData); + + $this->collection->addRecentlyFiler($typeId, $subjectId, $subtype, $ignoreData, $limit); + } + + /** + * @return array + */ + public function ignoresDataProvider() + { + return [ + [ + 'ignoreData' => 1, + 'ignoreSql' => 'object_id <> ?' + ], + [ + 'ignoreData' => [1], + 'ignoreSql' => 'object_id NOT IN(?)' + ] + ]; + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php new file mode 100644 index 0000000000000000000000000000000000000000..5d1dc3bbcea0733b49ccf35ba68ae9f3d948581a --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php @@ -0,0 +1,248 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Resource; + +use Magento\Reports\Model\Resource\Event; + +class EventTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Resource\Event + */ + protected $event; + + /** + * @var \Magento\Framework\Model\Resource\Db\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $contextMock; + + /** + * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $scopeConfigMock; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManagerMock; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $connectionMock; + + /** + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * @var \Magento\Store\Model\Store|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\Context') + ->disableOriginalConstructor() + ->getMock(); + + $this->scopeConfigMock = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') + ->getMock(); + + $this->storeManagerMock = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') + ->getMock(); + + $this->storeMock = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + + $this->storeManagerMock + ->expects($this->any()) + ->method('getStore') + ->willReturn($this->storeMock); + + $this->connectionMock = $this->getMockBuilder('Magento\Framework\DB\Adapter\AdapterInterface') + ->getMock(); + + $this->resourceMock = $this->getMockBuilder('Magento\Framework\App\Resource') + ->disableOriginalConstructor() + ->getMock(); + $this->resourceMock + ->expects($this->any()) + ->method('getConnection') + ->willReturn($this->connectionMock); + + $this->contextMock + ->expects($this->any()) + ->method('getResources') + ->willReturn($this->resourceMock); + + $this->event = new Event( + $this->contextMock, + $this->scopeConfigMock, + $this->storeManagerMock + ); + } + + /** + * @return void + */ + public function testUpdateCustomerTypeWithoutType() + { + $eventMock = $this->getMockBuilder('Magento\Reports\Model\Event') + ->disableOriginalConstructor() + ->getMock(); + $this->connectionMock + ->expects($this->never()) + ->method('update'); + + $this->event->updateCustomerType($eventMock, 1, 1); + + } + + /** + * @return void + */ + public function testUpdateCustomerTypeWithType() + { + $eventMock = $this->getMockBuilder('Magento\Reports\Model\Event') + ->disableOriginalConstructor() + ->getMock(); + $this->connectionMock + ->expects($this->once()) + ->method('update'); + + $this->event->updateCustomerType($eventMock, 1, 1, ['type']); + + } + + /** + * @return void + */ + public function testApplyLogToCollection() + { + $derivedSelect = 'SELECT * FROM table'; + $idFieldName = 'IdFieldName'; + + $collectionSelectMock = $this->getMockBuilder('Magento\Framework\DB\Select') + ->disableOriginalConstructor() + ->setMethods(['joinInner', 'order']) + ->getMock(); + $collectionSelectMock + ->expects($this->once()) + ->method('joinInner') + ->with( + ['evt' => new \Zend_Db_Expr("({$derivedSelect})")], + "{$idFieldName} = evt.object_id", + [] + ) + ->willReturnSelf(); + $collectionSelectMock + ->expects($this->once()) + ->method('order') + ->willReturnSelf(); + + $collectionMock = $this->getMockBuilder('Magento\Framework\Data\Collection\AbstractDb') + ->disableOriginalConstructor() + ->getMock(); + $collectionMock + ->expects($this->once()) + ->method('getResource') + ->willReturnSelf(); + $collectionMock + ->expects($this->once()) + ->method('getIdFieldName') + ->willReturn($idFieldName); + $collectionMock + ->expects($this->any()) + ->method('getSelect') + ->willReturn($collectionSelectMock); + + $selectMock = $this->getMockBuilder('Magento\Framework\DB\Select') + ->disableOriginalConstructor() + ->setMethods(['from', 'where', 'group', 'joinInner', '__toString']) + ->getMock(); + $selectMock + ->expects($this->once()) + ->method('from') + ->willReturnSelf(); + $selectMock + ->expects($this->any()) + ->method('where') + ->willReturnSelf(); + $selectMock + ->expects($this->once()) + ->method('group') + ->willReturnSelf(); + $selectMock + ->expects($this->any()) + ->method('__toString') + ->willReturn($derivedSelect); + + $this->connectionMock + ->expects($this->once()) + ->method('select') + ->willReturn($selectMock); + + $this->storeMock + ->expects($this->any()) + ->method('getId') + ->willReturn(1); + + $this->event->applyLogToCollection($collectionMock, 1, 1, 1); + } + + /** + * @return void + */ + public function testClean() + { + $eventMock = $this->getMockBuilder('Magento\Reports\Model\Event') + ->disableOriginalConstructor() + ->getMock(); + + $selectMock = $this->getMockBuilder('Magento\Framework\DB\Select') + ->disableOriginalConstructor() + ->setMethods(['select', 'from', 'joinLeft', 'where', 'limit', 'fetchCol']) + ->getMock(); + + $this->connectionMock + ->expects($this->at(3)) + ->method('fetchCol') + ->willReturn(1); + $this->connectionMock + ->expects($this->once()) + ->method('delete'); + $this->connectionMock + ->expects($this->any()) + ->method('select') + ->willReturn($selectMock); + + $selectMock + ->expects($this->exactly(2)) + ->method('from') + ->willReturnSelf(); + $selectMock + ->expects($this->exactly(2)) + ->method('joinLeft') + ->willReturnSelf(); + $selectMock + ->expects($this->any()) + ->method('where') + ->willReturnSelf(); + $selectMock + ->expects($this->exactly(2)) + ->method('limit') + ->willReturnSelf(); + + $this->event->clean($eventMock); + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b000c4ad43ab230bf9b648241354cb3cd60b65d3 --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php @@ -0,0 +1,122 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Resource; + +use Magento\Reports\Model\Resource\Helper; + +class HelperTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Resource\Helper + */ + protected $helper; + + /** + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $connectionMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->resourceMock = $this->getMockBuilder('Magento\Framework\App\Resource') + ->disableOriginalConstructor() + ->getMock(); + + $this->connectionMock = $this->getMockBuilder('Magento\Framework\DB\Adapter\AdapterInterface') + ->getMock(); + + $this->resourceMock + ->expects($this->any()) + ->method('getConnection') + ->willReturn($this->connectionMock); + + $this->helper = new Helper( + $this->resourceMock + ); + } + + /** + * @return void + */ + public function testMergeVisitorProductIndex() + { + $mainTable = 'mainTable'; + $data = ['dataKey' => 'dataValue']; + $matchFields = ['matchField']; + + $this->connectionMock + ->expects($this->once()) + ->method('insertOnDuplicate') + ->with($mainTable, $data, array_keys($data)); + + $this->helper->mergeVisitorProductIndex($mainTable, $data, $matchFields); + } + + /** + * @param string $type + * @param array $result + * @dataProvider typesDataProvider + * @return void + */ + public function testUpdateReportRatingPos($type, $result) + { + $mainTable = 'mainTable'; + $column = 'column'; + $aggregationTable = 'aggregationTable'; + + $selectMock = $this->getMockBuilder('Magento\Framework\DB\Select') + ->disableOriginalConstructor() + ->getMock(); + $selectMock + ->expects($this->any()) + ->method('from') + ->willReturnSelf(); + $selectMock + ->expects($this->once()) + ->method('group') + ->willReturnSelf(); + $selectMock + ->expects($this->once()) + ->method('order') + ->willReturnSelf(); + $selectMock + ->expects($this->once()) + ->method('insertFromSelect') + ->with($aggregationTable, $result) + ->willReturnSelf(); + + $this->connectionMock + ->expects($this->any()) + ->method('select') + ->willReturn($selectMock); + + $this->helper->updateReportRatingPos($this->connectionMock, $type, $column, $mainTable, $aggregationTable); + } + + /** + * @return array + */ + public function typesDataProvider() + { + $mResult = ['period', 'store_id', 'product_id', 'product_name', 'product_price', 'column', 'rating_pos']; + $dResult = ['period', 'store_id', 'product_id', 'product_name', 'product_price', 'id', 'column', 'rating_pos']; + return [ + ['type' => 'year', 'result' => $mResult], + ['type' => 'month', 'result' => $mResult], + ['type' => 'day', 'result' => $dResult], + ['type' => null, 'result' => $mResult] + ]; + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php new file mode 100644 index 0000000000000000000000000000000000000000..22a6bb1be49c2719d81af2339c7feef95295a195 --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php @@ -0,0 +1,509 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Resource\Order; + +use Magento\Reports\Model\Resource\Order\Collection; + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class CollectionTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Resource\Order\Collection + */ + protected $collection; + + /** + * @var \Magento\Framework\Data\Collection\EntityFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entityFactoryMock; + + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $loggerMock; + + /** + * @var \Magento\Framework\Data\Collection\Db\FetchStrategyInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $fetchStrategyMock; + + /** + * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $managerMock; + + /** + * @var \Magento\Sales\Model\Resource\EntitySnapshot|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entitySnapshotMock; + + /** + * @var \Magento\Framework\DB\Helper|\PHPUnit_Framework_MockObject_MockObject + */ + protected $helperMock; + + /** + * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $scopeConfigMock; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManagerMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $timezoneMock; + + /** + * @var \Magento\Sales\Model\Order\Config|\PHPUnit_Framework_MockObject_MockObject + */ + protected $configMock; + + /** + * @var \Magento\Sales\Model\Resource\Report\OrderFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $orderFactoryMock; + + /** + * @var \Zend_Db_Adapter_Abstract|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dbMock; + + /** + * @var \Zend_Db_Select|\PHPUnit_Framework_MockObject_MockObject + */ + protected $selectMock; + + /** + * @var \Magento\Framework\Model\Resource\Db\AbstractDb|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->entityFactoryMock = $this->getMockBuilder('Magento\Framework\Data\Collection\EntityFactory') + ->disableOriginalConstructor() + ->getMock(); + $this->loggerMock = $this->getMockBuilder('Psr\Log\LoggerInterface') + ->getMock(); + $this->fetchStrategyMock = $this->getMockBuilder('Magento\Framework\Data\Collection\Db\FetchStrategyInterface') + ->getMock(); + $this->managerMock = $this->getMockBuilder('Magento\Framework\Event\ManagerInterface') + ->getMock(); + $this->entitySnapshotMock = $this->getMockBuilder('Magento\Sales\Model\Resource\EntitySnapshot') + ->disableOriginalConstructor() + ->getMock(); + $this->helperMock = $this->getMockBuilder('Magento\Framework\DB\Helper') + ->disableOriginalConstructor() + ->getMock(); + $this->scopeConfigMock = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') + ->getMock(); + $this->storeManagerMock = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') + ->getMock(); + $this->timezoneMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime\TimezoneInterface') + ->getMock(); + $this->configMock = $this->getMockBuilder('Magento\Sales\Model\Order\Config') + ->disableOriginalConstructor() + ->getMock(); + $this->orderFactoryMock = $this->getMockBuilder('Magento\Sales\Model\Resource\Report\OrderFactory') + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->selectMock = $this->getMockBuilder('Zend_Db_Select') + ->disableOriginalConstructor() + ->getMock(); + $this->selectMock + ->expects($this->any()) + ->method('columns') + ->willReturnSelf(); + $this->selectMock + ->expects($this->any()) + ->method('where') + ->willReturnSelf(); + $this->selectMock + ->expects($this->any()) + ->method('order') + ->willReturnSelf(); + $this->selectMock + ->expects($this->any()) + ->method('group') + ->willReturnSelf(); + $this->selectMock + ->expects($this->any()) + ->method('getPart') + ->willReturn([]); + + $this->dbMock = $this->getMockForAbstractClass( + 'Zend_Db_Adapter_Abstract', + [], + '', + false, + true, + true, + ['select', 'getIfNullSql', 'getDateFormatSql', 'prepareSqlCondition', 'getCheckSql'] + ); + $this->dbMock + ->expects($this->any()) + ->method('select') + ->willReturn($this->selectMock); + + $this->resourceMock = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\AbstractDb') + ->disableOriginalConstructor() + ->getMock(); + $this->resourceMock + ->expects($this->once()) + ->method('getReadConnection') + ->willReturn($this->dbMock); + + $this->collection = new Collection( + $this->entityFactoryMock, + $this->loggerMock, + $this->fetchStrategyMock, + $this->managerMock, + $this->entitySnapshotMock, + $this->helperMock, + $this->scopeConfigMock, + $this->storeManagerMock, + $this->timezoneMock, + $this->configMock, + $this->orderFactoryMock, + null, + $this->resourceMock + ); + } + + /** + * @return void + */ + public function testCheckIsLive() + { + $range = ''; + $this->scopeConfigMock + ->expects($this->once()) + ->method('getValue') + ->with( + 'sales/dashboard/use_aggregated_data', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ); + + $this->collection->checkIsLive($range); + } + + /** + * @param int $useAggregatedData + * @param string $mainTable + * @param int $isFilter + * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $getIfNullSqlResult + * @dataProvider useAggregatedDataDataProvider + * @return void + */ + public function testPrepareSummary($useAggregatedData, $mainTable, $isFilter, $getIfNullSqlResult) + { + $range = ''; + $customStart = 1; + $customEnd = 10; + + $this->scopeConfigMock + ->expects($this->once()) + ->method('getValue') + ->with( + 'sales/dashboard/use_aggregated_data', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ->willReturn($useAggregatedData); + + $orderMock = $this->getMockBuilder('Magento\Sales\Model\Resource\Report\Order') + ->disableOriginalConstructor() + ->getMock(); + + $this->orderFactoryMock + ->expects($this->any()) + ->method('create') + ->willReturn($orderMock); + + $this->resourceMock + ->expects($this->at(0)) + ->method('getTable') + ->with($mainTable); + + $this->dbMock + ->expects($getIfNullSqlResult) + ->method('getIfNullSql'); + + $this->collection->prepareSummary($range, $customStart, $customEnd, $isFilter); + } + + /** + * @param int $range + * @param string $customStart + * @param string $customEnd + * @param string $expectedInterval + * @dataProvider firstPartDateRangeDataProvider + * @return void + */ + public function testGetDateRangeFirstPart($range, $customStart, $customEnd, $expectedInterval) + { + $result = $this->collection->getDateRange($range, $customStart, $customEnd); + $interval = $result['to']->diff($result['from']); + $intervalResult = $interval->format('%y %m %d %h:%i:%s'); + $this->assertEquals($expectedInterval, $intervalResult); + } + + /** + * @param int $range + * @param string $customStart + * @param string $customEnd + * @param string $config + * @dataProvider secondPartDateRangeDataProvider + * @return void + */ + public function testGetDateRangeSecondPart($range, $customStart, $customEnd, $config) + { + $this->scopeConfigMock + ->expects($this->once()) + ->method('getValue') + ->with( + $config, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ->willReturn(1); + + $result = $this->collection->getDateRange($range, $customStart, $customEnd); + $this->assertEquals(3, count($result)); + } + + /** + * @return void + */ + public function testGetDateRangeWithReturnObject() + { + $this->assertEquals(2, count($this->collection->getDateRange('7d', '', '', true))); + $this->assertEquals(3, count($this->collection->getDateRange('7d', '', '', false))); + } + + /** + * @return void + */ + public function testAddItemCountExpr() + { + $this->selectMock + ->expects($this->once()) + ->method('columns') + ->with(['items_count' => 'total_item_count'], 'main_table'); + $this->collection->addItemCountExpr(); + } + + /** + * @param int $isFilter + * @param int $useAggregatedData + * @param string $mainTable + * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $getIfNullSqlResult + * @dataProvider totalsDataProvider + * @return void + */ + public function testCalculateTotals($isFilter, $useAggregatedData, $mainTable, $getIfNullSqlResult) + { + $this->scopeConfigMock + ->expects($this->once()) + ->method('getValue') + ->with( + 'sales/dashboard/use_aggregated_data', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ->willReturn($useAggregatedData); + + $this->resourceMock + ->expects($this->at(0)) + ->method('getTable') + ->with($mainTable); + + $this->dbMock + ->expects($getIfNullSqlResult) + ->method('getIfNullSql'); + + $this->collection->checkIsLive(''); + $this->collection->calculateTotals($isFilter); + } + + /** + * @param int $isFilter + * @param string $useAggregatedData + * @param string $mainTable + * @dataProvider salesDataProvider + * @return void + */ + public function testCalculateSales($isFilter, $useAggregatedData, $mainTable) + { + $this->scopeConfigMock + ->expects($this->once()) + ->method('getValue') + ->with( + 'sales/dashboard/use_aggregated_data', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ->willReturn($useAggregatedData); + + $storeMock = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + + $this->storeManagerMock + ->expects($this->any()) + ->method('getStore') + ->willReturn($storeMock); + + $this->resourceMock + ->expects($this->at(0)) + ->method('getTable') + ->with($mainTable); + + $this->collection->calculateSales($isFilter); + } + + /** + * @return void + */ + public function testSetDateRange() + { + $fromDate = '1'; + $toDate = '2'; + + $this->dbMock + ->expects($this->at(0)) + ->method('prepareSqlCondition') + ->with('"created_at"', ['from' => $fromDate, 'to' => $toDate]); + + $this->collection->setDateRange($fromDate, $toDate); + } + + /** + * @param array $storeIds + * @param array $parameters + * @dataProvider storesDataProvider + * @return void + */ + public function testSetStoreIds($storeIds, $parameters) + { + $this->dbMock + ->expects($this->any()) + ->method('getIfNullSql') + ->willReturn('text'); + + $this->selectMock + ->expects($this->once()) + ->method('columns') + ->with($parameters) + ->willReturnSelf(); + + $this->collection->setStoreIds($storeIds); + } + + /** + * @return array + */ + public function useAggregatedDataDataProvider() + { + return [ + [1, 'sales_order_aggregated_created', 0, $this->never()], + [0, 'sales_order', 0, $this->exactly(7)], + [0, 'sales_order', 1, $this->exactly(6)] + ]; + } + + /** + * @return array + */ + public function firstPartDateRangeDataProvider() + { + return [ + ['', '', '', '0 0 0 23:59:59'], + ['24h', '', '', '0 0 1 0:0:0'], + ['7d', '', '', '0 0 6 23:59:59'] + ]; + } + + /** + * @return array + */ + public function secondPartDateRangeDataProvider() + { + return [ + ['1m', 1, 10, 'reports/dashboard/mtd_start'], + ['1y', 1, 10, 'reports/dashboard/ytd_start'], + ['2y', 1, 10, 'reports/dashboard/ytd_start'] + ]; + } + + /** + * @return array + */ + public function totalsDataProvider() + { + return [ + [1, 1, 'sales_order_aggregated_created', $this->never()], + [0, 1, 'sales_order_aggregated_created', $this->never()], + [1, 0, 'sales_order', $this->exactly(10)], + [0, 0, 'sales_order', $this->exactly(11)] + ]; + } + + /** + * @return array + */ + public function salesDataProvider() + { + return [ + [1, 1, 'sales_order_aggregated_created'], + [0, 1, 'sales_order_aggregated_created'], + [1, 0, 'sales_order'], + [0, 0, 'sales_order'] + ]; + } + + /** + * @return array + */ + public function storesDataProvider() + { + $firstReturn = [ + 'subtotal' => 'SUM(main_table.base_subtotal * main_table.base_to_global_rate)', + 'tax' => 'SUM(main_table.base_tax_amount * main_table.base_to_global_rate)', + 'shipping' => 'SUM(main_table.base_shipping_amount * main_table.base_to_global_rate)', + 'discount' => 'SUM(main_table.base_discount_amount * main_table.base_to_global_rate)', + 'total' => 'SUM(main_table.base_grand_total * main_table.base_to_global_rate)', + 'invoiced' => 'SUM(main_table.base_total_paid * main_table.base_to_global_rate)', + 'refunded' => 'SUM(main_table.base_total_refunded * main_table.base_to_global_rate)', + 'profit' => 'SUM(text * main_table.base_to_global_rate) + SUM(text * main_table.base_to_global_rate) '. + '- SUM(text * main_table.base_to_global_rate) - SUM(text * main_table.base_to_global_rate) '. + '- SUM(text * main_table.base_to_global_rate)', + ]; + + $secondReturn = [ + 'subtotal' => 'SUM(main_table.base_subtotal)', + 'tax' => 'SUM(main_table.base_tax_amount)', + 'shipping' => 'SUM(main_table.base_shipping_amount)', + 'discount' => 'SUM(main_table.base_discount_amount)', + 'total' => 'SUM(main_table.base_grand_total)', + 'invoiced' => 'SUM(main_table.base_total_paid)', + 'refunded' => 'SUM(main_table.base_total_refunded)', + 'profit' => 'SUM(text) + SUM(text) - SUM(text) - SUM(text) - SUM(text)', + ]; + + return [ + [[], $firstReturn], + [[1], $secondReturn] + ]; + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Collection/AbstractCollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Collection/AbstractCollectionTest.php index 96ad13c9b21868aa019927b72cee62eba019797b..ed5075a8bf70b7e4aeeb28e4e5eec0e08af3d08f 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Collection/AbstractCollectionTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Collection/AbstractCollectionTest.php @@ -4,16 +4,16 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Test\Unit\Model\Resource\Report\Collection; class AbstractCollectionTest extends \PHPUnit_Framework_TestCase { /** - * @var AbstractCollection + * Tested collection + * + * @var \Magento\Reports\Model\Resource\Report\Collection\AbstractCollection */ - protected $_model; + protected $collection; protected function setUp() { @@ -29,7 +29,7 @@ class AbstractCollectionTest extends \PHPUnit_Framework_TestCase ->getMockForAbstractClass(); $resource->method('getReadConnection')->willReturn($connection); - $this->_model = new \Magento\Reports\Model\Resource\Report\Collection\AbstractCollection( + $this->collection = new \Magento\Reports\Model\Resource\Report\Collection\AbstractCollection( $entityFactory, $logger, $fetchStrategy, @@ -41,15 +41,15 @@ class AbstractCollectionTest extends \PHPUnit_Framework_TestCase public function testIsSubtotalsGetDefault() { - $this->assertFalse($this->_model->isSubTotals()); + $this->assertFalse($this->collection->isSubTotals()); } public function testSetIsSubtotals() { - $this->_model->setIsSubTotals(true); - $this->assertTrue($this->_model->isSubTotals()); + $this->collection->setIsSubTotals(true); + $this->assertTrue($this->collection->isSubTotals()); - $this->_model->setIsSubTotals(false); - $this->assertFalse($this->_model->isSubTotals()); + $this->collection->setIsSubTotals(false); + $this->assertFalse($this->collection->isSubTotals()); } } diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/CollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/CollectionTest.php index c1e8adeeee7d3c16a6bb8984939699ef12c1ef48..ca08b3b21761a51c314c60a315f89e1dc5d359e2 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/CollectionTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/CollectionTest.php @@ -3,32 +3,196 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ + namespace Magento\Reports\Test\Unit\Model\Resource\Report; +use Magento\Reports\Model\Resource\Report\Collection; + class CollectionTest extends \PHPUnit_Framework_TestCase { /** * @var \Magento\Reports\Model\Resource\Report\Collection */ - protected $_model; + protected $collection; + /** + * @var \Magento\Framework\Data\Collection\EntityFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entityFactoryMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $timezoneMock; + + /** + * @var \Magento\Reports\Model\Resource\Report\Collection\Factory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $factoryMock; + + /** + * {@inheritDoc} + */ protected function setUp() { - $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->_model = $helper->getObject('Magento\Reports\Model\Resource\Report\Collection'); + $this->entityFactoryMock = $this->getMockBuilder('Magento\Framework\Data\Collection\EntityFactory') + ->disableOriginalConstructor() + ->getMock(); + $this->timezoneMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime\TimezoneInterface') + ->getMock(); + $this->factoryMock = $this->getMockBuilder('Magento\Reports\Model\Resource\Report\Collection\Factory') + ->disableOriginalConstructor() + ->getMock(); + + $this->timezoneMock + ->expects($this->any()) + ->method('formatDateTime') + ->will($this->returnCallback([$this, 'formatDateTime'])); + + $this->collection = new Collection( + $this->entityFactoryMock, + $this->timezoneMock, + $this->factoryMock + ); } - public function testGetIntervalsWithoutSpecifiedPeriod() + /** + * @return void + */ + public function testGetPeriods() { - $startDate = new \DateTime('-3 day'); - $endDate = new \DateTime('+3 day'); - $this->_model->setInterval($startDate, $endDate); + $expectedArray = ['day' => 'Day', 'month' => 'Month', 'year' => 'Year']; + $this->assertEquals($expectedArray, $this->collection->getPeriods()); + } - $this->assertEquals(0, $this->_model->getSize()); + /** + * @return void + */ + public function testGetStoreIds() + { + $storeIds = [1]; + $this->assertEquals(null, $this->collection->getStoreIds()); + $this->collection->setStoreIds($storeIds); + $this->assertEquals($storeIds, $this->collection->getStoreIds()); } - public function testGetIntervalsWithoutSpecifiedInterval() + /** + * @param string $period + * @param \DateTime $fromDate + * @param \DateTime $toDate + * @param int $size + * @dataProvider intervalsDataProvider + * @return void + */ + public function testGetSize($period, $fromDate, $toDate, $size) { - $this->assertEquals(0, $this->_model->getSize()); + $this->collection->setPeriod($period); + $this->collection->setInterval($fromDate, $toDate); + $this->assertEquals($size, $this->collection->getSize()); + } + + /** + * @return void + */ + public function testGetPageSize() + { + $pageSize = 1; + $this->assertEquals(null, $this->collection->getPageSize()); + $this->collection->setPageSize($pageSize); + $this->assertEquals($pageSize, $this->collection->getPageSize()); + } + + /** + * @param string $period + * @param \DateTime $fromDate + * @param \DateTime $toDate + * @param int $size + * @dataProvider intervalsDataProvider + * @return void + */ + public function testGetReports($period, $fromDate, $toDate, $size) + { + $this->collection->setPeriod($period); + $this->collection->setInterval($fromDate, $toDate); + $reports = $this->collection->getReports(); + foreach ($reports as $report) { + $this->assertInstanceOf('\Magento\Framework\Object', $report); + $reportData = $report->getData(); + $this->assertTrue(empty($reportData['children'])); + $this->assertTrue($reportData['is_empty']); + } + $this->assertEquals($size, count($reports)); + } + + /** + * @return void + */ + public function testLoadData() + { + $this->assertInstanceOf('\Magento\Reports\Model\Resource\Report\Collection', $this->collection->loadData()); + } + + /** + * @return array + */ + public function intervalsDataProvider() + { + return [ + [ + '_period' => 'day', + '_from' => new \DateTime('-3 day'), + '_to' => new \DateTime('+3 day'), + 'size' => 7 + ], + [ + '_period' => 'month', + '_from' => new \DateTime('2015-01-15 11:11:11'), + '_to' => new \DateTime('2015-01-25 11:11:11'), + 'size' => 1 + ], + [ + '_period' => 'month', + '_from' => new \DateTime('2015-01-15 11:11:11'), + '_to' => new \DateTime('2015-02-25 11:11:11'), + 'size' => 2 + ], + [ + '_period' => 'year', + '_from' => new \DateTime('2015-01-15 11:11:11'), + '_to' => new \DateTime('2015-01-25 11:11:11'), + 'size' => 1 + ], + [ + '_period' => 'year', + '_from' => new \DateTime('2014-01-15 11:11:11'), + '_to' => new \DateTime('2015-01-25 11:11:11'), + 'size' => 2 + ], + [ + '_period' => null, + '_from' => new \DateTime('-3 day'), + '_to' => new \DateTime('+3 day'), + 'size' => 0 + ] + ]; + } + + /** + * @return string + */ + public function formatDateTime() + { + $args = func_get_args(); + + $dateStart = $args[0]; + + $formatter = new \IntlDateFormatter( + "en_US", + \IntlDateFormatter::SHORT, + \IntlDateFormatter::SHORT, + 'America/Los_Angeles' + ); + + return $formatter->format($dateStart); } } diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Product/ViewedTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Product/ViewedTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b22e4f2bf044939cb3db933093d341afbf6318ac --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Product/ViewedTest.php @@ -0,0 +1,286 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Resource\Report\Product; + +use Magento\Reports\Model\Resource\Report\Product\Viewed; + +/** + * @SuppressWarnings(PHPMD.TooManyFields) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class ViewedTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Resource\Report\Product\Viewed + */ + protected $viewed; + + /** + * @var \Magento\Framework\Model\Resource\Db\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $contextMock; + + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $loggerMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $timezoneMock; + + /** + * @var \Magento\Reports\Model\FlagFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $flagFactoryMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dateTimeMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime\Timezone\Validator|\PHPUnit_Framework_MockObject_MockObject + */ + protected $validatorMock; + + /** + * @var \Magento\Catalog\Model\Resource\Product|\PHPUnit_Framework_MockObject_MockObject + */ + protected $productMock; + + /** + * @var \Magento\Reports\Model\Resource\Helper|\PHPUnit_Framework_MockObject_MockObject + */ + protected $helperMock; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $connectionMock; + + /** + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * @var \Magento\Framework\DB\Select|\PHPUnit_Framework_MockObject_MockObject + */ + protected $selectMock; + + /** + * @var \Zend_Db_Statement_Interface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $zendDbMock; + + /** + * @var \Magento\Eav\Model\Entity\Attribute\AbstractAttribute|\PHPUnit_Framework_MockObject_MockObject + */ + protected $attributeMock; + + /** + * @var \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend|\PHPUnit_Framework_MockObject_MockObject + */ + protected $backendMock; + + /** + * @var \Magento\Reports\Model\Flag|\PHPUnit_Framework_MockObject_MockObject + */ + protected $flagMock; + + /** + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * @return void + */ + protected function setUp() + { + $this->zendDbMock = $this->getMockBuilder('Zend_Db_Statement_Interface')->getMock(); + $this->zendDbMock->expects($this->any())->method('fetchColumn')->willReturn([]); + + $this->selectMock = $this->getMockBuilder('Magento\Framework\DB\Select') + ->disableOriginalConstructor() + ->setMethods( + [ + 'from', + 'where', + 'joinInner', + 'joinLeft', + 'having', + 'useStraightJoin', + 'insertFromSelect', + '__toString' + ] + ) + ->getMock(); + $this->selectMock->expects($this->any())->method('from')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('where')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('joinInner')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('joinLeft')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('having')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('useStraightJoin')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('insertFromSelect')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('__toString')->willReturn('string'); + + $this->connectionMock = $this->getMockBuilder('Magento\Framework\DB\Adapter\AdapterInterface')->getMock(); + $this->connectionMock->expects($this->any())->method('select')->willReturn($this->selectMock); + $this->connectionMock->expects($this->any())->method('query')->willReturn($this->zendDbMock); + + $this->resourceMock = $this->getMockBuilder('Magento\Framework\App\Resource') + ->disableOriginalConstructor() + ->getMock(); + $this->resourceMock->expects($this->any())->method('getConnection')->willReturn($this->connectionMock); + $this->resourceMock->expects($this->any())->method('getTableName')->will( + $this->returnCallback( + function ($arg) { + return $arg; + } + ) + ); + + $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\Context') + ->disableOriginalConstructor() + ->getMock(); + $this->contextMock->expects($this->any())->method('getResources')->willReturn($this->resourceMock); + + $this->loggerMock = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock(); + + $dateTime = $this->getMockBuilder('DateTime')->getMock(); + + $this->timezoneMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime\TimezoneInterface')->getMock(); + $this->timezoneMock->expects($this->any())->method('scopeDate')->willReturn($dateTime); + + $this->dateTimeMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime')->getMock(); + + $this->flagMock = $this->getMockBuilder('Magento\Reports\Model\Flag') + ->disableOriginalConstructor() + ->setMethods(['setReportFlagCode', 'unsetData', 'loadSelf', 'setFlagData', 'setLastUpdate', 'save']) + ->getMock(); + + $this->flagFactoryMock = $this->getMockBuilder('Magento\Reports\Model\FlagFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->flagFactoryMock->expects($this->any())->method('create')->willReturn($this->flagMock); + + $this->validatorMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime\Timezone\Validator') + ->disableOriginalConstructor() + ->getMock(); + + $this->backendMock = $this->getMockBuilder('Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend') + ->disableOriginalConstructor() + ->getMock(); + + $this->attributeMock = $this->getMockBuilder('Magento\Eav\Model\Entity\Attribute\AbstractAttribute') + ->disableOriginalConstructor() + ->getMock(); + $this->attributeMock->expects($this->any())->method('getBackend')->willReturn($this->backendMock); + + $this->productMock = $this->getMockBuilder('Magento\Catalog\Model\Resource\Product') + ->disableOriginalConstructor() + ->getMock(); + $this->productMock->expects($this->any())->method('getAttribute')->willReturn($this->attributeMock); + + $this->helperMock = $this->getMockBuilder('Magento\Reports\Model\Resource\Helper') + ->disableOriginalConstructor() + ->getMock(); + + $this->viewed = new Viewed( + $this->contextMock, + $this->loggerMock, + $this->timezoneMock, + $this->flagFactoryMock, + $this->dateTimeMock, + $this->validatorMock, + $this->productMock, + $this->helperMock + ); + } + + /** + * @param mixed $from + * @param mixed $to + * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $truncateCount + * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $deleteCount + * @dataProvider intervalsDataProvider + * @return void + */ + public function testAggregate($from, $to, $truncateCount, $deleteCount) + { + $this->connectionMock->expects($truncateCount)->method('truncateTable'); + $this->connectionMock->expects($deleteCount)->method('delete'); + + $this->helperMock + ->expects($this->at(0)) + ->method('updateReportRatingPos') + ->with( + $this->connectionMock, + 'day', + 'views_num', + 'report_viewed_product_aggregated_daily', + 'report_viewed_product_aggregated_daily' + ) + ->willReturnSelf(); + $this->helperMock + ->expects($this->at(1)) + ->method('updateReportRatingPos') + ->with( + $this->connectionMock, + 'month', + 'views_num', + 'report_viewed_product_aggregated_daily', + 'report_viewed_product_aggregated_monthly' + ) + ->willReturnSelf(); + $this->helperMock + ->expects($this->at(2)) + ->method('updateReportRatingPos') + ->with( + $this->connectionMock, + 'year', + 'views_num', + 'report_viewed_product_aggregated_daily', + 'report_viewed_product_aggregated_yearly' + ) + ->willReturnSelf(); + + $this->flagMock->expects($this->once())->method('unsetData')->willReturnSelf(); + $this->flagMock->expects($this->once())->method('loadSelf')->willReturnSelf(); + $this->flagMock->expects($this->never())->method('setFlagData')->willReturnSelf(); + $this->flagMock->expects($this->once())->method('setLastUpdate')->willReturnSelf(); + $this->flagMock->expects($this->once())->method('save')->willReturnSelf(); + $this->flagMock + ->expects($this->once()) + ->method('setReportFlagCode') + ->with(\Magento\Reports\Model\Flag::REPORT_PRODUCT_VIEWED_FLAG_CODE) + ->willReturnSelf(); + + $this->viewed->aggregate($from, $to); + } + + /** + * @return array + */ + public function intervalsDataProvider() + { + return [ + [ + 'from' => new \DateTime('+3 day'), + 'to' => new \DateTime('-3 day'), + 'truncateCount' => $this->never(), + 'deleteCount' => $this->once() + ], + [ + 'from' => null, + 'to' => null, + 'truncateCount' => $this->once(), + 'deleteCount' => $this->never() + ] + ]; + } +} diff --git a/app/code/Magento/Reports/composer.json b/app/code/Magento/Reports/composer.json index 099550f07e1ea5ec1812cf7466c1f75732a52e60..89ac5cea8d624dd0d8c836196cda54c80b9daa21 100644 --- a/app/code/Magento/Reports/composer.json +++ b/app/code/Magento/Reports/composer.json @@ -3,28 +3,28 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-log": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-review": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-downloadable": "0.74.0-beta13", - "magento/module-sales-rule": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-log": "0.74.0-beta14", + "magento/module-wishlist": "0.74.0-beta14", + "magento/module-review": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-downloadable": "0.74.0-beta14", + "magento/module-sales-rule": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/RequireJs/composer.json b/app/code/Magento/RequireJs/composer.json index c921a04022f146ff8fe438985fd98d93ef9c3fbe..f36ff58438ce0c1b827ee011308bdf0710623bf6 100644 --- a/app/code/Magento/RequireJs/composer.json +++ b/app/code/Magento/RequireJs/composer.json @@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Review/Model/Review.php b/app/code/Magento/Review/Model/Review.php index b68d7fc1d128d48c7e624123ceb13a6fc7cd6584..ec1d84b348e0b880a2b46e05827654c7dbc9b176 100644 --- a/app/code/Magento/Review/Model/Review.php +++ b/app/code/Magento/Review/Model/Review.php @@ -6,6 +6,7 @@ namespace Magento\Review\Model; use Magento\Catalog\Model\Product; +use Magento\Framework\Object\IdentityInterface; use Magento\Review\Model\Resource\Review\Product\Collection as ProductCollection; use Magento\Review\Model\Resource\Review\Status\Collection as StatusCollection; @@ -21,7 +22,7 @@ use Magento\Review\Model\Resource\Review\Status\Collection as StatusCollection; * @method \Magento\Review\Model\Review setStatusId(int $value) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ -class Review extends \Magento\Framework\Model\AbstractModel +class Review extends \Magento\Framework\Model\AbstractModel implements IdentityInterface { /** * Event prefix for observer @@ -359,4 +360,18 @@ class Review extends \Magento\Framework\Model\AbstractModel { return $this->getResource()->getEntityIdByCode($entityCode); } + + /** + * Return unique ID(s) for each object in system + * + * @return array + */ + public function getIdentities() + { + $tags = []; + if ($this->isApproved() && $this->getEntityPkValue()) { + $tags[] = Product::CACHE_TAG . '_' . $this->getEntityPkValue(); + } + return $tags; + } } diff --git a/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php b/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php index e96842c2cc28601dd771445269d924f42cd51d01..4be052abd03baebb2d5125ab1662c30f99acd5bc 100644 --- a/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php +++ b/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php @@ -6,6 +6,7 @@ namespace Magento\Review\Test\Unit\Model; +use \Magento\Catalog\Model\Product; use \Magento\Review\Model\Review; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; @@ -270,4 +271,15 @@ class ReviewTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue($result)); $this->assertSame($result, $this->review->getEntityIdByCode($entityCode)); } + + public function testGetIdentities() + { + $this->review->setStatusId(Review::STATUS_PENDING); + $this->assertEmpty($this->review->getIdentities()); + + $productId = 1; + $this->review->setEntityPkValue($productId); + $this->review->setStatusId(Review::STATUS_APPROVED); + $this->assertEquals([Product::CACHE_TAG . '_' . $productId], $this->review->getIdentities()); + } } diff --git a/app/code/Magento/Review/composer.json b/app/code/Magento/Review/composer.json index 45201df67e97c0cfec3850649adf2b8fdcfbfa74..b8bb07beb0f6fc1ba9a59a47a57b2329e504a074 100644 --- a/app/code/Magento/Review/composer.json +++ b/app/code/Magento/Review/composer.json @@ -3,22 +3,22 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-newsletter": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-newsletter": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-cookie": "0.74.0-beta13" + "magento/module-cookie": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Review/view/frontend/layout/review_product_listajax.xml b/app/code/Magento/Review/view/frontend/layout/review_product_listajax.xml index 3af29a203ff8ff030ae04b5fa2dc651de88f9a5b..0f950489f8aae9dc1c8c8405a6c1c7a5adbf076a 100644 --- a/app/code/Magento/Review/view/frontend/layout/review_product_listajax.xml +++ b/app/code/Magento/Review/view/frontend/layout/review_product_listajax.xml @@ -7,7 +7,7 @@ --> <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/layout_generic.xsd"> <container name="root"> - <block class="Magento\Review\Block\Product\View\ListView" name="product.info.product_additional_data" as="product_additional_data" template="product/view/list.phtml"/> + <block class="Magento\Review\Block\Product\View\ListView" name="product.info.product_additional_data" as="product_additional_data" template="product/view/list.phtml" /> <block class="Magento\Theme\Block\Html\Pager" name="product_review_list.toolbar"> <arguments> <argument name="show_per_page" xsi:type="boolean">false</argument> diff --git a/app/code/Magento/Rss/composer.json b/app/code/Magento/Rss/composer.json index 9e085b9677094ac04fb063a23147c319500255be..ca4231a1f2e5bd6127a2792c31677aca56da011a 100644 --- a/app/code/Magento/Rss/composer.json +++ b/app/code/Magento/Rss/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Rule/Model/AbstractModel.php b/app/code/Magento/Rule/Model/AbstractModel.php index 6f4cebc0536d3f373f0da1b4658ded5c3263ea67..375c4180106991ac0a47ee2b5c069d84c11dd2b9 100644 --- a/app/code/Magento/Rule/Model/AbstractModel.php +++ b/app/code/Magento/Rule/Model/AbstractModel.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - /** * Abstract Rule entity data model */ @@ -63,16 +61,22 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel abstract public function getActionsInstance(); /** + * Form factory + * * @var \Magento\Framework\Data\FormFactory */ protected $_formFactory; /** + * Timezone instance + * * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface */ protected $_localeDate; /** + * Constructor + * * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\Data\FormFactory $formFactory @@ -233,7 +237,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel */ protected function _resetConditions($conditions = null) { - if (is_null($conditions)) { + if (null === $conditions) { $conditions = $this->getConditionsInstance(); } $conditions->setRule($this)->setId('1')->setPrefix('conditions'); @@ -250,7 +254,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel */ protected function _resetActions($actions = null) { - if (is_null($actions)) { + if (null === $actions) { $actions = $this->getActionsInstance(); } $actions->setRule($this)->setId('1')->setPrefix('actions'); @@ -390,6 +394,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * Check availability to delete rule * * @return bool + * @codeCoverageIgnore */ public function isDeleteable() { @@ -401,6 +406,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * * @param bool $value * @return $this + * @codeCoverageIgnore */ public function setIsDeleteable($value) { @@ -412,6 +418,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * Check if rule is readonly * * @return bool + * @codeCoverageIgnore */ public function isReadonly() { @@ -423,6 +430,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * * @param bool $value * @return $this + * @codeCoverageIgnore */ public function setIsReadonly($value) { diff --git a/app/code/Magento/Rule/Test/Unit/Model/Condition/Product/AbstractProductTest.php b/app/code/Magento/Rule/Test/Unit/Model/Condition/Product/AbstractProductTest.php index 32d0b012c88418f6e18656975357f3d17a9461f1..7c628927f6c15426dba5042fa02316cb428864bd 100644 --- a/app/code/Magento/Rule/Test/Unit/Model/Condition/Product/AbstractProductTest.php +++ b/app/code/Magento/Rule/Test/Unit/Model/Condition/Product/AbstractProductTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Rule\Test\Unit\Model\Condition\Product; use ReflectionMethod; @@ -14,24 +12,30 @@ use ReflectionProperty; class AbstractProductTest extends \PHPUnit_Framework_TestCase { /** - * @var AbstractProduct|\PHPUnit_Framework_MockObject_MockObject + * Tested condition + * + * @var \Magento\Rule\Model\Condition\Product\AbstractProduct|\PHPUnit_Framework_MockObject_MockObject */ protected $_condition; /** + * Framework object + * * @var \Magento\Framework\Object|\PHPUnit_Framework_MockObject_MockObject */ protected $_object; /** + * Reflection for Magento\Rule\Model\Condition\Product\AbstractProduct::$_entityAttributeValues + * * @var \ReflectionProperty - * 'Magento\Rule\Model\Condition\Product\AbstractProduct::_entityAttributeValues' */ protected $_entityAttributeValuesProperty; /** + * Reflection for Magento\Rule\Model\Condition\Product\AbstractProduct::$_config + * * @var \ReflectionProperty - * 'Magento\Rule\Model\Condition\Product\AbstractProduct::_config' */ protected $_configProperty; @@ -159,8 +163,10 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase $this->_condition, $this->getMock('Magento\Eav\Model\Config', [], [], '', false) ); - $this->_entityAttributeValuesProperty->setValue($this->_condition, - $this->getMock('Magento\Eav\Model\Config', [], [], '', false)); + $this->_entityAttributeValuesProperty->setValue( + $this->_condition, + $this->getMock('Magento\Eav\Model\Config', [], [], '', false) + ); $attribute = new \Magento\Framework\Object(); $attribute->setBackendType('datetime'); @@ -306,7 +312,7 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); $attrObjectSourceMock - ->expects(is_null($expectedAttrObjSourceAllOptionsParam) ? $this->never() : $this->once()) + ->expects((null === $expectedAttrObjSourceAllOptionsParam) ? $this->never() : $this->once()) ->method('getAllOptions') ->with($expectedAttrObjSourceAllOptionsParam) ->willReturn($attrObjectSourceAllOptionsValue); @@ -317,7 +323,7 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase ->getMock(); $attributeObjectMock->method('usesSource')->willReturn(true); $attributeObjectMock - ->expects(is_null($attributeObjectFrontendInput) ? $this->never() : $this->once()) + ->expects((null === $attributeObjectFrontendInput) ? $this->never() : $this->once()) ->method('getFrontendInput') ->willReturn($attributeObjectFrontendInput); $attributeObjectMock->method('getSource')->willReturn($attrObjectSourceMock); @@ -345,12 +351,14 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase $attrSetCollectionValueMock->method('setEntityTypeFilter')->will($this->returnSelf()); $attrSetCollectionValueMock->method('load')->will($this->returnSelf()); $attrSetCollectionValueMock - ->expects(is_null($attrSetCollectionOptionsArray) ? $this->never() : $this->once()) + ->expects((null === $attrSetCollectionOptionsArray) ? $this->never() : $this->once()) ->method('toOptionArray') ->willReturn($attrSetCollectionOptionsArray); - $attrSetCollectionProperty = - new ReflectionProperty('Magento\Rule\Model\Condition\Product\AbstractProduct', '_attrSetCollection'); + $attrSetCollectionProperty = new ReflectionProperty( + 'Magento\Rule\Model\Condition\Product\AbstractProduct', + '_attrSetCollection' + ); $attrSetCollectionProperty->setAccessible(true); $attrSetCollectionProperty->setValue($this->_condition, $attrSetCollectionValueMock); @@ -366,6 +374,8 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase } /** + * Data provider for prepare value options + * * @return array * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ diff --git a/app/code/Magento/Rule/composer.json b/app/code/Magento/Rule/composer.json index d6e66b999c893133d222d72c447801d2b2bff85e..5d0a656ebc0bb6db836a97268ddecc99906ad595 100644 --- a/app/code/Magento/Rule/composer.json +++ b/app/code/Magento/Rule/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php b/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php index 37c29c2be223a85d35eb22fa196c757480c062ed..b4f0e627cebf03296c4ce22b62758b0a0e40cd9e 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php @@ -38,20 +38,6 @@ class TemplateTest extends \PHPUnit_Framework_TestCase $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $objectManagerMock = $this->getMock('Magento\Framework\ObjectManagerInterface'); - $objectManagerMock->expects($this->once()) - ->method('get') - ->with('Magento\Email\Model\Resource\Template') - ->will($this->returnValue($objectManagerHelper->getObject('Magento\Email\Model\Resource\Template'))); - - try { - $this->objectManagerBackup = \Magento\Framework\App\ObjectManager::getInstance(); - } catch (\RuntimeException $e) { - $this->objectManagerBackup = \Magento\Framework\App\Bootstrap::createObjectManagerFactory(BP, $_SERVER) - ->create($_SERVER); - } - \Magento\Framework\App\ObjectManager::setInstance($objectManagerMock); - $this->template = $objectManagerHelper->getObject( 'Magento\Sales\Model\Email\Template', [ @@ -60,12 +46,6 @@ class TemplateTest extends \PHPUnit_Framework_TestCase ); } - protected function tearDown() - { - parent::tearDown(); - \Magento\Framework\App\ObjectManager::setInstance($this->objectManagerBackup); - } - public function testIncludeTemplate() { $this->mockViewFilesystem->expects($this->once()) diff --git a/app/code/Magento/Sales/composer.json b/app/code/Magento/Sales/composer.json index 7f07de89e05f1b012a4d782d2828f7f86dd127eb..e9850b28b5ebbefd68476b14a55a1ea6f8bb63af 100644 --- a/app/code/Magento/Sales/composer.json +++ b/app/code/Magento/Sales/composer.json @@ -3,35 +3,35 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-sales-rule": "0.74.0-beta13", - "magento/module-sales-sequence": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-gift-message": "0.74.0-beta13", - "magento/module-reports": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-email": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-sales-rule": "0.74.0-beta14", + "magento/module-sales-sequence": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-gift-message": "0.74.0-beta14", + "magento/module-reports": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-wishlist": "0.74.0-beta14", + "magento/module-email": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/SalesRule/composer.json b/app/code/Magento/SalesRule/composer.json index 73ca3c6e1d876da3377b77cc31d0a0a61b398a5a..e842b73e7b207cacc55274b6f11cb78df5d008ab 100644 --- a/app/code/Magento/SalesRule/composer.json +++ b/app/code/Magento/SalesRule/composer.json @@ -3,26 +3,26 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-rule": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-reports": "0.74.0-beta13", - "magento/module-catalog-rule": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-rule": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-reports": "0.74.0-beta14", + "magento/module-catalog-rule": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/SalesSequence/composer.json b/app/code/Magento/SalesSequence/composer.json index 15ce9855deb2e50bac1d6261380f653585182cfc..825a8e16713a027df4ea0dd1da8d58e2af16c7ea 100644 --- a/app/code/Magento/SalesSequence/composer.json +++ b/app/code/Magento/SalesSequence/composer.json @@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Search/composer.json b/app/code/Magento/Search/composer.json index d0eea2c18d8d8791e84e4b2b396f714ccedd2388..98e1ce97eda1a03ced7574846f0a8d0d3efc2722 100644 --- a/app/code/Magento/Search/composer.json +++ b/app/code/Magento/Search/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog-search": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-reports": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog-search": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-reports": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/SendFriend/composer.json b/app/code/Magento/SendFriend/composer.json index f8e2a4f687541841f0942de6a0805271b6dac339..b6712222a0c651e7a30e4186b029c40789fd30ae 100644 --- a/app/code/Magento/SendFriend/composer.json +++ b/app/code/Magento/SendFriend/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Shipping/composer.json b/app/code/Magento/Shipping/composer.json index 1960a285405d0b1fb9159a8cbb6905f4b27b57e8..26e8e039f88d70c2292afe9ffeae4601a4f1ea4a 100644 --- a/app/code/Magento/Shipping/composer.json +++ b/app/code/Magento/Shipping/composer.json @@ -3,27 +3,27 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-contact": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-contact": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "ext-gd": "*", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-fedex": "0.74.0-beta13", - "magento/module-ups": "0.74.0-beta13" + "magento/module-fedex": "0.74.0-beta14", + "magento/module-ups": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Sitemap/composer.json b/app/code/Magento/Sitemap/composer.json index 7c7137e8db82477d6c3ded19a28dd6969b68fc42..6e9cd7ca7d1d8f9a280952fcccdd76c9b45a844c 100644 --- a/app/code/Magento/Sitemap/composer.json +++ b/app/code/Magento/Sitemap/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog-url-rewrite": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog-url-rewrite": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Store/composer.json b/app/code/Magento/Store/composer.json index e8a224d7a443669cfe35054a4ebb9af15f6138fe..3bb80c7c21ec85900b2c9c7ec5b15ce3a6c99176 100644 --- a/app/code/Magento/Store/composer.json +++ b/app/code/Magento/Store/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-directory": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-directory": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Tax/composer.json b/app/code/Magento/Tax/composer.json index 3ef7c5e73fc4cd09ad9f1ff4cca1b0b5f56ed1d6..b2d4d6faad79318556340971f6dd6d832e89af6c 100644 --- a/app/code/Magento/Tax/composer.json +++ b/app/code/Magento/Tax/composer.json @@ -3,24 +3,24 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-reports": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-reports": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/TaxImportExport/composer.json b/app/code/Magento/TaxImportExport/composer.json index 0cebf5d7d3360dba867fee97e90b3a9d2336ad91..2642b8587938955bd7b651a9485560794002064f 100644 --- a/app/code/Magento/TaxImportExport/composer.json +++ b/app/code/Magento/TaxImportExport/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-tax": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-tax": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Theme/composer.json b/app/code/Magento/Theme/composer.json index 7e2129cc460bb0145f4cf7dacf63bb226e4bb049..9fbb0bd754d2cc08791507e25ca35d5d013776d9 100644 --- a/app/code/Magento/Theme/composer.json +++ b/app/code/Magento/Theme/composer.json @@ -3,23 +3,23 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-require-js": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-require-js": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-translation": "0.74.0-beta13" + "magento/module-translation": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Translation/composer.json b/app/code/Magento/Translation/composer.json index 05ce2874e8b195cefb7355cb2208a5ca59b6208d..7de19b36d8a93d4c6640246a5098e529c27e1860 100644 --- a/app/code/Magento/Translation/composer.json +++ b/app/code/Magento/Translation/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-backend": "0.74.0-beta13", - "magento/module-developer": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-backend": "0.74.0-beta14", + "magento/module-developer": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Ui/Component/Control/ActionPool.php b/app/code/Magento/Ui/Component/Control/ActionPool.php index 74f327fec1531089563d850815d93ad1bdbfc351..6ccb8393648dc0337a7acc66d6f4022acfbce878 100644 --- a/app/code/Magento/Ui/Component/Control/ActionPool.php +++ b/app/code/Magento/Ui/Component/Control/ActionPool.php @@ -128,7 +128,7 @@ class ActionPool implements ActionPoolInterface { $container = $this->context->getPageLayout()->createBlock( 'Magento\Ui\Component\Control\Container', - 'container-' . $key, + 'container-' . $view->getName() . '-' . $key, [ 'data' => [ 'button_item' => $this->items[$key], diff --git a/app/code/Magento/Ui/Test/Unit/Component/Control/ActionPoolTest.php b/app/code/Magento/Ui/Test/Unit/Component/Control/ActionPoolTest.php index eaae007216af0aa226ff98336e22c727190102a0..8d62c797c2f061a82c07d05bfae258a47a1922ef 100644 --- a/app/code/Magento/Ui/Test/Unit/Component/Control/ActionPoolTest.php +++ b/app/code/Magento/Ui/Test/Unit/Component/Control/ActionPoolTest.php @@ -99,6 +99,7 @@ class ActionPoolTest extends \PHPUnit_Framework_TestCase public function testAdd() { $data = ['id' => 'id']; + $this->uiComponentInterfaceMock->expects($this->once())->method('getName')->willReturn('name'); $this->itemFactoryMock->expects($this->any())->method('create')->willReturn($this->items[$this->key]); $this->items[$this->key]->expects($this->any())->method('setData')->with($data)->willReturnSelf(); @@ -114,7 +115,7 @@ class ActionPoolTest extends \PHPUnit_Framework_TestCase ->method('createBlock') ->with( 'Magento\Ui\Component\Control\Container', - 'container-' . $this->key, + 'container-name-' . $this->key, [ 'data' => [ 'button_item' => $this->items[$this->key], diff --git a/app/code/Magento/Ui/composer.json b/app/code/Magento/Ui/composer.json index edb3157e7aab2160a922d9f80b68fe3674e946ed..35d8c625925fde44598e7b8524c3e574d51f309e 100644 --- a/app/code/Magento/Ui/composer.json +++ b/app/code/Magento/Ui/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Ups/composer.json b/app/code/Magento/Ups/composer.json index 29ec2510c07e79abb5e21f664e90c98db3554609..871fbcdc12c1d2a6a3055ac20e0b5370575a5489 100644 --- a/app/code/Magento/Ups/composer.json +++ b/app/code/Magento/Ups/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/UrlRewrite/composer.json b/app/code/Magento/UrlRewrite/composer.json index 91f18fbea4728a982a17dca4cd56a0ac9f5ab88e..24a2772e11a3c6bf97a534c2fa44c09e672e3d6d 100644 --- a/app/code/Magento/UrlRewrite/composer.json +++ b/app/code/Magento/UrlRewrite/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog-url-rewrite": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-cms-url-rewrite": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog-url-rewrite": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-cms-url-rewrite": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/User/composer.json b/app/code/Magento/User/composer.json index 82c4b5609f4d62e0499e75a6a4f4147da21ebdf6..b16f88f04a4c5b9cec2efb70b688923490d10226 100644 --- a/app/code/Magento/User/composer.json +++ b/app/code/Magento/User/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-integration": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-integration": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Usps/composer.json b/app/code/Magento/Usps/composer.json index 625a904edd642d843d9d02ec910e2616a242dd5f..59b75138b5be4d8cb021390eec32bc8747c00f8e 100644 --- a/app/code/Magento/Usps/composer.json +++ b/app/code/Magento/Usps/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Variable/composer.json b/app/code/Magento/Variable/composer.json index b61f8fe802c68ffa61e53966cb117e1f439a4436..58eb8dbd4b6c0be1e41c82dd72972cde940dfe8c 100644 --- a/app/code/Magento/Variable/composer.json +++ b/app/code/Magento/Variable/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.4.11|~5.5.0|~5.6.0", - "magento/module-backend": "0.74.0-beta13", - "magento/module-email": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-backend": "0.74.0-beta14", + "magento/module-email": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Version/composer.json b/app/code/Magento/Version/composer.json index 4a3025af599865f283ba05b22341148d4412162e..07feda54cfd8fcfa810c79f28b9775b8abd4951b 100644 --- a/app/code/Magento/Version/composer.json +++ b/app/code/Magento/Version/composer.json @@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Webapi/composer.json b/app/code/Magento/Webapi/composer.json index 94d5b769e85526178ded1e4a57d0488acccca8b6..7c018de1b3b051d135d1fe69741e44a94185723c 100644 --- a/app/code/Magento/Webapi/composer.json +++ b/app/code/Magento/Webapi/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", - "magento/module-integration": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", + "magento/module-integration": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-user": "0.74.0-beta13" + "magento/module-user": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Weee/composer.json b/app/code/Magento/Weee/composer.json index ba0a615bab17ec2d4cd8221715dd418b87785220..7102e797d034a46b70b9724af86c42669e9a8d1b 100644 --- a/app/code/Magento/Weee/composer.json +++ b/app/code/Magento/Weee/composer.json @@ -3,21 +3,21 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Widget/composer.json b/app/code/Magento/Widget/composer.json index cfecd20e99f1b7ad876322a228f0868b448e1c05..53ed15c7b6fb5644a930350c0ef7825766161645 100644 --- a/app/code/Magento/Widget/composer.json +++ b/app/code/Magento/Widget/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-variable": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-variable": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Wishlist/Block/Cart/Item/Renderer/Actions/MoveToWishlist.php b/app/code/Magento/Wishlist/Block/Cart/Item/Renderer/Actions/MoveToWishlist.php new file mode 100644 index 0000000000000000000000000000000000000000..790280fe2d76c33de1c57a74a2850728f86ae244 --- /dev/null +++ b/app/code/Magento/Wishlist/Block/Cart/Item/Renderer/Actions/MoveToWishlist.php @@ -0,0 +1,52 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Wishlist\Block\Cart\Item\Renderer\Actions; + +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Framework\View\Element\Template; +use Magento\Wishlist\Helper\Data; + +class MoveToWishlist extends Generic +{ + /** + * @var Data + */ + protected $wishlistHelper; + + /** + * @param Template\Context $context + * @param Data $wishlistHelper + * @param array $data + */ + public function __construct( + Template\Context $context, + Data $wishlistHelper, + array $data = [] + ) { + $this->wishlistHelper = $wishlistHelper; + parent::__construct($context, $data); + } + + /** + * Check whether "add to wishlist" button is allowed in cart + * + * @return bool + */ + public function isAllowInCart() + { + return $this->wishlistHelper->isAllowInCart(); + } + + /** + * Get JSON POST params for moving from cart + * + * @return string + */ + public function getMoveFromCartParams() + { + return $this->wishlistHelper->getMoveFromCartParams($this->getItem()->getId()); + } +} diff --git a/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php b/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e64e5803f094a2210a09b9b5536f5c441b4416f4 --- /dev/null +++ b/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php @@ -0,0 +1,71 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Wishlist\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist; +use Magento\Quote\Model\Quote\Item; +use Magento\Wishlist\Helper\Data; + +class MoveToWishlistTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var MoveToWishlist + */ + protected $model; + + /** @var Data|\PHPUnit_Framework_MockObject_MockObject */ + protected $wishlistHelperMock; + + protected function setUp() + { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->wishlistHelperMock = $this->getMockBuilder('Magento\Wishlist\Helper\Data') + ->disableOriginalConstructor() + ->getMock(); + + $this->model = $objectManagerHelper->getObject( + 'Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist', + [ + 'wishlistHelper' => $this->wishlistHelperMock, + ] + ); + } + + public function testIsAllowInCart() + { + $this->wishlistHelperMock->expects($this->once()) + ->method('isAllowInCart') + ->willReturn(true); + + $this->assertTrue($this->model->isAllowInCart()); + } + + public function testGetMoveFromCartParams() + { + $itemId = 45; + $json = '{json;}'; + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $itemMock->expects($this->once()) + ->method('getId') + ->willReturn($itemId); + + $this->wishlistHelperMock->expects($this->once()) + ->method('getMoveFromCartParams') + ->with($itemId) + ->willReturn($json); + + $this->model->setItem($itemMock); + $this->assertEquals($json, $this->model->getMoveFromCartParams()); + } +} diff --git a/app/code/Magento/Wishlist/composer.json b/app/code/Magento/Wishlist/composer.json index 703058cbf5f90410d1631d2d9dedda1ad6c026f4..31d183b64bb0ae5cafd1f548adcc4c776cf12132 100644 --- a/app/code/Magento/Wishlist/composer.json +++ b/app/code/Magento/Wishlist/composer.json @@ -3,28 +3,28 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-rss": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-grouped-product": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-rss": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-grouped-product": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-configurable-product": "0.74.0-beta13", - "magento/module-downloadable": "0.74.0-beta13", - "magento/module-bundle": "0.74.0-beta13", - "magento/module-cookie": "0.74.0-beta13" + "magento/module-configurable-product": "0.74.0-beta14", + "magento/module-downloadable": "0.74.0-beta14", + "magento/module-bundle": "0.74.0-beta14", + "magento/module-cookie": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Wishlist/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Wishlist/view/frontend/layout/checkout_cart_item_renderers.xml new file mode 100644 index 0000000000000000000000000000000000000000..6318b605dd52b13999b0337d28905768f4162d14 --- /dev/null +++ b/app/code/Magento/Wishlist/view/frontend/layout/checkout_cart_item_renderers.xml @@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> + <body> + <referenceBlock name="checkout.cart.item.renderers.default.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.default.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.default.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.simple.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.simple.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.simple.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.bundle.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.bundle.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.bundle.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.downloadable.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.downloadable.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.downloadable.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.grouped.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.grouped.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.grouped.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.configurable.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.configurable.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.configurable.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.virtual.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.virtual.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.virtual.actions.edit"/> + </referenceBlock> + </body> +</page> diff --git a/app/code/Magento/Wishlist/view/frontend/templates/cart/item/renderer/actions/move_to_wishlist.phtml b/app/code/Magento/Wishlist/view/frontend/templates/cart/item/renderer/actions/move_to_wishlist.phtml new file mode 100644 index 0000000000000000000000000000000000000000..196122cf80c6e05975bedfd5ec7dfba3df9b3c2e --- /dev/null +++ b/app/code/Magento/Wishlist/view/frontend/templates/cart/item/renderer/actions/move_to_wishlist.phtml @@ -0,0 +1,17 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +/** @var $block \Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist */ +?> +<?php if ($block->isAllowInCart() && $block->isProductVisibleInSiteVisibility()): ?> + <a href="#" + data-post='<?php echo $block->getMoveFromCartParams(); ?>' + class="use-ajax action action-towishlist"> + <span><?php echo __('Move to Wishlist'); ?></span> + </a> +<?php endif ?> diff --git a/app/code/Magento/Wishlist/view/frontend/templates/rss/email.phtml b/app/code/Magento/Wishlist/view/frontend/templates/rss/email.phtml index 8655b864bc2fa14eb7e87f6464710acd5430f7df..7043be8d41932d846e1461f7ed5ce9db6f41afdd 100644 --- a/app/code/Magento/Wishlist/view/frontend/templates/rss/email.phtml +++ b/app/code/Magento/Wishlist/view/frontend/templates/rss/email.phtml @@ -10,7 +10,7 @@ ?> <?php if ($block->getLink()): ?> <p style="font-size:12px; line-height:16px; margin:0 0 16px;"> - <?php echo __("RSS link to %1's wishlist", $this->helper('Magento\Wishlist\Helper\Data')->getCustomerName()) ?> + <?php echo __("RSS link to %1's wishlist", $block->escapeHtml($this->helper('Magento\Wishlist\Helper\Data')->getCustomerName())) ?> <br /> <a href="<?php echo $block->getLink(); ?>"><?php echo $block->getLink(); ?></a> </p> diff --git a/app/design/adminhtml/Magento/backend/composer.json b/app/design/adminhtml/Magento/backend/composer.json index 58fbb8be56c6018d058fc9797820f32babab0f07..a635d2f6368d6f8d066d468efc7a6056820e06e4 100644 --- a/app/design/adminhtml/Magento/backend/composer.json +++ b/app/design/adminhtml/Magento/backend/composer.json @@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-theme", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_cart.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_cart.less index 68018d4275960d6c94c3b4cff3307c69a8ac584a..089a66bff442b12dda09f922093d1e215abc9e43 100644 --- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_cart.less +++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_cart.less @@ -4,323 +4,326 @@ // */ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { -// -// Shopping cart -//-------------------------------------- -.cart { - // Summary block - &-summary { - &:extend(.abs-add-box-sizing all); - .css(background, @sidebar__background-color); - margin-bottom: @indent__m; - padding: 1px 15px @indent__m; - > .title { - .heading(h3); - display: block; - } - .block { - margin-bottom: 0; + // + // Shopping cart + // --------------------------------------------- + + .cart { + // Summary block + &-summary { + &:extend(.abs-add-box-sizing all); + .css(background, @sidebar__background-color); + margin-bottom: @indent__m; + padding: 1px 15px @indent__m; > .title { - .icon-font( - @_icon-font-content: @icon-down, - @_icon-font-size: 30px, - @_icon-font-position: after - ); - border-top: @border-width__base solid @border-color__base; - cursor: pointer; display: block; - font-weight: @font-weight__semibold; - margin-bottom: 0; - overflow: hidden; - padding: 7px 20px 7px 5px; - position: relative; - &:after { - position: absolute; - right: 0; - top: -5px; - } - strong { - .column.main & { - font-weight: @font-weight__regular; - .font-size(18); - } - } - } - > .content { - display: none; + .heading(h3); } - &.active { + .block { + margin-bottom: 0; > .title { - .icon-font-symbol( - @_icon-font-content: @icon-prev, - @_icon-font-position: after + border-top: @border-width__base solid @border-color__base; + cursor: pointer; + font-weight: @font-weight__semibold; + .icon-font( + @_icon-font-content: @icon-down, + @_icon-font-size: 30px, + @_icon-font-position: after, + @_icon-font-display: block ); + margin-bottom: 0; + overflow: hidden; + padding: 7px @indent__base 7px @indent__xs; + position: relative; + &:after { + position: absolute; + right: 0; + top: -5px; + } + strong { + .column.main & { + .font-size(18); + font-weight: @font-weight__regular; + } + } } > .content { - display: block; + display: none; } - } - .item-options { - margin-left: 0; - } - .fieldset { - margin: 15px 0 25px 5px; - .field { - margin: 0 0 @indent__s; - &.note { - font-size: @font-size__s; + &.active { + > .title { + .icon-font-symbol( + @_icon-font-content: @icon-prev, + @_icon-font-position: after + ); + } + > .content { + display: block; } } - } - .fieldset { - .methods { + .item-options { + margin-left: 0; + } + .fieldset { + margin: 15px 0 @indent__m @indent__xs; .field { - > .label { - display: inline; + margin: 0 0 @indent__s; + &.note { + font-size: @font-size__s; } } } - } - .fieldset.estimate { - > .legend, - > .legend + br { - &:extend(.abs-no-display all); + .fieldset { + .methods { + .field { + > .label { + display: inline; + } + } + } + } + .fieldset.estimate { + > .legend, + > .legend + br { + &:extend(.abs-no-display all); + } } } - } - .actions-toolbar { - > .primary { - button { - &:extend(.abs-revert-secondary-color all); + .actions-toolbar { + > .primary { + button { + &:extend(.abs-revert-secondary-color all); + } } } + &:extend(.abs-adjustment-incl-excl-tax all); } - &:extend(.abs-adjustment-incl-excl-tax all); - } - // Totals block - &-totals { - .table-wrapper { - overflow: inherit; - } - border-top: 1px solid @border-color__base; - padding-top: 10px; - .mark { - font-weight: @font-weight__regular; - padding-left: 4px; - strong { + // Totals block + &-totals { + border-top: 1px solid @border-color__base; + padding-top: 10px; + .table-wrapper { + overflow: inherit; + } + .mark { font-weight: @font-weight__regular; - } - } - .amount { - padding-right: 4px; - text-align: right; - strong { - font-weight: @font-weight__regular; - } - } - .grand:last-child { - .mark, - .amount { - padding-top: @indent__base; + padding-left: 4px; + strong { + font-weight: @font-weight__regular; + } } .amount { padding-right: 4px; text-align: right; strong { - font-weight: @font-weight__bold; + font-weight: @font-weight__regular; } } - } - .msrp { - margin-bottom: @indent__s; - } - .totals-tax { - &-summary { + .grand:last-child { .mark, .amount { - border-top: @border-width__base solid @border-color__base; - border-bottom: @border-width__base solid @border-color__base; - cursor: pointer; + padding-top: @indent__base; } - .amount .price { - position: relative; - padding-right: @indent__m; - .icon-font( - @icon-down, - @_icon-font-size: 30px, - @_icon-font-text-hide: true, - @_icon-font-position: after, - @_icon-font-display: block - ); - &:after { - position: absolute; - right: -5px; - top: -12px; + .amount { + padding-right: 4px; + text-align: right; + strong { + font-weight: @font-weight__bold; } } - &.expanded { + } + .msrp { + margin-bottom: @indent__s; + } + .totals-tax { + &-summary { .mark, .amount { - border-bottom: 0; + border-bottom: @border-width__base solid @border-color__base; + border-top: @border-width__base solid @border-color__base; + cursor: pointer; } .amount .price { - .icon-font-symbol( + .icon-font( + @icon-down, + @_icon-font-size: 30px, + @_icon-font-text-hide: true, + @_icon-font-position: after, + @_icon-font-display: block + ); + padding-right: @indent__m; + position: relative; + &:after { + position: absolute; + right: -5px; + top: -12px; + } + } + &.expanded { + .mark, + .amount { + border-bottom: 0; + } + .amount .price { + .icon-font-symbol( @_icon-font-content: @icon-up, @_icon-font-position: after - ); + ); + } } } - } - &-details { - display: none; - border-bottom: @border-width__base solid @border-color__base; - &.shown { - display: table-row; + &-details { + border-bottom: @border-width__base solid @border-color__base; + display: none; + &.shown { + display: table-row; + } } } + .table-wrapper { + margin-bottom: 0; + } + .table-caption { + &:extend(.abs-no-display all); + } } - .table-wrapper { - margin-bottom: 0; - } - .table-caption { - &:extend(.abs-no-display all); - } - } - // Products table - &.table-wrapper { - .items { - thead + .item { - border-top: @border-width__base solid @border-color__base; + // Products table + &.table-wrapper { + .items { + thead + .item { + border-top: @border-width__base solid @border-color__base; + } + > .item { + border-bottom: @border-width__base solid @border-color__base; + position: relative; + } } - > .item { - border-bottom: @border-width__base solid @border-color__base; - position: relative; + .col { + padding-top: 20px; + &.qty { + .input-text { + margin-top: -5px; + &:extend(.abs-input-qty all); + } + .label { + &:extend(.abs-visually-hidden all); + } + } } - } - .col { - padding-top: 20px; - &.qty { - .input-text { - margin-top: -5px; - &:extend(.abs-input-qty all); + .item { + &-actions td { + padding-bottom: @indent__s; + text-align: center; + white-space: normal; } - .label { - &:extend(.abs-visually-hidden all); + .col { + &.item { + display: block; + min-height: 75px; + padding: @indent__m 0 @indent__s 75px; + position: relative; + } } } - } - .item { - &-actions td { - padding-bottom: 10px; - text-align: center; - white-space: normal; + .actions-toolbar { + &:extend(.abs-add-clearfix all); + > .action { + &:extend(button all); + .link-as-button(); + margin-bottom: @indent__s; + margin-right: @indent__s; + &:last-child { + margin-right: 0; + } + } } - .col { - &.item { + .action { + &.help.map { + &:extend(.abs-action-button-as-link all); + font-weight: @font-weight__regular; + } + } + .product { + &-item-photo { display: block; - padding: 25px 0 10px 75px; - position: relative; - min-height: 75px; + left: 0; + max-width: 60px; + padding: 0; + position: absolute; + top: 15px; + width: 100%; + } + &-item-details { + white-space: normal; + } + &-item-name { + display: inline-block; + font-weight: @font-weight__regular; + margin-top: -6px; } } - } - .actions-toolbar { - > .action { - &:extend(button all); - .link-as-button(); - margin-left: @indent__s; - margin-bottom: @indent__s; - &:first-child { - margin-left: 0; + .gift-registry-name-label { + &:after { + content: ':'; } } - } - .action { - &.help.map { - &:extend(.abs-action-button-as-link all); - font-weight: @font-weight__regular; + // Product options + .item-options { + font-size: @font-size__s; + margin-bottom: @indent__s; + &:extend(.abs-product-options-list all); + &:extend(.abs-add-clearfix all); } - } - .product { - &-item-photo { - display: block; - max-width: 60px; - left: 0; - padding: 0; - position: absolute; - top: 15px; - width: 100%; + + .product-item-name + .item-options { + margin-top: @indent__s; } - &-item-details { - white-space: normal; + + .product-image-wrapper { + &:extend(.abs-reset-image-wrapper all); } - &-item-name { + .action.configure { display: inline-block; - font-weight: @font-weight__regular; - margin-top: -6px; + margin: 0 0 @indent__base; } } - .gift-registry-name-label { - &:after { - content: ":"; + &-container { + .form-cart { + &:extend(.abs-shopping-cart-items all); } - } - // Product options - .item-options { - font-size: @font-size__s; - margin-bottom: @indent__s; - &:extend(.abs-product-options-list all); - &:extend(.abs-add-clearfix all); - } - - .product-item-name + .item-options { - margin-top: @indent__s; - } - - .product-image-wrapper { - &:extend(.abs-reset-image-wrapper all); - } - .action.configure { - display: inline-block; - margin: 0 0 @indent__base; - } - } - &-container { - .form-cart { - &:extend(.abs-shopping-cart-items all); - } - .checkout-methods-items { - &:extend(.abs-reset-list all); - text-align: center; - margin-top: @indent__base; - .action.primary { - &:extend(.abs-button-l all); - margin-bottom: @indent__s; - width: 100%; + .checkout-methods-items { + margin-top: @indent__base; + &:extend(.abs-reset-list all); + text-align: center; + .action.primary { + &:extend(.abs-button-l all); + margin-bottom: @indent__s; + width: 100%; + } } } } -} -// -// Cross sell -//-------------------------------------- -.block.crosssell { - margin-top: 70px; -} + // + // Cross sell + // --------------------------------------------- + .block.crosssell { + margin-top: 70px; + } } // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { .cart { &.table-wrapper { @@ -341,7 +344,7 @@ white-space: nowrap; width: 33%; &:before { - content: attr(data-th) ":"; + content: attr(data-th) ':'; display: block; font-weight: @font-weight__bold; padding-bottom: 10px; @@ -360,12 +363,16 @@ &:extend(.abs-shopping-cart-items-mobile all); } } + &.table-wrapper { + overflow: inherit; + } } } // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .cart { &-container { @@ -378,8 +385,8 @@ } } &-summary { - position: relative; float: right; + position: relative; width: 23%; .actions-toolbar { .column.main & { @@ -413,11 +420,11 @@ .product { &-item-photo { display: table-cell; + max-width: 100%; padding-right: @indent__base; + position: static; vertical-align: top; width: 1%; - position: static; - max-width: 100%; } &-item-details { display: table-cell; diff --git a/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/_module.less index 121a06f86bf824d7b5d34d90caf7dfd36c74bad5..2d0e55d1620636743623cfea6dd99a900743cc73 100644 --- a/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/_module.less +++ b/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/_module.less @@ -4,182 +4,288 @@ // */ // -// Common -//-------------------------------------- +// Variables +// _____________________________________________ -& when (@media-common = true) { +@gift-message-field-label__color: @color-gray40; +@gift-item-block__border-color: @color-gray-light5; +@gift-item-block__border-width: @border-width__base; + +// +// Common +// _____________________________________________ -.gift-message { - margin: 0; - .fieldset& { - > .legend { - &:extend(.abs-methods-shipping-title all); +& when (@media-common = true) { + .gift-message { + .actions-toolbar { + .action-cancel { + &:extend(.abs-action-button-as-link all); + display: none; + } } - } - .opc-wrapper .step-content .fieldset& { - br + .field { - margin: 0; + .field { + .label { + .css(color, @gift-message-field-label__color); + .css(font-weight, @font-weight__regular); + } } } - .field.choice { - font-weight: @font-weight__regular; + + .gift-options { + &:extend(.abs-add-clearfix all); + } + + .gift-options-title { margin: 0 0 @indent__base; - &:before { - display: none; + } + + .gift-options-content { + .fieldset { + margin: 0 0 @indent__base; } } - .activate.message { - display: inline-block; - margin: 0 0 @indent__s; - } - .product-image-wrapper { - &:extend(.abs-reset-image-wrapper all); - } - .options-items { - .css(background, @sidebar__background-color); - display: block; - margin: @indent__base 0 0; - padding: @indent__base; - .order-title:not(:first-child), - .extra-options-container { - font-weight: @font-weight__regular; - margin: @indent__base 0 0; - } - .order-options { - margin: 0 0 @indent__base @indent__base; - } - .block.message { - margin-bottom: @indent__s; - } - .items { - .list-reset-styles(); - .item { - border-bottom: @border-width__base solid @border-color__base; - margin-bottom: @indent__base; - padding-bottom: @indent__s; - .product { - .photo { - margin: @indent__s 0; - } - } - &:last-child { - border-bottom: 0; - padding-bottom: 0; + .gift-summary { + .actions-toolbar { + > .secondary { + float: none; + .action { + margin: @indent__s @indent__base 0 0; } } } - .number { - font-size: @font-size__s; - } - .regular-price, - .price-including-tax, - .price-excluding-tax { - &:before { - content: attr(data-label) ": "; - } - .price { - font-weight: @font-weight__bold; + } + + // + // In-table block + // --------------------------------------------- + + .cart.table-wrapper { + .gift-content { + display: none; + clear: left; + float: left; + margin-right: -100%; + padding: @indent__base 0; + width: 100%; + text-align: left; + &._active { + display: block; } } - .price-including-tax { - .font-size(14); + + .action-gift { + &:extend(.cart.table-wrapper .actions-toolbar > .action all); + .button-icon( + @icon-down, + @_icon-font-size: 32px, + @_icon-font-line-height: 16px, + @_icon-font-position: after + ); + &._active { + .icon-font-symbol( + @icon-up, + @_icon-font-position: after + ); + } } } -} -// -// Account order gift message -//-------------------------------------- -.order-details-items { - .order-gift-message, - .block-order-details-gift-message { - .item-options { - dt { - margin: @indent__s 0; - font-weight: @font-weight__regular; + // + // Collapsible block + // --------------------------------------------- + + .gift-item-block { + margin: 0; + &._active { + .title { + .icon-font-symbol( + @icon-up, + @_icon-font-position: after + ); } } - &:extend(.abs-add-clearfix all); - dt:after { - content: ""; - } - .label { - &:extend(.abs-colon all); + + .title { + border-radius: 3px; + .button( + @_button-margin: 20px 0 0, + @_button-padding: 7px 15px, + @_button-icon-use: true, + @_button-font-content: @icon-down, + @_button-icon-font: @button-icon__font, + @_button-icon-font-size: 32px, + @_button-icon-font-line-height: 16px, + @_button-icon-font-position: after + ); + .css(font-weight, @font-weight__bold); + &:active { + .css(box-shadow, @button__shadow); + } } - .item-message { - clear: left; + + .content { + &:extend(.abs-add-clearfix all); + .css(border-bottom, @gift-item-block__border-width solid @gift-item-block__border-color); + padding: @indent__s @indent__s @indent__base; + position: relative; } } -} -.order-details-items .order-items { - .order-gift-message { - &:not(.expanded-content) { - &:extend(.abs-hidden); - } - .action.close { - &:extend(.abs-no-display all); + // + // Account order gift message + // --------------------------------------------- + + .order-details-items { + .order-gift-message, + .block-order-details-gift-message { + .item-options { + dt { + .css(font-weight, @font-weight__regular); + margin: @indent__s 0; + } + } + &:extend(.abs-add-clearfix all); + dt { + &:after { + content: ''; + } + } + .label { + &:extend(.abs-colon all); + } + .item-message { + clear: left; + } } } - .action.show { - padding-right: @indent__base; - position: relative; - .icon-font( + + .order-details-items .order-items { + .order-gift-message { + &:not(.expanded-content) { + &:extend(.abs-hidden); + } + .action.close { + &:extend(.abs-no-display all); + } + } + .action.show { + .icon-font( @_icon-font-content: @icon-down, @_icon-font-size: 22px, @_icon-font-text-hide: false, @_icon-font-position: after, @_icon-font-display: inline-block - ); - &:after { - position: absolute; - right: 0; - top: -4px; - } - &.expanded { - .icon-font-symbol( + ); + padding-right: @indent__base; + position: relative; + &:after { + position: absolute; + right: 0; + top: -4px; + } + &.expanded { + .icon-font-symbol( @_icon-font-content: @icon-up, @_icon-font-position: after - ); + ); + } } } + + .block-order-details-gift-message { + border-top: @border-width__base solid @border-color__base; + padding-top: @indent__s; + } } -.block-order-details-gift-message { - border-top: @border-width__base solid @border-color__base; - padding-top: @indent__s; +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .gift-message { + .actions-toolbar { + .action-update { + .font-size(20); + padding: 15px; + width: 100%; + } + } + } + .gift-item-block { + border-bottom: 0; + .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); + } + .cart.table-wrapper { + .gift-content { + margin-right: -@indent__s; + } + } } +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .cart.table-wrapper { + .gift-content { + border-bottom: @border-width__base solid @border-color__base; + margin-bottom: @indent__base; + } + } } // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .gift-message { - .item { - border-bottom: @border-width__base solid @border-color__base; - margin-bottom: @indent__base; - padding-bottom: @indent__s; - &:extend(.abs-add-clearfix-desktop all); - .product { - float: left; - margin-right: @indent__base; - .photo { - margin: @indent__s 0; + .actions-toolbar { + .secondary { + float: right; + .action { + float: right; + margin-left: @indent__base; } - .name { - text-overflow: ellipsis; - overflow: hidden; - max-width: 145px; + .action-cancel { + display: block; + float: left; + margin-top: 6px; } } - .options { - overflow: hidden; - } } - .price-box > .price { - display: block; + .field { + &:extend(.abs-clearfix all); + .form-field-type-revert( + @_type: inline, + @_type-inline-label-align: left + ); + } + } + .gift-options-title { + .css(font-weight, @font-weight__light); + .font-size(18); + } + .gift-summary, + .cart.table-wrapper .gift-summary { + .actions-toolbar { + &:extend(.abs-reset-left-margin-desktop all); + } + } + .cart-container { + .cart-gift-item { + &:extend(.abs-shopping-cart-items-desktop all); + } + } + + // + // In-table block + // --------------------------------------------- + + .cart.table-wrapper { + .action-gift { + float: left; + } + .gift-content { + padding: @indent__base 0; } } } diff --git a/app/design/frontend/Magento/blank/composer.json b/app/design/frontend/Magento/blank/composer.json index ed12dd50070e3732d4d1dad3ae1035b8452d9dc4..e715b5304c3a39ca06f52c98c37a438a68cf839d 100644 --- a/app/design/frontend/Magento/blank/composer.json +++ b/app/design/frontend/Magento/blank/composer.json @@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-theme", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_cart.less b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_cart.less index 3b102ea7e75ff16c628f0e7dfb72dba27f006640..84fe60c7262910782021ee8c38b2d319cc66efc7 100644 --- a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_cart.less +++ b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_cart.less @@ -8,449 +8,483 @@ @cart-item-cell-padding-top: 20px; // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { -// -// Shopping cart -//-------------------------------------- -.checkout-cart-index { - .page-main { - padding-left: 0; - padding-right: 0; - } - .page-title-wrapper { - padding-left: @layout__width-xs-indent; - padding-right: @layout__width-xs-indent; - } -} -.cart { - // Cart container - &-container { - .form-cart { - &:extend(.abs-shopping-cart-items all); + // + // Shopping cart + // --------------------------------------------- + + .checkout-cart-index { + .page-main { + padding-left: 0; + padding-right: 0; + } + .page-title-wrapper { + padding-left: @layout__width-xs-indent; + padding-right: @layout__width-xs-indent; } } - - // Summary block - &-summary { - &:extend(.abs-add-box-sizing all); - .css(background, @sidebar__background-color); - margin-bottom: 25px; - padding: 1px 0 25px; - > .title { - display: none; - .font-size(24); - font-weight: @font-weight__light; - margin: 12px 0; + .cart { + // Cart container + &-container { + .form-cart { + &:extend(.abs-shopping-cart-items all); + } } - .block { - &:extend(.abs-cart-block all); - .item-options { - margin: 0 0 16px; - .field { - .radio { - float: left; - } - .radio + .label { - display: block; - overflow: hidden; - margin: 0; - } - } + // Summary block + &-summary { + &:extend(.abs-add-box-sizing all); + .css(background, @sidebar__background-color); + margin-bottom: 25px; + padding: 1px 0 25px; + > .title { + display: none; + .font-size(24); + font-weight: @font-weight__light; + margin: 12px 0; } - form:not(:last-of-type) { - .fieldset { - margin: 0 0 @indent__m; + .block { + form:not(:last-of-type) { + .fieldset { + margin: 0 0 @indent__m; + } } - } - .price { - font-weight: @font-weight__bold; - } - - .field { - margin: 0 0 16px; - &.note { - display: none; + .price { + font-weight: @font-weight__bold; } - } - .actions-toolbar { - > .primary { - text-align: left; - .action.primary { - &:extend(.abs-revert-to-action-secondary all); - width: auto; + .field { + margin: 0 0 16px; + &.note { + display: none; } } - } - .fieldset.estimate { - > .legend, - > .legend + br { - &:extend(.abs-no-display all); + .actions-toolbar { + > .primary { + text-align: left; + .action.primary { + &:extend(.abs-revert-to-action-secondary all); + width: auto; + } + } } - } - } - .page-main & { - .block { - margin-bottom: 0; + .fieldset.estimate { + > .legend, + > .legend + br { + &:extend(.abs-no-display all); + } + } + &:extend(.abs-cart-block all); + .title { + strong { + .font-size(14); + font-weight: @font-weight__semibold; + } + } + .item-options { + margin: 0 0 16px; + .field { + .radio { + float: left; + } + .radio { + + .label { + display: block; + margin: 0; + overflow: hidden; + } + } + } + } } - } - .checkout-methods-items { - &:extend(.abs-reset-list all); - margin: 20px 0 0; - padding: 0 @mobile-cart-padding; - text-align: center; - .action.primary.checkout { - &:extend(.abs-button-l all); - width: 100%; - } - .item { - margin-bottom: 25px; - &:last-child { + .page-main & { + .block { margin-bottom: 0; } } - } - .message { - padding-left: 20px; - > *:first-child:before { - display: none; + .checkout-methods-items { + &:extend(.abs-reset-list all); + margin: 20px 0 0; + padding: 0 @mobile-cart-padding; + text-align: center; + .action.primary.checkout { + &:extend(.abs-button-l all); + width: 100%; + } + .item { + margin-bottom: 25px; + &:last-child { + margin-bottom: 0; + } + } } - } - &:extend(.abs-adjustment-incl-excl-tax all); - } - // Totals block - &-totals { - border-top: 1px solid @border-color__base; - padding-top: 10px; - tbody, - tfoot { - .mark { - border: 0; - font-weight: @font-weight__regular; - padding: 6px 0; - text-align: left; - } - .amount { - border: 0; - font-weight: @font-weight__regular; - padding: 6px 0 6px 14px; - text-align: right; + .message { + padding-left: 20px; + > *:first-child:before { + display: none; + } } + &:extend(.abs-adjustment-incl-excl-tax all); } - .table-caption { - &:extend(.abs-no-display all); - } - .grand { - th, - td { - padding: 11px 0; - } - .mark { - border-top: 1px solid @border-color__base; - .font-size(16); - padding-right: @indent__s; - strong { - display: inline-block; + + // Totals block + &-totals { + border-top: 1px solid @border-color__base; + padding-top: 10px; + tbody, + tfoot { + .mark { + border: 0; font-weight: @font-weight__regular; - padding: 3px 0 0; + padding: 6px 0; + text-align: left; + } + .amount { + border: 0; + font-weight: @font-weight__regular; + padding: 6px 0 6px 14px; + text-align: right; } } - .amount { - border-top: 1px solid @border-color__base; - .font-size(18); + .table-caption { + &:extend(.abs-no-display all); } - } - .msrp { - margin-bottom: @indent__s; - } - tbody tr:last-child td { - padding-bottom: 19px; - } - .totals-tax { - &-summary { - .mark, + .grand { + th, + td { + padding: 11px 0; + } + .mark { + border-top: 1px solid @border-color__base; + .font-size(16); + padding-right: @indent__s; + strong { + display: inline-block; + font-weight: @font-weight__regular; + padding: 3px 0 0; + } + } .amount { - border-top: @border-width__base solid @border-color__base; - border-bottom: @border-width__base solid @border-color__base; - cursor: pointer; + border-top: 1px solid @border-color__base; + .font-size(18); } - .amount .price { - position: relative; - padding-right: 20px; - .icon-font( + } + .msrp { + margin-bottom: @indent__s; + } + tbody tr:last-child td { + padding-bottom: 19px; + } + .totals-tax { + &-summary { + .mark, + .amount { + border-bottom: @border-width__base solid @border-color__base; + border-top: @border-width__base solid @border-color__base; + cursor: pointer; + } + .amount .price { + .icon-font( @icon-down, @_icon-font-size: 12px, @_icon-font-line-height: 12px, @_icon-font-text-hide: true, @_icon-font-position: after - ); - &:after { - position: absolute; - right: 3px; - top: 3px; - } - } - &.expanded { - .mark, - .amount { - border-bottom: 0; + ); + padding-right: 20px; + position: relative; + &:after { + position: absolute; + right: 3px; + top: 3px; + } } - .amount .price { - .icon-font-symbol( + &.expanded { + .mark, + .amount { + border-bottom: 0; + } + .amount .price { + .icon-font-symbol( @_icon-font-content: @icon-up, @_icon-font-position: after - ); + ); + } } } - } - &-details { - display: none; - border-bottom: @border-width__base solid @border-color__base; - &.shown { - display: table-row; + &-details { + border-bottom: @border-width__base solid @border-color__base; + display: none; + &.shown { + display: table-row; + } } } + .table-wrapper { + margin-bottom: 0; + } } - .table-wrapper { - margin-bottom: 0; - } - } - // Products table - &.table-wrapper { - .cart { - thead { - tr th.col { - border-bottom: @border-width__base solid @border-color__base; - padding-top: 24px; - padding-bottom: 15px; + // Products table + &.table-wrapper { + .cart { + thead { + tr th.col { + border-bottom: @border-width__base solid @border-color__base; + padding-bottom: 15px; + padding-top: 24px; + } } - } - tbody { - td { - border: 0; + tbody { + td { + border: 0; + } + } + > .item { + border-bottom: @border-width__base solid @border-color__base; + position: relative; } } - > .item { - border-bottom: @border-width__base solid @border-color__base; - position: relative; - } - } - .col { - padding-top: 15px; - &.price, - &.subtotal, - &.msrp { - padding: @cart-item-cell-padding-top 11px @indent__s; - text-align: center; - &:extend(.abs-incl-excl-tax all); - } - &.qty { - padding: 20px 11px @indent__s; - text-align: center; - .label { - &:extend(.abs-visually-hidden all); + .col { + padding-top: 15px; + &.price, + &.subtotal, + &.msrp { + padding: @cart-item-cell-padding-top 11px @indent__s; + text-align: center; + &:extend(.abs-incl-excl-tax all); } - .input-text { - height: 36px; - width: 45px; - margin-top: -7px; + &.qty { + padding: 20px 11px @indent__s; text-align: center; + .label { + &:extend(.abs-visually-hidden all); + } + .input-text { + height: 36px; + margin-top: -7px; + text-align: center; + width: 45px; + } + } + > .price { + .css(color, @primary__color__lighter); + .font-size(18); + font-weight: @font-weight__bold; } } - > .price { - .css(color, @primary__color__lighter); - .font-size(18); - font-weight: @font-weight__bold; - } - } - .item { - &-actions td { - padding-bottom: @indent__base; - padding-left: @mobile-cart-padding; - padding-right: @mobile-cart-padding; - white-space: normal; - .actions-toolbar { - &:extend(.abs-add-clearfix all); + .item-actions { + td { + padding-bottom: 0; + padding-left: @mobile-cart-padding; + padding-right: @mobile-cart-padding; + white-space: normal; } } - .col { - &.item { + .item { + .col.item { display: block; + min-height: 75px; padding: 15px @mobile-cart-padding @indent__s 90px; position: relative; - min-height: 75px; } } - } - .action { - margin-right: @indent__m; - &:last-child { - margin-right: 0; - } - &.help.map { - &:extend(.abs-action-button-as-link all); - font-weight: @font-weight__regular; - } - &.edit { - float: left; + + .actions-toolbar { + &:extend(.abs-add-clearfix all); + min-height: 20px; + padding-bottom: 15px; + position: relative; + > .action-edit, + > .action-delete { + position: absolute; + right: 16px; + top: 0; + .icon-font( + @icon-edit, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color + ); + } + > .action-delete { + right: 0; + .icon-font-symbol( + @_icon-font-content: @icon-trash + ); + } } - &.delete { - float: right; - &:extend(.abs-action-button-as-link all); + .action { + margin-right: @indent__m; + &:last-child { + margin-right: 0; + } + &.help.map { + &:extend(.abs-action-button-as-link all); + font-weight: @font-weight__regular; + } } - } - .product { - &-item-photo { - display: block; - max-width: 65px; - left: @mobile-cart-padding; - padding: 0; - position: absolute; - top: 15px; - width: 100%; + + .product { + &-item-photo { + display: block; + left: @mobile-cart-padding; + max-width: 65px; + padding: 0; + position: absolute; + top: 15px; + width: 100%; + } + &-item-name { + display: block; + .font-size(18); + margin: -3px 0 @indent__xs; + } } - &-item-name { - display: block; - .font-size(18); - margin: -3px 0 @indent__xs; + .gift-registry-name-label { + &:after { + content: ':'; + } } - } - .gift-registry-name-label { - &:after { - content: ":"; + + // Product options + .item-options { + margin-bottom: 0; + &:extend(.abs-product-options-list all); + &:extend(.abs-add-clearfix all); } - } - // Product options - .item-options { - margin-bottom: 0; - &:extend(.abs-product-options-list all); - &:extend(.abs-add-clearfix all); - } - .product-item-name + .item-options { - margin-top: @indent__base; - } + .product-item-name + .item-options { + margin-top: @indent__base; + } - .cart-tax-total { - &:extend(.abs-tax-total all); - &-expanded { - &:extend(.abs-tax-total-expanded all); + .cart-tax-total { + &:extend(.abs-tax-total all); + &-expanded { + &:extend(.abs-tax-total-expanded all); + } + } + .product-image-wrapper { + &:extend(.abs-reset-image-wrapper all); + } + .action.configure { + display: inline-block; + margin: @indent__s 0 0; + } + .item .message { + margin-top: @indent__base; } } - .product-image-wrapper { - &:extend(.abs-reset-image-wrapper all); - } - .action.configure { - display: inline-block; - margin: @indent__s 0 0; - } - .item .message { - margin-top: @indent__base; - } - } - // Discount - &-discount { - clear: left; - border-bottom: @border-width__base solid @border-color__base; - .block { - &:extend(.abs-cart-block all); - } - .fieldset > .field > .label { - display: none; - } - .actions-toolbar .primary { - .action { - &.primary, - &.cancel { - &:extend(.abs-revert-to-action-secondary all); - border-top-left-radius: 0; - border-bottom-left-radius: 0; + // Discount + &-discount { + border-bottom: @border-width__base solid @border-color__base; + clear: left; + .block { + &:extend(.abs-cart-block all); + > .title { + strong { + color: @color-blue1; + font-weight: @font-weight__regular; + } } } - } - .action.check { - &:extend(.abs-action-button-as-link all); - font-weight: @font-weight__regular; - } - .fieldset { - display: table; - width: 100%; - } - .field { - display: table-cell; - } - .actions-toolbar { - display: table-cell; - vertical-align: top; - width: 1%; - .action { - &.primary, - &.cancel { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - margin: 0 0 0 -1px; - white-space: nowrap; - width: auto; + .fieldset > .field > .label { + display: none; + } + .actions-toolbar .primary { + .action { + &.primary, + &.cancel { + &:extend(.abs-revert-to-action-secondary all); + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } } } - .secondary { - position: absolute; - bottom: 5px; - left: @mobile-cart-padding; + .action.check { + &:extend(.abs-action-button-as-link all); + font-weight: @font-weight__regular; + } + .fieldset { + display: table; + width: 100%; + } + .field { + display: table-cell; + } + .actions-toolbar { + display: table-cell; + vertical-align: top; + width: 1%; + .action { + &.primary, + &.cancel { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + margin: 0 0 0 -1px; + white-space: nowrap; + width: auto; + } + } + .secondary { + bottom: 5px; + left: @mobile-cart-padding; + position: absolute; + } } } - } - // Empty cart - &-empty { - padding-left: @layout__width-xs-indent; - padding-right: @layout__width-xs-indent; - } + // Empty cart + &-empty { + padding-left: @layout__width-xs-indent; + padding-right: @layout__width-xs-indent; + } - .cart-tax-info + .cart-tax-total { - display: block; + .cart-tax-info + .cart-tax-total { + display: block; + } } } -} - // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { .cart { &-totals { - .table.totals { - th { - &:extend(.abs-col-no-prefix all); - display: table-cell; - } - td { - &:extend(.abs-col-no-prefix all); - display: table-cell; - } - tbody tr:not(:last-child) td { - &:extend(.abs-no-border-bottom-top all); - } - .amount { - text-align: right; - } - } + .table.totals { + th { + &:extend(.abs-col-no-prefix all); + display: table-cell; + } + td { + &:extend(.abs-col-no-prefix all); + display: table-cell; + } + tbody tr:not(:last-child) td { + &:extend(.abs-no-border-bottom-top all); + } + .amount { + text-align: right; + } + } } .table.items { .col.item, @@ -469,7 +503,7 @@ .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { .cart { - // Cart container + // Cart container &-container { .form-cart { .actions.main { @@ -541,27 +575,24 @@ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { - -// -// Cross sell -//-------------------------------------- -.block.crosssell { - padding: 0 @mobile-cart-padding; - margin-top: 70px; - .product-item-info { - width: 200px; + // Cross sell + .block.crosssell { + margin-top: 70px; + .css(padding, 0 @mobile-cart-padding); + .product-item-info { + width: 200px; + } } } -} - // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .checkout-cart-index { .page-main { @@ -573,7 +604,7 @@ } } .cart { - // Cart container + // Cart container &-container { &:extend(.abs-add-clearfix-desktop all); .form-cart { @@ -589,9 +620,9 @@ // Summary block &-summary { + .layout-column(2, 2, @layout-column-checkout__width-left); padding: 1px @indent__base @indent__m; position: relative; - .layout-column(2, 2, @layout-column-checkout__width-left); > .title { display: block; } @@ -630,30 +661,23 @@ } .item { - .col { - &.item { - padding: @cart-item-cell-padding-top 8px 20px 0; - } - } - &-actions td { - padding: 0; - text-align: left; - .actions-toolbar { - margin-top: -40px; - padding-left: 185px; - position: relative; - } + .col.item { + padding: @cart-item-cell-padding-top 8px 20px 0; } } + .item-actions td { + padding: 0; + } + .product { &-item-photo { display: table-cell; + max-width: 100%; padding-right: 20px; + position: static; vertical-align: top; width: 1%; - position: static; - max-width: 100%; } &-item-details { padding-bottom: 35px; @@ -670,9 +694,9 @@ // Discount &-discount { border: 0; + .layout-column(2, 1, @layout-column-checkout__width-main); &:extend(.abs-add-box-sizing-desktop all); padding-right: 4%; - .layout-column(2, 1, @layout-column-checkout__width-main); .block { &:extend(.abs-blocks-2columns all); width: 48%; @@ -694,9 +718,9 @@ } .actions-toolbar { .secondary { - position: absolute; bottom: -30px; left: 0; + position: absolute; } } } diff --git a/app/design/frontend/Magento/luma/Magento_GiftMessage/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_GiftMessage/web/css/source/_module.less index 0d7da96fe37d12776dd0a9759bd975a03ec1541c..0d3b4cd47ec03767fba0a2a1291fccd7235b6d4e 100644 --- a/app/design/frontend/Magento/luma/Magento_GiftMessage/web/css/source/_module.less +++ b/app/design/frontend/Magento/luma/Magento_GiftMessage/web/css/source/_module.less @@ -4,199 +4,365 @@ // */ // -// Common -//-------------------------------------- +// Variables +// _____________________________________________ -& when (@media-common = true) { +@gift-message-field-label__color: @color-gray40; -.gift-message { - margin: 0; - .fieldset& { - > .legend { - &:extend(.abs-methods-shipping-title all); - border-bottom: 0; - padding-bottom: 0; - } - } - .product-image-wrapper { - &:extend(.abs-reset-image-wrapper all); - } - .activate.message { - border-top: @border-width__base solid @border-color__base; - border-bottom: @border-width__base solid @border-color__base; - .css(color, @primary__color); - display: block; - font-weight: @font-weight__semibold; - line-height: 36px; - margin: 0 0 @indent__s; - padding: 0 @indent__m 0 0; - position: relative; - .icon-font( - @_icon-font-content: @icon-down, - @_icon-font-size: 10px, - @_icon-font-position: after, - @_icon-font-display: block - ); - &:after { - position: absolute; - right: 12px; - top: 0; - } - &:hover { - .css(color, @filter-link-hover); +@gift-item-block__border-color: @color-gray-light5; +@gift-item-block__border-width: @border-width__base; + +@gift-item-block-title__color: @color-blue1; +@gift-item-block-title-icon__content: @icon-down; +@gift-item-block-title-icon__active__content: @icon-up; +@gift-item-block-title-icon__color: @color-gray52; +@gift-item-block-title-icon__font-size: 18px; +@gift-item-block-title-icon__line-height: 20px; +@gift-item-block-title-icon__margin: 0 0 0 @indent__s; + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .gift-message { + .actions-toolbar { + .action-cancel { + &:extend(.abs-action-button-as-link all); + display: none; + } } - &.active { - border-bottom: 0; - .icon-font-symbol( - @_icon-font-content: @icon-up, - @_icon-font-position: after - ); + .field { + .label { + .css(color, @gift-message-field-label__color); + .css(font-weight, @font-weight__regular); + } } } - .options-items { - margin-top: @indent__xl; - .order-title { - margin: 0 0 15px; - > .field.choice { - .font-size(18); - font-weight: @font-weight__light; - border-bottom: @border-width__base solid @border-color__base; - padding-bottom: @indent__xs; + + .cart.table-wrapper { + .item-gift { + &._active { + .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); + } + .action { + margin-right: 0; } } - .order-options { + } + + .gift-options { + &:extend(.abs-add-clearfix all); + } + + .gift-options-title { + .css(font-weight, @font-weight__semibold); + margin: 0 0 @indent__base; + } + + .gift-options-content { + .fieldset { margin: 0 0 @indent__base; } - .fieldset { - .field.text { - padding-right: 0; - width: 100%; - .input-text { - height: 90px; + } + + .gift-summary { + position: relative; + .actions-toolbar { + > .secondary { + .action { + margin: 0 0 0 @indent__base; + width: auto; } } } - .field.to { - padding-right: 0; + .action-edit, + .action-delete { + &:extend(.abs-action-button-as-link all); + .icon-font( + @icon-edit, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color + ); } - .extra-options-container { - font-weight: @font-weight__regular; - .field.choice { - margin: @indent__base 0 15px; - } + .action-delete { + .icon-font-symbol( + @_icon-font-content: @icon-trash + ); } } - .options-order-container, - .options-items-container { - margin-bottom: @indent__s; + .gift-summary, + .cart.table-wrapper .gift-summary { + .actions-toolbar { + padding: 0; + position: absolute; + right: 0; + top: 0; + } } - .gift-messages-order { - margin-bottom: 25px; + + // + // In-table block + // --------------------------------------------- + + .cart.table-wrapper { + .gift-content { + display: none; + clear: left; + float: left; + margin-right: -100%; + padding: @indent__base 0; + width: 100%; + &._active { + display: block; + } + } } - .items { - .list-reset-styles(); - .item { - border-bottom: @border-width__base solid @border-color__base; - padding: 0 0 @indent__base; + + // + // Collapsible block + // --------------------------------------------- + + .gift-item-block { + .css(border-bottom, @gift-item-block__border-width solid @gift-item-block__border-color); + margin: 0; + &._active { + .title { + &:after { + .css(content, @gift-item-block-title-icon__active__content); + } + } + } + + .title { + .css(color, @gift-item-block-title__color); + cursor: pointer; + .icon-font( + @gift-item-block-title-icon__content, + @_icon-font-size: @gift-item-block-title-icon__font-size, + @_icon-font-line-height: @gift-item-block-title-icon__line-height, + @_icon-font-color: @gift-item-block-title-icon__color, + @_icon-font-color-hover: @primary__color, + @_icon-font-margin: @gift-item-block-title-icon__margin, + @_icon-font-position: after, + @_icon-font-display: block + ); + margin: 0; + padding: @indent__s @indent__xl @indent__s 15px; + position: relative; + } + + .content { &:extend(.abs-add-clearfix all); + padding: @indent__s 0 @indent__base; + position: relative; } - .product { - margin: 0 0 @indent__base; - .number { - .css(color, @primary__color__light); - span { - .css(color, @primary__color); - font-weight: @font-weight__semibold; + } + + // + // Account order gift message + // --------------------------------------------- + + .order-details-items { + .order-gift-message, + .block-order-details-gift-message { + &:extend(.abs-add-clearfix all); + dt { + &:after { + content: ''; } } - .name { - .font-size(16); - font-weight: @font-weight__regular; + .label { + &:extend(.abs-colon all); } - .photo.container { - margin: 15px 0; - img { - display: block; + .item-message { + clear: left; + } + .item-options { + dt { + .css(font-weight, @font-weight__regular); + margin: @indent__s 0; } } } } - .regular-price, - .price-including-tax, - .price-excluding-tax { - &:before { - content: attr(data-label) ": "; - } - .price { - font-weight: @font-weight__bold; + + .order-details-items { + .order-items { + .order-gift-message { + &:not(.expanded-content) { + &:extend(.abs-hidden); + } + .action.close { + &:extend(.abs-no-display all); + } + } } } - .price-including-tax { - .font-size(14); + + .options-order-container, + .options-items-container { + margin-bottom: @indent__s; + } + + .gift-messages-order { + margin-bottom: @indent__m; } } // -// Account order gift message -//-------------------------------------- -.order-details-items { - .order-gift-message, - .block-order-details-gift-message { - .item-options { - dt { - margin: @indent__s 0; - font-weight: @font-weight__regular; +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .gift-message { + .actions-toolbar { + .action-update { + .font-size(20); + padding: 15px; + width: 100%; } } - &:extend(.abs-add-clearfix all); - dt:after { - content: ""; - } - .label { - &:extend(.abs-colon all); + } + + .gift-item-block { + border-bottom: 0; + .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); + .title { + &:after { + .font-size(12); + position: absolute; + right: 20px; + top: 10px; + } } - .item-message { - clear: left; + .content { + padding-left: 1.5rem; + padding-right: 1.5rem; } } -} -.order-details-items .order-items .order-gift-message { - &:not(.expanded-content) { - &:extend(.abs-hidden); + .gift-message-summary { + padding-right: 7rem; } - .action.close { - &:extend(.abs-no-display all); - } -} + .cart.table-wrapper { + .action-gift { + .icon-font( + @icon-present, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color, + @_icon-font-position: after + ); + &._active { + border: @border-width__base solid @color-gray-light5; + border-bottom-color: @color-white; + margin: -@indent__xs 14px -1px -15px; + padding: 4px @indent__s 9px 14px; + &:after { + color: @primary__color; + } + } + } + .gift-content { + border-top: @border-width__base solid @color-gray-light5; + margin-left: -@mobile-cart-padding; + margin-right: -@mobile-cart-padding; + padding-left: @mobile-cart-padding; + padding-right: @mobile-cart-padding; + overflow: hidden; + } + } } // -// Mobile -//-------------------------------------- +// Desktop +// _____________________________________________ .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .gift-message { - .items { - .item { - margin: 0 0 @indent__base; - &:extend(.abs-add-clearfix-desktop all); - } - .product { - float: left; - margin: 0 @indent__l 0 0; - width: 145px; - .name { - .font-size(16); - font-weight: @font-weight__regular; - max-width: 145px; - text-overflow: ellipsis; - overflow: hidden; + .actions-toolbar { + padding: 0; + .secondary { + float: right; + .action { + float: right; + margin-left: @indent__base; + margin-right: 0; + } + .action-cancel { + display: block; + float: left; + margin-top: 6px; + } + } + } + .field { + &:extend(.abs-clearfix all); + .form-field-type-revert( + @_type: inline, + @_type-inline-label-align: left + ); + } + } + .gift-options-title { + .css(font-weight, @font-weight__light); + .font-size(18); + } + + .gift-item-block { + .title { + padding: @indent__base 0; + } + } + + .item-gift { + td { + padding-left: 0; + padding-right: 0; + } + } + + // + // In-table block + // --------------------------------------------- + + .cart.table-wrapper { + .action-gift { + float: left; + .icon-font( + @icon-down, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color, + @_icon-font-margin: 0 0 0 @indent__s, + @_icon-font-position: after + ); + &._active { + &:after { + content: @icon-up; } } - .options { - overflow: hidden; + } + } + + .cart-container { + .cart-gift-item { + &:extend(.abs-shopping-cart-items-desktop all); + margin-bottom: @indent__base; + .gift-options, + .gift-summary { + padding-bottom: @indent__base; } } } diff --git a/app/design/frontend/Magento/luma/Magento_Wishlist/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Wishlist/web/css/source/_module.less index 8b5f2b983d6659f75888cf8de06183ec9f1d34f3..c1388fd10a0f9dfd7f06f7c17c96d0b87ba272c7 100644 --- a/app/design/frontend/Magento/luma/Magento_Wishlist/web/css/source/_module.less +++ b/app/design/frontend/Magento/luma/Magento_Wishlist/web/css/source/_module.less @@ -4,149 +4,148 @@ // */ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { - -.form.wishlist.items { - .actions-toolbar { - &:extend(.abs-reset-left-margin all); + .form.wishlist.items { + .actions-toolbar { + &:extend(.abs-reset-left-margin all); + } } -} -.product-social-links, -.block-bundle-summary, -.product-item, -.table-comparison { - .action.towishlist { - &:extend(.abs-actions-addto all); - .icon-font-symbol( + .product-social-links, + .block-bundle-summary, + .product-item, + .table-comparison { + .action.towishlist { + &:extend(.abs-actions-addto all); + .icon-font-symbol( @_icon-font-content: @icon-wishlist-full, @_icon-font-position: before - ); + ); + } } -} -.account .table-wrapper .data.table.wishlist { - .table-bordered( + .account .table-wrapper .data.table.wishlist { + .table-bordered( @_table_type: horizontal - ); - thead > tr > th { - border-bottom: 0; - } - tbody > tr:last-child > td { - border-bottom: 1px solid @table__border-color; - } - .product.name { - display: inline-block; - margin-bottom: @indent__s; - } - .box-tocart { - margin: @indent__s 0; - .qty { - vertical-align: middle; - &:extend(.abs-input-qty all); + ); + thead > tr > th { + border-bottom: 0; } - } - .col { - &.item { - width: 50%; + tbody > tr:last-child > td { + border-bottom: 1px solid @table__border-color; } - &.photo { - max-width: 150px; + .product.name { + display: inline-block; + margin-bottom: @indent__s; } - &.selector { - max-width: 15px; + .box-tocart { + margin: @indent__s 0; + .qty { + vertical-align: middle; + &:extend(.abs-input-qty all); + } } - } - textarea { - margin: @indent__s 0; - } - .input-text.qty { - margin-bottom: @indent__s; - } - .action.primary { - vertical-align: top; - } - .price { - font-weight: @font-weight__bold; - } -} - -.link.wishlist { - .counter { - .css(color, @text__color__muted); - white-space: nowrap; - &:before { - content: "("; + .col { + &.item { + width: 50%; + } + &.photo { + max-width: 150px; + } + &.selector { + max-width: 15px; + } + } + textarea { + margin: @indent__s 0; + } + .input-text.qty { + margin-bottom: @indent__s; } - &:after { - content: ")"; + .action.primary { + vertical-align: top; + } + .price { + font-weight: @font-weight__bold; } } -} -.block-wishlist { - .block-title { - &:extend(.abs-block-widget-title all); - } - .counter { - &:extend(.abs-block-items-counter all); + .link.wishlist { + .counter { + .css(color, @text__color__muted); + white-space: nowrap; + &:before { + content: '('; + } + &:after { + content: ')'; + } + } } - .product-item-name { - margin-right: @indent__m; + + .block-wishlist { + .block-title { + &:extend(.abs-block-widget-title all); + } + .counter { + &:extend(.abs-block-items-counter all); + } + .product-item-name { + margin-right: @indent__m; + } } -} -.products-grid.wishlist { - .product { - &-item { - &-photo { - margin-bottom: @indent__s; - display: block; - } - &-name { - margin-top: 0; - } - .price-box { - margin: 0; - } - .comment-box { - .label { - &:extend(.abs-visually-hidden all); + .products-grid.wishlist { + .product { + &-item { + &-photo { + display: block; + margin-bottom: @indent__s; } - } - &-comment { - display: block; - margin: @indent__s 0; - height: 42px; - } - &-actions { - > * { - margin-right: 15px; - &:last-child { - margin-right: 0; + &-name { + margin-top: 0; + } + .price-box { + margin: 0; + } + .comment-box { + .label { + &:extend(.abs-visually-hidden all); } } - } - .box-tocart { - input.qty { - &:extend(.abs-input-qty all); + &-comment { + display: block; + height: 42px; + margin: @indent__s 0; } - .tocart { - &:extend(.abs-revert-secondary-size all); + &-actions { + > * { + margin-right: 15px; + &:last-child { + margin-right: 0; + } + } + } + .box-tocart { + input.qty { + &:extend(.abs-input-qty all); + } + .tocart { + &:extend(.abs-revert-secondary-size all); + } } } } } } -} - // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { .products-grid.wishlist { .product-item { @@ -160,15 +159,15 @@ .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { .products-grid.wishlist { - margin-right: -@indent__s; margin-bottom: @indent__l; + margin-right: -@indent__s; .product { &-item { padding: @indent__base @indent__s @indent__base @indent__base; position: relative; &-photo { - margin-right: @indent__base; float: left; + margin-right: @indent__base; } &-name { .font-size(16); @@ -226,6 +225,20 @@ } } } + + .cart.table-wrapper { + .action-towishlist { + .icon-font( + @icon-wishlist-full, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color + ); + } + } } .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__s) { @@ -243,8 +256,9 @@ } // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .products-grid.wishlist { .product { @@ -263,8 +277,8 @@ margin: @indent__s 0 0; > * { display: inline-block; - margin-top: 7px; margin-bottom: 7px; + margin-top: 7px; } } .fieldset { @@ -292,7 +306,7 @@ } } } - .wishlist-index-index { + .wishlist-index-index { .product-item-info { width: auto; } @@ -302,18 +316,19 @@ .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .wishlist-index-index { .product-item-inner { + @_shadow: 3px 4px 4px 0 rgba(0, 0, 0, .3); + + .css(background, @color-white); + .css(border, @border-width__base solid @color-gray-light2); + border-top: none; + .css(box-shadow, @_shadow); display: none; - position: absolute; left: 0; + margin: 9px 0 0 -1px; + padding: 0 9px 9px; + position: absolute; right: -1px; z-index: 2; - .css(background, @color-white); - padding: 0 9px 9px; - margin: 9px 0 0 -1px; - border: 1px solid @color-gray-light2; - border-top: none; - @_shadow: 3px 4px 4px 0 rgba(0, 0, 0, .3); - .css(box-shadow, @_shadow); .comment-box { margin-top: -18px; } @@ -328,10 +343,10 @@ margin: 0; } .product-item { - width: 24.439%; - margin-left: calc(~"(100% - 4 * 24%) / 3"); margin-bottom: @indent__base; + margin-left: calc(~"(100% - 4 * 24%) / 3"); padding: 0; + width: 24.439%; &:nth-child(4n+1) { margin-left: 0; } diff --git a/app/design/frontend/Magento/luma/composer.json b/app/design/frontend/Magento/luma/composer.json index 84cbda7b1c907d6bc7262137162476f6a1d94ca3..011484f9abf79fb35ffa25a064e3debc221029ee 100644 --- a/app/design/frontend/Magento/luma/composer.json +++ b/app/design/frontend/Magento/luma/composer.json @@ -3,12 +3,12 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/theme-frontend-blank": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/theme-frontend-blank": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-theme", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/design/frontend/Magento/luma/web/css/source/_extends.less b/app/design/frontend/Magento/luma/web/css/source/_extends.less index 00d74dcf5d0740f048ab7cd0ce0a9f2eb1b8b8b7..cc4ab06b849cb5eec4233e701e915deedb4285ed 100644 --- a/app/design/frontend/Magento/luma/web/css/source/_extends.less +++ b/app/design/frontend/Magento/luma/web/css/source/_extends.less @@ -753,11 +753,8 @@ margin: 0; > .title { &:extend(.abs-toggling-title all); - .column.main & { - strong { - .font-size(14); - font-weight: @font-weight__semibold; - } + &:after { + color: @color-gray52; } } .content { diff --git a/app/design/frontend/Magento/luma/web/css/source/_variables.less b/app/design/frontend/Magento/luma/web/css/source/_variables.less index a6ad436b94df7ea39e07279d315ea795ea8986ce..dbdbeb65ad660dccec8e724925392cf18b254c96 100644 --- a/app/design/frontend/Magento/luma/web/css/source/_variables.less +++ b/app/design/frontend/Magento/luma/web/css/source/_variables.less @@ -31,6 +31,8 @@ @icon-star-empty: '\e625'; @icon-download: '\e626'; @icon-private: '\e629'; +@icon-present: '\e62a'; +@icon-gift-registry: '\e62b'; @icon-calendar__font-size: 23px; diff --git a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.eot b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.eot index 9c574aed777d1435ebaecb4511cbbd877aa3e229..4a12dddaf3e4556c2fa7abda0181abd7950043e0 100644 Binary files a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.eot and b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.eot differ diff --git a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.svg b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.svg index 171e99f64616714b0c97a1155fc6498b90d4a147..5e68e79f8e3e44488f98f45b6a4d1408f485d2ec 100644 --- a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.svg +++ b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg"><defs><font horiz-adv-x="512"><font-face units-per-em="512" ascent="480" descent="-32"/><glyph horiz-adv-x="256"/><glyph unicode="" d="M436.608 435.568c-65.68 31.424-144.064 2.832-174.976-63.84-2.16-4.64-4.016-10.448-5.664-17.2-1.648 6.752-3.504 12.56-5.632 17.2-30.944 66.672-109.248 95.264-174.944 63.84-65.6-31.424-93.744-110.96-62.832-177.648C43.488 191.248 255.904.08 255.904.08s.016.224.048.576c.048-.352.064-.576.064-.576s212.512 191.168 243.44 257.84c30.896 66.688 2.832 146.224-62.848 177.648z"/><glyph unicode="î˜" d="M362.533 425.05c-49.81-49.79-20.81-20.77-20.81-20.77l96.403-96.385s-31.067-31.05 20.772 20.773-46.61 146.194-96.365 96.384zm-42.386-41.38L92.16 155.686l.33-.293L38.417 8.868 188.25 59.556l.312-.31.786.804v.02l227.2 227.2-96.403 96.402zm-141.11-279.295l-78.812-33.28 37.047 75.044 38.345 38.36 41.764-41.786-38.34-38.346z"/><glyph unicode="" d="M255.952 480L0 32h512L255.952 480zm31.168-126.192v-65.36l-16.688-128.544h-27.088l-18.032 128.544-.992 65.36h62.8zM224.096 64.112v64.112h64.24V64.112h-64.24z"/><glyph unicode="" d="M363.923 112.02C334.118 83.254 295.26 68.516 255.91 68.48c-35.145.037-70.2 11.758-99.347 35.933-37.03 30.83-56.046 74.97-56.1 119.66 0 7.443.55 14.83 1.59 22.18l-60.67-11.373c-.165-3.602-.293-7.186-.293-10.807-.036-61.495 26.46-122.9 77.55-165.285 40.008-33.335 88.886-49.683 137.25-49.683h.13c56.21 0 112.163 22.217 153.745 64.914L449.61 34.24l.31 124.745-131.808.35 45.805-47.326zm29.42 277.21c-40.045 33.335-88.922 49.664-137.27 49.664-55.808 0-111.397-21.833-152.923-63.945L65.463 409.74l-.677-120.722 130.487-.75-46.336 48.494c29.64 28.252 68.188 42.697 107.154 42.733 35.11-.036 70.22-11.72 99.33-35.93 37.03-30.83 56.05-74.937 56.14-119.7 0-6.437-.456-12.89-1.224-19.365l60.436 11.593c.036 2.613.164 5.21.164 7.77-.036 61.55-26.514 122.9-77.587 165.357z"/><glyph unicode="" d="M95.792-32h320.4v320.08h-320.4V-32zm222.544 260.512c0 9.904 8.032 17.904 17.952 17.904 9.904 0 17.936-8 17.936-17.904V39.776c0-9.888-8.032-17.92-17.936-17.92-9.92 0-17.952 8.032-17.952 17.92v188.736zm-80.288 0c0 9.904 8.032 17.904 17.92 17.904s17.92-8 17.92-17.904V39.776c0-9.888-8.032-17.92-17.92-17.92s-17.92 8.032-17.92 17.92v188.736zm-80.448 0c0 9.904 8 17.904 17.92 17.904 9.888 0 17.92-8 17.92-17.904V39.776c0-9.888-8.032-17.92-17.92-17.92-9.92 0-17.92 8.032-17.92 17.92v188.736zm265.616 188.016h-71.232v10.896c0 29.04-19.76 52.576-48.8 52.576h-94.72c-29.008 0-48.48-23.536-48.48-52.576v-10.896H88.752c-13.696 0-24.768-11.088-24.768-24.752v-71.984h384v71.984c0 13.664-11.04 24.752-24.768 24.752zm-103.28 0H191.744v14.704c.032 9.248 7.488 16.736 16.72 16.768h94.72c9.216-.032 16.704-7.52 16.752-16.768v-14.704z"/><glyph unicode="" d="M511.52 278.496c-1.312 4.096-5.152 6.88-9.44 6.88H321.376L265.424 457.12c-1.344 4.096-5.136 6.88-9.44 6.88-4.272 0-8.096-2.784-9.44-6.88l-56.24-171.744H9.92c-4.256 0-8.096-2.784-9.44-6.88-1.312-4.064.128-8.592 3.584-11.088l145.984-106.32-56.256-172.72c-1.328-4.096.128-8.592 3.616-11.12 3.456-2.496 8.208-2.496 11.664 0L255.968 83.872l146.64-106.624c1.792-1.28 3.76-1.936 5.808-1.936 2.096 0 4.144.656 5.856 1.936 3.568 2.528 4.96 7.008 3.6 11.12l-56.24 172.72 146.288 106.32c3.488 2.496 4.928 6.992 3.6 11.088z"/><glyph unicode="" d="M473.015 200.375v49.37l-7.003 2.27-52.882 17.243-14.116 34.103 27.154 57.387-34.908 34.907-6.583-3.31-49.555-25.197-34.103 14.117-21.4 59.755h-49.37l-2.287-6.986-17.262-52.88-34.047-14.1-57.4 27.136-34.924-34.927 3.31-6.564 25.18-49.59-14.08-34.03-59.76-21.414v-49.39l6.95-2.25 52.9-17.28 14.1-34.066L85.813 87.3l34.925-34.925 6.53 3.328 49.59 25.2 34.063-14.115 21.394-59.76h49.37l2.286 6.986 17.28 52.883 34.03 14.116 57.398-27.137 34.95 34.904-3.346 6.546-25.197 49.572 14.116 34.067 59.813 21.413zM256 154.86c-38.2 0-69.156 30.958-69.156 69.14 0 38.217 30.958 69.156 69.156 69.156 38.163 0 69.156-30.94 69.156-69.156 0-38.18-31.012-69.14-69.156-69.14z"/><glyph unicode="" d="M31.008 351.36L256 111.376 481.04 351.36z"/><glyph unicode="" d="M383.415 226.596l-212.57 218.587-37.286-34.98 178.28-183.278L128.566 38.473l36.48-35.657 205.66 211.456-.202.2z"/><glyph unicode="" d="M52.928 345.2h406.144c11.056 0 20 8.976 20 20.016 0 11.072-8.944 20.032-20 20.032H52.928c-11.056 0-20.016-8.96-20.016-20.032 0-11.04 8.96-20.016 20.016-20.016zm406.144-101.184H52.928c-11.056 0-20.016-8.944-20.016-20.016s8.96-20.016 20.016-20.016h406.144c11.056 0 20 8.944 20 20.016s-8.928 20.016-20 20.016zm0-141.216H52.928c-11.056 0-20.016-8.96-20.016-20.032s8.96-20.016 20.016-20.016h406.144c11.056 0 20 8.944 20 20.016s-8.928 20.032-20 20.032z"/><glyph unicode="" d="M256.144 480C167.024 480 94.8 407.76 94.8 318.624 94.8 229.52 256.144-32 256.144-32S417.52 229.52 417.52 318.624C417.52 407.76 345.328 480 256.144 480zm0-210.384c-27.056 0-49.024 21.952-49.024 49.008 0 27.072 21.984 49.024 49.024 49.024 27.104 0 49.088-21.952 49.088-49.024 0-27.056-21.984-49.008-49.088-49.008z"/><glyph unicode="" d="M0 256.144h224.032v223.808H0V256.144zm288.128 223.808v-95.728h224.176v95.728H288.128zM0-32h224.032v223.808H0V-32zm288.128 288.144h224.176v95.728H288.128v-95.728zm0-160.064h224.176v95.728H288.128V96.08zm0-128.08h224.176v95.712H288.128V-32z"/><glyph unicode="" d="M332.764 119.003c-9.216 0-45.495-56.027-65.243-56.027-5.28 0-7.86 4.644-7.86 9.216 0 10.57 7.24 27.044 11.157 36.937l47.396 128.38c23.77 63.89-6.546 81.02-34.87 81.02-38.218 0-72.45-19.09-98.78-44.123-8.576-8.577-37.523-36.207-37.523-48.09 0-3.934 3.93-8.578 8.575-8.578 11.813 0 43.447 57.307 67.803 57.307 5.285 0 11.19-5.923 6.583-17.754l-46.08-115.97c-4.643-11.153-27.043-65.17-27.043-96.785 0-25.014 16.476-36.187 40.192-36.187 66.52.003 143.54 81.65 143.54 100.76-.02 5.925-4.59 9.892-7.846 9.892zm-13.22 320.658c-28.948 0-54.017-23.68-54.017-52.66 0-27.01 17.792-44.8 44.837-44.8 29.55 0 54.62 22.4 54.62 52.7 0 27.01-19.072 44.767-45.44 44.767z"/><glyph unicode="î˜" d="M0 351.552h128.464V480H0V351.552zm191.76 0h128.528V480H191.76V351.552zM383.568 480V351.552h128.496V480H383.568zM0 159.744h128.464v128.464H0V159.744zm191.76 0h128.528v128.464H191.76V159.744zm191.808 0h128.496v128.464H383.568V159.744zM0-32h128.464V96H0V-32zm191.76 0h128.528V96H191.76V-32zm191.808 0h128.496V96H383.568V-32z"/><glyph unicode="" d="M255.296 450.464c-124.688 0-225.76-101.072-225.76-225.76 0-124.672 101.072-225.76 225.76-225.76 124.672 0 225.76 101.088 225.76 225.76 0 124.688-101.072 225.76-225.76 225.76zm-23.36-355.888L106 222.608l32.208 25.936 72.864-57.088c29.76 35.424 96 106.032 187.312 161.984l7.696-17.792c-83.808-77.088-152.48-185.6-174.144-241.072z"/><glyph unicode="î˜" d="M0 241.12h512v-34.064H0v34.064z"/><glyph unicode="î˜" d="M478.263 426.15c-142.555-87.39-245.98-197.633-292.48-252.948L71.99 262.362l-50.266-40.538L218.387 21.85c33.847 86.675 141.056 256.11 271.872 376.486l-12 27.814z"/><glyph unicode="" d="M220.576 83.248c-26.352 0-47.696-21.376-47.696-47.712s21.344-47.664 47.696-47.664c26.336 0 47.696 21.328 47.696 47.664s-21.36 47.712-47.696 47.712zm164.768 0c-26.4 0-47.76-21.376-47.76-47.712s21.344-47.664 47.76-47.664c26.288 0 47.632 21.328 47.632 47.664s-21.344 47.712-47.632 47.712zm74.512 267.072H140s-19.152 52.608-37.392 84.864c-14.128 24.976-43.344 23.968-43.344 23.968-20.096 0-33.024-12.288-33.024-32.4 0-20.096 15.92-36.16 36.032-36.16l8.496-.08 95.2-262.192 266.832-.208S481.584 327.744 479.072 320c8.944 27.68-2.448 30.32-19.216 30.32zm-293.328-92.976c-14 0-25.36 11.36-25.36 25.376s11.36 25.392 25.36 25.392c14.016 0 25.36-11.376 25.36-25.392s-11.344-25.376-25.36-25.376zm54.24-84.704c-14.016 0-25.376 11.376-25.376 25.392 0 13.984 11.36 25.36 25.376 25.36 14 0 25.36-11.376 25.36-25.36.016-14.016-11.36-25.392-25.36-25.392zm27.888 84.704c-14 0-25.376 11.36-25.376 25.376s11.36 25.392 25.376 25.392c14 0 25.36-11.376 25.36-25.392s-11.36-25.376-25.36-25.376zm54.24-84.704c-14 0-25.36 11.376-25.36 25.392 0 13.984 11.36 25.36 25.36 25.36 14.048 0 25.44-11.376 25.44-25.36 0-14.016-11.392-25.392-25.44-25.392zm27.952 84.704c-14 0-25.408 11.36-25.408 25.376s11.408 25.392 25.408 25.392c14 0 25.328-11.376 25.328-25.392s-11.328-25.376-25.328-25.376zm54.192-84.704c-13.984 0-25.328 11.376-25.328 25.392 0 13.984 11.36 25.36 25.328 25.36 14 0 25.408-11.376 25.408-25.36 0-14.016-11.408-25.392-25.408-25.392zm27.92 84.704c-14.016 0-25.36 11.36-25.36 25.376s11.344 25.392 25.36 25.392c14.048 0 25.376-11.376 25.376-25.392s-11.328-25.376-25.376-25.376z"/><glyph unicode="" d="M142.992 332.768c10.352 0 18.8 8.4 18.8 18.8v67.68c0 10.368-8.432 18.784-18.8 18.784-10.384 0-18.8-8.4-18.8-18.784v-67.68c0-10.4 8.416-18.8 18.8-18.8zm251.392 50.576v-.32c7.776-6.944 12.72-17.008 12.72-28.288 0-20.816-16.88-37.712-37.744-37.712s-37.76 16.912-37.76 37.712c0 11.264 4.976 21.344 12.784 28.288v.32H167.968v-.32c7.824-6.944 12.768-17.008 12.768-28.288 0-20.816-16.896-37.712-37.728-37.712-20.864 0-37.744 16.912-37.744 37.712 0 11.264 4.928 21.344 12.752 28.288v.32H32.48V-.256h447.248v383.6h-85.344zM448.72 32.832H65.568v254.72H448.72V32.832zm-79.36 299.936c10.384 0 18.784 8.4 18.784 18.8v67.68c0 10.368-8.4 18.784-18.784 18.784-10.352 0-18.816-8.4-18.816-18.784v-67.68c0-10.4 8.464-18.8 18.816-18.8zm-20.144-148.64H301.28v-47.872h47.952v47.872zm0 71.984H301.28v-47.824h47.952v47.824zm0-142H301.28V66.24h47.952v47.872zm67.44 142h-47.92v-47.824h47.92v47.824zm0-71.984h-47.92v-47.872h47.92v47.872zm-134.96 71.984h-47.872v-47.824h47.872v47.824zM146.8 184.128H98.944v-47.872H146.8v47.872zm67.488-70.016H166.4V66.24h47.872v47.872zm-67.488 0H98.944V66.24H146.8v47.872zm134.896 70.016h-47.872v-47.872h47.872v47.872zm0-70.016h-47.872V66.24h47.872v47.872zm-67.408 70.016H166.4v-47.872h47.872v47.872zm0 71.984H166.4v-47.824h47.872v47.824z"/><glyph unicode="" d="M256 444.727L55.186 201.437H186.24V3.29h139.575v198.144h131.017z"/><glyph unicode="" d="M325.78 246.583v198.144H186.185V246.583h-131L256.02 3.29l200.81 243.294z"/><glyph unicode="" d="M487.232 35.872s-78.176 80.288-109.328 111.312c-13.552 13.552-22.832 22.752-22.832 22.752 10.56 15.088 18.816 31.616 24.704 49.392 5.84 17.76 8.752 36.496 8.752 56.192 0 25.36-4.816 49.2-14.448 71.552-9.664 22.32-22.784 41.824-39.456 58.432-16.64 16.688-36.144 29.824-58.496 39.472-22.336 9.664-46.176 14.496-71.536 14.496-25.344 0-49.184-4.848-71.552-14.496-22.336-9.648-41.712-22.784-58.192-39.472-16.416-16.608-29.52-36.128-39.152-58.448C26.032 324.72 21.2 300.864 21.2 275.504c0-25.376 4.848-49.216 14.496-71.552 9.632-22.304 22.72-41.792 39.152-58.464 16.464-16.608 35.856-29.776 58.176-39.456 22.368-9.664 46.208-14.448 71.552-14.448 19.68 0 38.416 2.88 56.208 8.768 17.776 5.856 34.288 14.144 49.36 24.72 0 0 8.576-8.512 21.2-21.216C365.856 69.216 441.76-9.536 441.76-9.536c11.456-4.992 29.712.336 38.848 8.064 9.04 7.776 14.096 23.984 6.624 37.344zM327.792 223.28c-7.008-16.192-16.576-30.336-28.624-42.336-12.096-12.048-26.192-21.616-42.336-28.608-16.128-7.024-33.392-10.528-51.68-10.528-18.704 0-36.096 3.504-52.256 10.528-16.16 7.008-30.288 16.56-42.336 28.608-12.048 12.016-21.616 26.16-28.608 42.336-7.008 16.112-10.512 33.568-10.512 52.24 0 18.272 3.504 35.632 10.512 51.984 6.992 16.336 16.56 30.56 28.608 42.592 12.048 12.096 26.176 21.664 42.336 28.608 16.16 7.056 33.552 10.512 52.256 10.512 18.288 0 35.552-3.456 51.68-10.512 16.144-6.96 30.24-16.512 42.336-28.608 12.032-12.032 21.616-26.256 28.624-42.592 7.008-16.352 10.48-33.712 10.48-51.984.016-18.672-3.456-36.128-10.48-52.24z"/><glyph unicode="" d="M483.255 415.177l-36.023 35.968-191.25-191.268-191.25 191.268-35.986-35.968 191.268-191.27L28.89 32.767l35.97-35.93L256 187.94 447.12-3.164l35.932 35.932L291.95 223.89z"/><glyph unicode="" d="M200.21 226.89l178.213 183.314-37.248 34.98-212.608-218.587 218.46-223.78 36.388 35.657z"/><glyph unicode="" d="M256 335.168L31.008 95.184H481.04z"/><glyph unicode="" d="M96.624 451.12V-3.12L409.552 224z"/><glyph unicode="" d="M102.992 224L415.904-3.12v454.24z"/><glyph unicode="" d="M0 .464h63.984V480H0V.464zM512.08 480H96.256V192.112H512.08L373.872 334.144 512.08 480z"/><glyph unicode="" d="M512 241.12H273.488V480h-34.016V241.12H0v-34.064h239.472V-32h34.016v239.056H512z"/><glyph unicode="î˜" d="M255.968 228.064l221.488 155.84c-2.656.528-5.344.848-8.128.848H42.672c-2.8 0-5.504-.32-8.144-.848l221.44-155.84zm.96-59.568l-.96 1.408-.944-1.408L.464 347.632c-.176-1.6-.464-3.2-.464-4.816V75.104C0 51.2 19.104 31.792 42.672 31.792h426.656c23.6 0 42.688 19.408 42.688 43.312v267.712c0 1.632-.288 3.216-.496 4.816L256.928 168.496z"/><glyph unicode="" d="M127.584 31.776v127.632H0V31.776h127.584zM319.248 416.24H192.32V31.792h126.928V416.24zm192.336-128.768H384.208V31.792h127.376v255.68z"/><glyph unicode="" d="M255.296 450.464c-124.688 0-225.76-101.072-225.76-225.76 0-124.672 101.072-225.76 225.76-225.76 124.672 0 225.76 101.088 225.76 225.76 0 124.688-101.072 225.76-225.76 225.76zM372.16 144.832l-37.104-37.104-79.088 79.056-79.056-79.04-37.12 37.136 79.024 79.024-79.136 79.12 37.136 37.136 79.12-79.136 79.184 79.184 37.152-37.152-79.2-79.168 79.088-79.056z"/><glyph unicode="î˜ " d="M262.748 418.688c-113.664 2.25-207.214-67.803-208.97-156.435-.584-30.83 9.985-59.813 28.8-84.644l-4.918 4.95c32.384-41.62-31.104-153.31-31.104-153.31l142.28 70.35c22.51-7.094 44.16-11.922 69.725-12.45 113.67-2.232 205.117 78.354 206.85 167.003 1.76 88.63-88.96 162.304-202.66 164.535z"/><glyph unicode="" d="M259.163 285.422L461 89.198l38.546 41.07-240.713 234.02L12.47 123.814l39.26-40.1z"/><glyph unicode="" d="M252.82 162.58L51 358.802l-38.53-41.07 240.68-234.02 246.4 240.476-39.332 40.1z"/><glyph unicode="" d="M256-33.248c-141.408 0-256 114.624-256 256s114.592 256 256 256c141.376 0 256-114.624 256-256s-114.608-256-256-256zm0 481.008c-124.048 0-225.008-100.96-225.008-225.008S131.952-2.272 256-2.272s224.992 100.96 224.992 225.008S380.064 447.76 256 447.76zm64.24-228.608l-15.6-12.128c-8.496-6.624-14.128-14.32-16.912-23.152-1.776-5.6-3.008-12.256-3.168-24h-59.712c.88 24.848 3.504 39.968 7.328 49.472 3.808 9.472 13.632 20.368 29.44 32.72l16.032 12.528c5.28 4 9.536 8.32 12.752 13.024 5.872 8.064 8.784 16.976 8.784 26.656 0 11.152-3.248 21.312-9.776 30.496-6.496 9.184-18.4 13.808-35.712 13.808-17.008 0-29.056-5.68-36.16-17.008s-10.592-21.664-10.592-33.84h-63.68c1.744 41.872 16.32 70.16 43.776 87.632 17.344 11.152 38.656 16.752 63.904 16.752 33.216 0 60.784-7.936 82.752-23.808 21.968-15.84 34.8-48.432 34.8-79.6 0-19.088-6.624-26.096-16.144-39.184-5.584-7.92-16.272-18.048-32.112-30.368zM287.728 64h-63.504v63.68h63.504V64z"/><glyph unicode="" d="M416.656 128v135.696H95.984V128H0v199.344c0 13.76 11.168 24.912 24.944 24.912h462.144c13.744 0 24.912-11.152 24.912-24.912V128h-95.344zm47.648 196.624c-11.024 0-19.92-8.928-19.92-19.936s8.896-19.952 19.92-19.952c10.992 0 19.968 8.96 19.968 19.952 0 11.008-8.992 19.936-19.968 19.936zM127.728 480h256v-96.192h-256V480zm33.248-448.336h191.232V224h31.824V-.08H128.048V224h32.912V31.664z"/><glyph unicode="" d="M502.08 285.376H321.376L265.424 457.12c-1.344 4.096-5.136 6.88-9.44 6.88-4.272 0-8.096-2.784-9.44-6.88l-56.24-171.744H9.92c-4.256 0-8.096-2.784-9.44-6.88-1.312-4.064.128-8.592 3.584-11.088l145.984-106.32-56.256-172.72c-1.328-4.096.128-8.592 3.616-11.12 3.456-2.496 8.208-2.496 11.664 0L255.968 83.872l146.64-106.624c1.792-1.28 3.76-1.936 5.808-1.936 2.096 0 4.144.656 5.856 1.936 3.568 2.528 4.96 7.008 3.6 11.12l-56.24 172.72 146.288 106.32c3.488 2.496 4.928 7.008 3.6 11.088-1.312 4.096-5.168 6.88-9.44 6.88zm-168.656-115.12l48.208-148.064L256 113.552l-125.968-91.44 48.256 148.128L53.12 261.376h154.576l48.256 147.376 48.016-147.376H458.8l-125.376-91.12z"/><glyph unicode="" d="M319.376 223.824v127.76H192.624v-127.76H102.88L256.048 35.216l153.088 188.608zM256.016 480c-141.392 0-256-114.608-256-255.984C.016 82.624 114.624-32 256.016-32c141.376 0 256 114.624 256 256.016 0 141.376-114.624 255.984-256 255.984zm0-480c-123.52 0-224 100.496-224 224.016 0 123.504 100.48 223.984 224 223.984s224-100.48 224-223.984c0-123.52-100.48-224.016-224-224.016z"/><glyph unicode="" d="M255.982 440.594c-119.607 0-216.576-96.97-216.576-216.594S136.376 7.405 255.982 7.405c119.625 0 216.595 96.97 216.595 216.595s-96.95 216.595-216.595 216.595zm0-20.68c108.05 0 195.913-87.882 195.913-195.914 0-45.184-15.507-86.71-41.325-119.9-3.108 1.135-6.217 2.196-9.197 3.457-19.748 8.265-41.71 17.957-61.42 26.094l-16.897 4.61c-6.692 4.59-13.33 19.99-16.914 27.67-3.548.51-7.15 1.005-10.752 1.48.53 11.87 7.88 12.545 10.752 21.54 2.54 7.955.293 18.34 4.28 25.73 2.778 5.12 9.124 5.12 12.232 9.544 2.853 3.95 4.772 10.918 5.668 15.8 1.61 8.905 3.017 21.12-1.207 29.988-2.432 5.066-3.968 5.578-4.644 11.74-.82 7.516 2.218 31.89 2.347 37.175.293 13.68-.055 14.794-3.346 28.124 0 0-4.005 12.087-10.295 15.726l-12.58 2.158-7.77 7.186c-31.306 19.272-64.878 5.76-82.835-1.5-25.91-8.43-42.297-33.79-30.87-87.955 1.96-9.29-5.063-13.42-4.606-18.468 1.042-11.045 1.207-37.614 11.648-44.124.97-.603 8.376-2.47 8.34-1.938 1.006-10.752 2.048-21.522 3.054-32.238 2.616-7.15 8.87-7.954 10.68-18.048l-7.99-1.92c-3.603-7.68-10.186-23.08-16.897-27.668-5.65-1.517-11.284-3.053-16.917-4.59-19.73-8.118-41.654-17.828-61.42-26.093-1.08-.44-2.214-.79-3.29-1.21C74.953 139.154 60.09 179.822 60.09 224c0 108.032 87.88 195.913 195.895 195.913z"/><glyph unicode="" d="M94.8 322.592L1.376 401.056.88 79.088l316.688 56.336-89.216 74.96C410.464 377.904 456.256 202.256 474.624 5.6 540.56 579.664 244.784 450.928 94.8 322.592z"/><glyph unicode="" d="M428.432 224h-20.08v96.176c0 43.36-16.448 83.104-43.632 112.144-27.056 29.056-65.632 47.712-108.16 47.68-42.544.032-81.12-18.624-108.192-47.68-27.184-29.04-43.632-68.784-43.648-112.144V224H83.904c-10.816 0-19.584-8.752-19.584-19.584v-216.8C64.32-23.232 73.088-32 83.904-32h344.528c10.8 0 19.584 8.768 19.584 19.632v216.8c0 10.816-8.784 19.568-19.584 19.568zm-251.616 96.176c0 25.024 9.472 47.168 24.192 62.928 14.848 15.728 34.144 24.784 55.552 24.816 21.376-.032 40.688-9.072 55.536-24.816 14.704-15.744 24.176-37.888 24.176-62.928V224h-159.44v96.176z"/></font></defs></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg"><defs><font id="Luma-Icons" horiz-adv-x="512"><font-face units-per-em="512" ascent="480" descent="-32"/><missing-glyph horiz-adv-x="512"/><glyph unicode=" " d="" horiz-adv-x="256"/><glyph unicode="" d="M436.608 435.568c-65.68 31.424-144.064 2.832-174.976-63.84-2.16-4.64-4.016-10.448-5.664-17.2-1.648 6.752-3.504 12.56-5.632 17.2-30.944 66.672-109.248 95.264-174.944 63.84-65.6-31.424-93.744-110.96-62.832-177.648 30.928-66.672 243.344-257.84 243.344-257.84s0.016 0.224 0.048 0.576c0.048-0.352 0.064-0.576 0.064-0.576s212.512 191.168 243.44 257.84c30.896 66.688 2.832 146.224-62.848 177.648z"/><glyph unicode="" d="M362.533 425.051c-49.81-49.792-20.809-20.772-20.809-20.772l96.402-96.384c0 0-31.067-31.049 20.772 20.773s-46.611 146.194-96.365 96.384zM320.147 383.671l-227.987-227.986 0.329-0.293-54.071-146.524 149.833 50.688 0.311-0.311 0.786 0.805v0.019l227.2 227.2-96.403 96.403zM179.036 104.375l-78.811-33.28 37.047 75.044 38.345 38.363 41.764-41.783-38.345-38.345z"/><glyph unicode="" d="M255.952 480l-255.952-448h512l-256.048 448zM287.12 353.808v-65.36l-16.688-128.544h-27.088l-18.032 128.544-0.992 65.36h62.8zM224.096 64.112v64.112h64.24v-64.112h-64.24z"/><glyph unicode="" d="M363.923 112.019c-29.805-28.764-68.663-43.502-108.013-43.538-35.145 0.036-70.199 11.757-99.347 35.932-37.029 30.829-56.046 74.971-56.1 119.661 0 7.442 0.549 14.829 1.591 22.18l-60.672-11.374c-0.164-3.602-0.292-7.186-0.292-10.807-0.036-61.495 26.459-122.899 77.549-165.285 40.009-33.335 88.887-49.683 137.252-49.683h0.128c56.211 0 112.164 22.217 153.746 64.914l39.844-39.772 0.311 124.745-131.803 0.348 45.805-47.324zM393.344 389.23c-40.046 33.335-88.923 49.664-137.271 49.664-55.808 0-111.397-21.833-152.923-63.945l-37.687 34.798-0.677-120.722 130.487-0.75-46.336 48.493c29.641 28.252 68.188 42.697 107.154 42.733 35.108-0.036 70.217-11.721 99.328-35.932 37.029-30.829 56.046-74.935 56.137-119.698 0-6.437-0.457-12.892-1.225-19.365l60.435 11.593c0.036 2.615 0.164 5.212 0.164 7.772-0.036 61.549-26.514 122.899-77.587 165.357z"/><glyph unicode="" d="M95.792-32h320.4v320.080h-320.4v-320.080zM318.336 228.512c0 9.904 8.032 17.904 17.952 17.904 9.904 0 17.936-8 17.936-17.904v-188.736c0-9.888-8.032-17.92-17.936-17.92-9.92 0-17.952 8.032-17.952 17.92v188.736zM238.048 228.512c0 9.904 8.032 17.904 17.92 17.904s17.92-8 17.92-17.904v-188.736c0-9.888-8.032-17.92-17.92-17.92s-17.92 8.032-17.92 17.92v188.736zM157.6 228.512c0 9.904 8 17.904 17.92 17.904 9.888 0 17.92-8 17.92-17.904v-188.736c0-9.888-8.032-17.92-17.92-17.92-9.92 0-17.92 8.032-17.92 17.92v188.736zM423.216 416.528h-71.232v10.896c0 29.040-19.76 52.576-48.8 52.576h-94.72c-29.008 0-48.48-23.536-48.48-52.576v-10.896h-71.232c-13.696 0-24.768-11.088-24.768-24.752v-71.984h384v71.984c0 13.664-11.040 24.752-24.768 24.752zM319.936 416.528h-128.192v14.704c0.032 9.248 7.488 16.736 16.72 16.768h94.72c9.216-0.032 16.704-7.52 16.752-16.768v-14.704z"/><glyph unicode="" d="M511.52 278.496c-1.312 4.096-5.152 6.88-9.44 6.88h-180.704l-55.952 171.744c-1.344 4.096-5.136 6.88-9.44 6.88-4.272 0-8.096-2.784-9.44-6.88l-56.24-171.744h-180.384c-4.256 0-8.096-2.784-9.44-6.88-1.312-4.064 0.128-8.592 3.584-11.088l145.984-106.32-56.256-172.72c-1.328-4.096 0.128-8.592 3.616-11.12 3.456-2.496 8.208-2.496 11.664 0l146.896 106.624 146.64-106.624c1.792-1.28 3.76-1.936 5.808-1.936 2.096 0 4.144 0.656 5.856 1.936 3.568 2.528 4.96 7.008 3.6 11.12l-56.24 172.72 146.288 106.32c3.488 2.496 4.928 6.992 3.6 11.088z"/><glyph unicode="" d="M473.015 200.375v49.371l-7.003 2.268-52.882 17.244-14.116 34.103 27.154 57.381-34.908 34.907-6.583-3.309-49.555-25.198-34.103 14.117-21.394 59.757h-49.371l-2.286-6.985-17.262-52.882-34.048-14.099-57.399 27.136-34.925-34.926 3.309-6.564 25.18-49.591-14.080-34.029-59.758-21.412v-49.39l6.949-2.249 52.901-17.28 14.099-34.067-27.118-57.38 34.925-34.925 6.528 3.328 49.591 25.197 34.066-14.116 21.394-59.757h49.371l2.286 6.985 17.28 52.882 34.029 14.116 57.399-27.136 34.944 34.908-3.346 6.546-25.197 49.572 14.116 34.067 59.813 21.413zM256 154.861c-38.199 0-69.156 30.957-69.156 69.139 0 38.217 30.958 69.156 69.156 69.156 38.163 0 69.156-30.94 69.156-69.156 0-38.18-31.012-69.139-69.156-69.139z"/><glyph unicode="" d="M31.008 351.36l224.992-239.984 225.040 239.984z"/><glyph unicode="" d="M383.415 226.596l-212.571 218.587-37.285-34.981 178.286-183.277-183.278-188.452 36.48-35.657 205.659 211.456-0.201 0.201z"/><glyph unicode="" d="M52.928 345.2h406.144c11.056 0 20 8.976 20 20.016 0 11.072-8.944 20.032-20 20.032h-406.144c-11.056 0-20.016-8.96-20.016-20.032 0-11.040 8.96-20.016 20.016-20.016zM459.072 244.016h-406.144c-11.056 0-20.016-8.944-20.016-20.016s8.96-20.016 20.016-20.016h406.144c11.056 0 20 8.944 20 20.016s-8.928 20.016-20 20.016zM459.072 102.8h-406.144c-11.056 0-20.016-8.96-20.016-20.032s8.96-20.016 20.016-20.016h406.144c11.056 0 20 8.944 20 20.016s-8.928 20.032-20 20.032z"/><glyph unicode="" d="M256.144 480c-89.12 0-161.344-72.24-161.344-161.376 0-89.104 161.344-350.624 161.344-350.624s161.376 261.52 161.376 350.624c0 89.136-72.192 161.376-161.376 161.376zM256.144 269.616c-27.056 0-49.024 21.952-49.024 49.008 0 27.072 21.984 49.024 49.024 49.024 27.104 0 49.088-21.952 49.088-49.024 0-27.056-21.984-49.008-49.088-49.008z"/><glyph unicode="" d="M0 256.144h224.032v223.808h-224.032v-223.808zM288.128 479.952v-95.728h224.176v95.728h-224.176zM0-32h224.032v223.808h-224.032v-223.808zM288.128 256.144h224.176v95.728h-224.176v-95.728zM288.128 96.080h224.176v95.728h-224.176v-95.728zM288.128-32h224.176v95.712h-224.176v-95.712z"/><glyph unicode="" d="M332.764 119.003c-9.216 0-45.495-56.027-65.243-56.027-5.284 0-7.863 4.644-7.863 9.216 0 10.569 7.241 27.044 11.154 36.937l47.397 128.384c23.772 63.891-6.546 81.024-34.871 81.024-38.217 0-72.448-19.091-98.779-44.124-8.576-8.576-37.523-36.206-37.523-48.091 0-3.932 3.931-8.576 8.576-8.576 11.813 0 43.447 57.308 67.803 57.308 5.285 0 11.191-5.924 6.583-17.755l-46.080-115.968c-4.644-11.154-27.044-65.171-27.044-96.786 0-25.015 16.476-36.188 40.192-36.188 66.523 0 143.543 81.645 143.543 100.755-0.019 5.925-4.589 9.892-7.844 9.892zM319.543 439.661c-28.947 0-54.016-23.68-54.016-52.663 0-27.008 17.792-44.8 44.837-44.8 29.55 0 54.62 22.4 54.62 52.7 0 27.008-19.072 44.764-45.44 44.764z"/><glyph unicode="" d="M0 351.552h128.464v128.448h-128.464v-128.448zM191.76 351.552h128.528v128.448h-128.528v-128.448zM383.568 480v-128.448h128.496v128.448h-128.496zM0 159.744h128.464v128.464h-128.464v-128.464zM191.76 159.744h128.528v128.464h-128.528v-128.464zM383.568 159.744h128.496v128.464h-128.496v-128.464zM0-32h128.464v128h-128.464v-128zM191.76-32h128.528v128h-128.528v-128zM383.568-32h128.496v128h-128.496v-128z"/><glyph unicode="" d="M255.296 450.464c-124.688 0-225.76-101.072-225.76-225.76 0-124.672 101.072-225.76 225.76-225.76 124.672 0 225.76 101.088 225.76 225.76 0 124.688-101.072 225.76-225.76 225.76zM231.936 94.576l-125.936 128.032 32.208 25.936 72.864-57.088c29.76 35.424 96 106.032 187.312 161.984l7.696-17.792c-83.808-77.088-152.48-185.6-174.144-241.072z"/><glyph unicode="" d="M0 241.12h512v-34.064h-512v34.064z"/><glyph unicode="" d="M478.263 426.149c-142.555-87.388-245.98-197.632-292.48-252.947l-113.792 89.161-50.267-40.539 196.663-199.973c33.847 86.674 141.056 256.11 271.872 376.485l-11.995 27.813z"/><glyph unicode="" d="M220.576 83.248c-26.352 0-47.696-21.376-47.696-47.712s21.344-47.664 47.696-47.664c26.336 0 47.696 21.328 47.696 47.664s-21.36 47.712-47.696 47.712zM385.344 83.248c-26.4 0-47.76-21.376-47.76-47.712s21.344-47.664 47.76-47.664c26.288 0 47.632 21.328 47.632 47.664s-21.344 47.712-47.632 47.712zM459.856 350.32c-122.384 0-319.856 0-319.856 0s-19.152 52.608-37.392 84.864c-14.128 24.976-43.344 23.968-43.344 23.968-20.096 0-33.024-12.288-33.024-32.4 0-20.096 15.92-36.16 36.032-36.16l8.496-0.080 95.2-262.192 266.832-0.208c0 0 48.784 199.632 46.272 191.888 8.944 27.68-2.448 30.32-19.216 30.32zM166.528 257.344c-14 0-25.36 11.36-25.36 25.376s11.36 25.392 25.36 25.392c14.016 0 25.36-11.376 25.36-25.392s-11.344-25.376-25.36-25.376zM220.768 172.64c-14.016 0-25.376 11.376-25.376 25.392 0 13.984 11.36 25.36 25.376 25.36 14 0 25.36-11.376 25.36-25.36 0.016-14.016-11.36-25.392-25.36-25.392zM248.656 257.344c-14 0-25.376 11.36-25.376 25.376s11.36 25.392 25.376 25.392c14 0 25.36-11.376 25.36-25.392s-11.36-25.376-25.36-25.376zM302.896 172.64c-14 0-25.36 11.376-25.36 25.392 0 13.984 11.36 25.36 25.36 25.36 14.048 0 25.44-11.376 25.44-25.36 0-14.016-11.392-25.392-25.44-25.392zM330.848 257.344c-14 0-25.408 11.36-25.408 25.376s11.408 25.392 25.408 25.392c14 0 25.328-11.376 25.328-25.392s-11.328-25.376-25.328-25.376zM385.040 172.64c-13.984 0-25.328 11.376-25.328 25.392 0 13.984 11.36 25.36 25.328 25.36 14 0 25.408-11.376 25.408-25.36 0-14.016-11.408-25.392-25.408-25.392zM412.96 257.344c-14.016 0-25.36 11.36-25.36 25.376s11.344 25.392 25.36 25.392c14.048 0 25.376-11.376 25.376-25.392s-11.328-25.376-25.376-25.376z"/><glyph unicode="" d="M142.992 332.768c10.352 0 18.8 8.4 18.8 18.8v67.68c0 10.368-8.432 18.784-18.8 18.784-10.384 0-18.8-8.4-18.8-18.784v-67.68c0-10.4 8.416-18.8 18.8-18.8zM394.384 383.344v-0.32c7.776-6.944 12.72-17.008 12.72-28.288 0-20.816-16.88-37.712-37.744-37.712s-37.76 16.912-37.76 37.712c0 11.264 4.976 21.344 12.784 28.288v0.32h-176.416v-0.32c7.824-6.944 12.768-17.008 12.768-28.288 0-20.816-16.896-37.712-37.728-37.712-20.864 0-37.744 16.912-37.744 37.712 0 11.264 4.928 21.344 12.752 28.288v0.32h-85.536v-383.6h447.248v383.6h-85.344zM448.72 32.832h-383.152v254.72h383.152v-254.72zM369.36 332.768c10.384 0 18.784 8.4 18.784 18.8v67.68c0 10.368-8.4 18.784-18.784 18.784-10.352 0-18.816-8.4-18.816-18.784v-67.68c0-10.4 8.464-18.8 18.816-18.8zM349.216 184.128h-47.936v-47.872h47.952v47.872zM349.216 256.112h-47.936v-47.824h47.952v47.824zM349.216 114.112h-47.936v-47.872h47.952v47.872zM416.656 256.112h-47.92v-47.824h47.92v47.824zM416.656 184.128h-47.92v-47.872h47.92v47.872zM281.696 256.112h-47.872v-47.824h47.872v47.824zM146.8 184.128h-47.856v-47.872h47.856v47.872zM214.288 114.112h-47.888v-47.872h47.872v47.872zM146.8 114.112h-47.856v-47.872h47.856v47.872zM281.696 184.128h-47.872v-47.872h47.872v47.872zM281.696 114.112h-47.872v-47.872h47.872v47.872zM214.288 184.128h-47.888v-47.872h47.872v47.872zM214.288 256.112h-47.888v-47.824h47.872v47.824z"/><glyph unicode="" d="M256 444.727l-200.814-243.291h131.054v-198.144h139.575v198.144h131.017z"/><glyph unicode="" d="M325.779 246.583v198.144h-139.593v-198.144h-130.999l200.832-243.292 200.813 243.292z"/><glyph unicode="" d="M487.232 35.872c0 0-78.176 80.288-109.328 111.312-13.552 13.552-22.832 22.752-22.832 22.752 10.56 15.088 18.816 31.616 24.704 49.392 5.84 17.76 8.752 36.496 8.752 56.192 0 25.36-4.816 49.2-14.448 71.552-9.664 22.32-22.784 41.824-39.456 58.432-16.64 16.688-36.144 29.824-58.496 39.472-22.336 9.664-46.176 14.496-71.536 14.496-25.344 0-49.184-4.848-71.552-14.496-22.336-9.648-41.712-22.784-58.192-39.472-16.416-16.608-29.52-36.128-39.152-58.448-9.664-22.336-14.496-46.192-14.496-71.552 0-25.376 4.848-49.216 14.496-71.552 9.632-22.304 22.72-41.792 39.152-58.464 16.464-16.608 35.856-29.776 58.176-39.456 22.368-9.664 46.208-14.448 71.552-14.448 19.68 0 38.416 2.88 56.208 8.768 17.776 5.856 34.288 14.144 49.36 24.72 0 0 8.576-8.512 21.2-21.216 34.512-34.64 110.416-113.392 110.416-113.392 11.456-4.992 29.712 0.336 38.848 8.064 9.040 7.776 14.096 23.984 6.624 37.344zM327.792 223.28c-7.008-16.192-16.576-30.336-28.624-42.336-12.096-12.048-26.192-21.616-42.336-28.608-16.128-7.024-33.392-10.528-51.68-10.528-18.704 0-36.096 3.504-52.256 10.528-16.16 7.008-30.288 16.56-42.336 28.608-12.048 12.016-21.616 26.16-28.608 42.336-7.008 16.112-10.512 33.568-10.512 52.24 0 18.272 3.504 35.632 10.512 51.984 6.992 16.336 16.56 30.56 28.608 42.592 12.048 12.096 26.176 21.664 42.336 28.608 16.16 7.056 33.552 10.512 52.256 10.512 18.288 0 35.552-3.456 51.68-10.512 16.144-6.96 30.24-16.512 42.336-28.608 12.032-12.032 21.616-26.256 28.624-42.592 7.008-16.352 10.48-33.712 10.48-51.984 0.016-18.672-3.456-36.128-10.48-52.24z"/><glyph unicode="" d="M483.255 415.177l-36.023 35.968-191.25-191.268-191.25 191.268-35.986-35.968 191.268-191.269-191.123-191.14 35.968-35.932 191.14 191.104 191.123-191.104 35.932 35.932-191.104 191.123z"/><glyph unicode="" d="M200.21 226.889l178.213 183.315-37.248 34.981-212.608-218.588 218.459-223.78 36.389 35.657z"/><glyph unicode="" d="M256 335.168l-224.992-239.984h450.032z"/><glyph unicode="" d="M96.624 451.12v-454.24l312.928 227.12z"/><glyph unicode="" d="M102.992 224l312.912-227.12v454.24z"/><glyph unicode="" d="M0 0.464h63.984v479.536h-63.984v-479.536zM512.080 480h-415.824v-287.888h415.824l-138.208 142.032 138.208 145.856z"/><glyph unicode="" d="M512 241.12h-238.512v238.88h-34.016v-238.88h-239.472v-34.064h239.472v-239.056h34.016v239.056h238.512z"/><glyph unicode="" d="M255.968 228.064l221.488 155.84c-2.656 0.528-5.344 0.848-8.128 0.848h-426.656c-2.8 0-5.504-0.32-8.144-0.848l221.44-155.84zM256.928 168.496l-0.96 1.408-0.944-1.408-254.56 179.136c-0.176-1.6-0.464-3.2-0.464-4.816v-267.712c0-23.904 19.104-43.312 42.672-43.312h426.656c23.6 0 42.688 19.408 42.688 43.312v267.712c0 1.632-0.288 3.216-0.496 4.816l-254.592-179.136z"/><glyph unicode="" d="M127.584 31.776v127.632h-127.584v-127.632h127.584zM319.248 416.24h-126.928v-384.448h126.928v384.448zM511.584 287.472h-127.376v-255.68h127.376v255.68z"/><glyph unicode="" d="M255.296 450.464c-124.688 0-225.76-101.072-225.76-225.76 0-124.672 101.072-225.76 225.76-225.76 124.672 0 225.76 101.088 225.76 225.76 0 124.688-101.072 225.76-225.76 225.76zM372.16 144.832l-37.104-37.104-79.088 79.056-79.056-79.040-37.12 37.136 79.024 79.024-79.136 79.12 37.136 37.136 79.12-79.136 79.184 79.184 37.152-37.152-79.2-79.168 79.088-79.056z"/><glyph unicode="" d="M262.748 418.688c-113.664 2.249-207.214-67.803-208.969-156.435-0.585-30.829 9.984-59.813 28.8-84.644l-4.919 4.955c32.384-41.618-31.104-153.308-31.104-153.308l142.281 70.345c22.51-7.095 44.16-11.923 69.724-12.452 113.664-2.231 205.111 78.355 206.848 167.004 1.755 88.631-88.96 162.304-202.661 164.535z"/><glyph unicode="" d="M259.163 285.422l201.837-196.224 38.546 41.070-240.713 234.021-246.363-240.476 39.26-40.101z"/><glyph unicode="" d="M252.819 162.579l-201.82 196.224-38.528-41.070 240.677-234.021 246.4 240.476-39.332 40.101z"/><glyph unicode="" d="M256-33.248c-141.408 0-256 114.624-256 256s114.592 256 256 256c141.376 0 256-114.624 256-256s-114.608-256-256-256zM256 447.76c-124.048 0-225.008-100.96-225.008-225.008s100.96-225.024 225.008-225.024 224.992 100.96 224.992 225.008-100.928 225.024-224.992 225.024zM320.24 219.152l-15.6-12.128c-8.496-6.624-14.128-14.32-16.912-23.152-1.776-5.6-3.008-12.256-3.168-24h-59.712c0.88 24.848 3.504 39.968 7.328 49.472 3.808 9.472 13.632 20.368 29.44 32.72l16.032 12.528c5.28 4 9.536 8.32 12.752 13.024 5.872 8.064 8.784 16.976 8.784 26.656 0 11.152-3.248 21.312-9.776 30.496-6.496 9.184-18.4 13.808-35.712 13.808-17.008 0-29.056-5.68-36.16-17.008s-10.592-21.664-10.592-33.84h-63.68c1.744 41.872 16.32 70.16 43.776 87.632 17.344 11.152 38.656 16.752 63.904 16.752 33.216 0 60.784-7.936 82.752-23.808 21.968-15.84 34.8-48.432 34.8-79.6 0-19.088-6.624-26.096-16.144-39.184-5.584-7.92-16.272-18.048-32.112-30.368zM287.728 64h-63.504v63.68h63.504v-63.68z"/><glyph unicode="" d="M416.656 128v135.696h-320.672v-135.696h-95.984v199.344c0 13.76 11.168 24.912 24.944 24.912h462.144c13.744 0 24.912-11.152 24.912-24.912v-199.344h-95.344zM464.304 324.624c-11.024 0-19.92-8.928-19.92-19.936s8.896-19.952 19.92-19.952c10.992 0 19.968 8.96 19.968 19.952 0 11.008-8.992 19.936-19.968 19.936zM127.728 480h256v-96.192h-256v96.192zM160.976 31.664h191.232v192.336h31.824v-224.080h-255.984v224.080h32.912v-192.336z"/><glyph unicode="" d="M502.080 285.376h-180.704l-55.952 171.744c-1.344 4.096-5.136 6.88-9.44 6.88-4.272 0-8.096-2.784-9.44-6.88l-56.24-171.744h-180.384c-4.256 0-8.096-2.784-9.44-6.88-1.312-4.064 0.128-8.592 3.584-11.088l145.984-106.32-56.256-172.72c-1.328-4.096 0.128-8.592 3.616-11.12 3.456-2.496 8.208-2.496 11.664 0l146.896 106.624 146.64-106.624c1.792-1.28 3.76-1.936 5.808-1.936 2.096 0 4.144 0.656 5.856 1.936 3.568 2.528 4.96 7.008 3.6 11.12l-56.24 172.72 146.288 106.32c3.488 2.496 4.928 7.008 3.6 11.088-1.312 4.096-5.168 6.88-9.44 6.88zM333.424 170.256l48.208-148.064-125.632 91.36-125.968-91.44 48.256 148.128-125.168 91.136h154.576l48.256 147.376 48.016-147.376h154.832l-125.376-91.12z"/><glyph unicode="" d="M319.376 223.824v127.76h-126.752v-127.76h-89.744l153.168-188.608 153.088 188.608zM256.016 480c-141.392 0-256-114.608-256-255.984 0-141.392 114.608-256.016 256-256.016 141.376 0 256 114.624 256 256.016 0 141.376-114.624 255.984-256 255.984zM256.016 0c-123.52 0-224 100.496-224 224.016 0 123.504 100.48 223.984 224 223.984s224-100.48 224-223.984c0-123.52-100.48-224.016-224-224.016z"/><glyph unicode="" d="M255.982 440.594c-119.607 0-216.576-96.969-216.576-216.594s96.969-216.595 216.576-216.595c119.625 0 216.595 96.969 216.595 216.595s-96.951 216.595-216.595 216.595zM255.982 419.913c108.051 0 195.913-87.881 195.913-195.913 0-45.184-15.507-86.711-41.325-119.899-3.108 1.134-6.217 2.195-9.197 3.456-19.748 8.265-41.709 17.957-61.421 26.094-5.632 1.536-11.264 3.072-16.896 4.608-6.692 4.589-13.33 19.986-16.914 27.666-3.548 0.512-7.149 1.005-10.752 1.481 0.531 11.868 7.881 12.544 10.752 21.541 2.541 7.954 0.293 18.341 4.279 25.728 2.779 5.12 9.125 5.12 12.233 9.545 2.853 3.95 4.772 10.917 5.668 15.799 1.609 8.905 3.017 21.12-1.207 29.988-2.432 5.065-3.968 5.577-4.644 11.739-0.823 7.516 2.212 31.891 2.341 37.175 0.293 13.678-0.055 14.793-3.346 28.123 0 0-4.005 12.087-10.295 15.726l-12.58 2.158-7.772 7.186c-31.305 19.273-64.877 5.76-82.834-1.499-25.911-8.43-42.295-33.792-30.867-87.955 1.957-9.289-5.065-13.421-4.608-18.468 1.042-11.045 1.207-37.614 11.648-44.124 0.969-0.603 8.375-2.469 8.339-1.938 1.006-10.752 2.048-21.522 3.054-32.238 2.615-7.149 8.869-7.954 10.679-18.048l-7.991-1.92c-3.602-7.68-10.185-23.077-16.896-27.666-5.65-1.517-11.282-3.053-16.915-4.589-19.731-8.119-41.655-17.829-61.422-26.094-1.079-0.439-2.213-0.786-3.291-1.207-24.759 32.786-39.625 73.454-39.625 117.632 0 108.032 87.881 195.913 195.895 195.913z"/><glyph unicode="" d="M94.8 322.592l-93.424 78.464-0.496-321.968 316.688 56.336-89.216 74.96c182.112 167.52 227.904-8.128 246.272-204.784 65.936 574.064-229.84 445.328-379.824 316.992z"/><glyph unicode="" d="M428.432 224h-20.080v96.176c0 43.36-16.448 83.104-43.632 112.144-27.056 29.056-65.632 47.712-108.16 47.68-42.544 0.032-81.12-18.624-108.192-47.68-27.184-29.040-43.632-68.784-43.648-112.144v-96.176h-20.816c-10.816 0-19.584-8.752-19.584-19.584v-216.8c0-10.848 8.768-19.616 19.584-19.616h344.528c10.8 0 19.584 8.768 19.584 19.632v216.8c0 10.816-8.784 19.568-19.584 19.568zM176.816 320.176c0 25.024 9.472 47.168 24.192 62.928 14.848 15.728 34.144 24.784 55.552 24.816 21.376-0.032 40.688-9.072 55.536-24.816 14.704-15.744 24.176-37.888 24.176-62.928v-96.176h-159.44v96.176z"/><glyph unicode="" d="M150.896 316.944h-112.192c-9.040 0-16.384-7.312-16.384-16.368v-80c0-9.056 7.344-16.368 16.384-16.368h112.192c9.056 0 16.432 7.312 16.432 16.368v80c0 9.056-7.376 16.368-16.432 16.368zM150.896 171.056h-79.376c-9.056 0-16.432-7.312-16.432-16.368v-170.32c-0.016-9.056 7.36-16.368 16.432-16.368h79.376c9.056 0 16.432 7.312 16.432 16.368v170.32c0 9.056-7.376 16.368-16.432 16.368zM473.328 316.944h-244.88c-9.056 0-16.368-7.312-16.368-16.368v-80c0-9.056 7.312-16.368 16.368-16.368h244.88c8.992 0 16.368 7.312 16.368 16.368v80c0 9.056-7.36 16.368-16.368 16.368zM439.52 169.376h-210.56c-9.056 0-16.368-7.344-16.368-16.4v-168.592c0-9.056 7.312-16.368 16.368-16.368h210.56c9.056 0 16.368 7.312 16.368 16.368v168.592c0 9.056-7.312 16.4-16.368 16.4zM251.952 335.68c19.12-3.504 37.568-5.536 54.816-5.536 86.688 0 133.68 46.592 133.936 90.464 0.128 28.256-20.752 58.88-68.368 59.376-63.808 0-103.312-45.056-123.872-78.496-20.944 33.312-60.624 77.472-124.56 77.472-46.256-0.464-67.2-31.088-67.008-59.328 0.176-43.888 47.248-90.512 133.936-90.512v0c18.752 0 38.88 2.128 59.872 6.336l1.248 0.224zM373.264 439.008c8-0.064 26.56-2 26.432-18.192-0.064-20.624-28.992-49.68-92.944-49.68-8.816 0-18 0.56-27.632 1.68 14.576 25.648 45.216 66.192 94.144 66.192zM190.832 370.128v0c-63.936 0-92.88 29.056-92.992 49.68-0.080 16.16 18.496 18.096 27.36 18.192 48.368 0 78.816-40.56 93.184-66.224-9.552-1.088-18.736-1.648-27.552-1.648z"/><glyph unicode="" d="M182.256 403.408c0-9.248-7.504-16.72-16.688-16.72h-9.776c-9.216 0-16.72 7.472-16.72 16.72v59.872c0 9.216 7.504 16.72 16.72 16.72h9.776c9.184 0 16.688-7.504 16.688-16.72v-59.872zM373.072 403.408c0-9.248-7.504-16.72-16.688-16.72h-9.744c-9.248 0-16.688 7.472-16.688 16.72v59.872c0 9.216 7.424 16.72 16.688 16.72h9.744c9.184 0 16.688-7.504 16.688-16.72v-59.872zM398.816 253.152l-33.936 27.664-133.68-163.872-71.312 56.688-25.28-31.728 105.184-83.648zM471.952 434h-62.432v-26.064c0-27.68-22.56-50.192-50.128-50.192h-9.808c-27.68 0-50.128 22.496-50.128 50.192v26.064h-85.504v-26.064c0-27.68-22.496-50.192-50.128-50.192h-9.76c-27.664 0-50.16 22.496-50.16 50.192v26.064h-63.808c-9.216 0-16.72-7.504-16.72-16.688v-432.592c0-9.216 7.504-16.72 16.72-16.72h431.84c9.184 0 16.688 7.504 16.688 16.72v432.592c0.016 9.184-7.488 16.688-16.672 16.688zM438.512 42.592c0-9.248-7.504-16.72-16.752-16.72h-331.504c-9.248 0-16.752 7.472-16.752 16.72v252.096c0 9.248 7.504 16.688 16.752 16.688h331.504c9.248 0 16.752-7.44 16.752-16.688v-252.096z"/></font></defs></svg> \ No newline at end of file diff --git a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.ttf b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.ttf index c096e782506ee3b3b2c4a46dac60529aebd7096e..e2e4864f8b1a9573b3cf18b0bd273bd5b8464f0e 100644 Binary files a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.ttf and b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.ttf differ diff --git a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff index 1b2c57c533e0e13926c58b542c9f17baeb0705b2..881e639aca422fcc6cc5fdf8ff5bd30c433e3c99 100644 Binary files a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff and b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff differ diff --git a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff2 b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff2 index cc91480dac868dc0a36bc6ce3d95bc3bcbf8ed27..66faa61a2d24a488aa52dec055ab8f19a30b9811 100644 Binary files a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff2 and b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff2 differ diff --git a/app/design/frontend/Magento/luma/web/fonts/selection.json b/app/design/frontend/Magento/luma/web/fonts/selection.json index 11b601ea6493080698a69a0f3f1a1516c2c4b6c7..2c4a03883a15bb5cceee2a24e6e1a0a9b07ae979 100644 --- a/app/design/frontend/Magento/luma/web/fonts/selection.json +++ b/app/design/frontend/Magento/luma/web/fonts/selection.json @@ -1,16 +1,123 @@ { "IcoMoonType": "selection", "icons": [ + { + "icon": { + "paths": [ + "M856.864 512h-40.16v-192.352c0-86.72-32.896-166.208-87.264-224.288-54.112-58.112-131.264-95.424-216.32-95.36-85.088-0.064-162.24 37.248-216.384 95.36-54.368 58.080-87.264 137.568-87.296 224.288v192.352h-41.632c-21.632 0-39.168 17.504-39.168 39.168v433.6c0 21.696 17.536 39.232 39.168 39.232h689.056c21.6 0 39.168-17.536 39.168-39.264v-433.6c0-21.632-17.568-39.136-39.168-39.136zM353.632 319.648c0-50.048 18.944-94.336 48.384-125.856 29.696-31.456 68.288-49.568 111.104-49.632 42.752 0.064 81.376 18.144 111.072 49.632 29.408 31.488 48.352 75.776 48.352 125.856v192.352h-318.88v-192.352z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "grid": 32, + "tags": [ + "private" + ] + }, + "attrs": [ + {} + ], + "properties": { + "order": 40, + "id": 37, + "prevSize": 16, + "code": 58921, + "name": "private" + }, + "setIdx": 0, + "setId": 1, + "iconIdx": 0 + }, + { + "icon": { + "paths": [ + "M364.512 153.184c0 18.496-15.008 33.44-33.376 33.44h-19.552c-18.432 0-33.44-14.944-33.44-33.44v-119.744c0-18.432 15.008-33.44 33.44-33.44h19.552c18.368 0 33.376 15.008 33.376 33.44v119.744z", + "M746.144 153.184c0 18.496-15.008 33.44-33.376 33.44h-19.488c-18.496 0-33.376-14.944-33.376-33.44v-119.744c0-18.432 14.848-33.44 33.376-33.44h19.488c18.368 0 33.376 15.008 33.376 33.44v119.744z", + "M797.632 453.696l-67.872-55.328-267.36 327.744-142.624-113.376-50.56 63.456 210.368 167.296z", + "M943.904 92h-124.864v52.128c0 55.36-45.12 100.384-100.256 100.384h-19.616c-55.36 0-100.256-44.992-100.256-100.384v-52.128h-171.008v52.128c0 55.36-44.992 100.384-100.256 100.384h-19.52c-55.328 0-100.32-44.992-100.32-100.384v-52.128h-127.616c-18.432 0-33.44 15.008-33.44 33.376v865.184c0 18.432 15.008 33.44 33.44 33.44h863.68c18.368 0 33.376-15.008 33.376-33.44v-865.184c0.032-18.368-14.976-33.376-33.344-33.376zM877.024 874.816c0 18.496-15.008 33.44-33.504 33.44h-663.008c-18.496 0-33.504-14.944-33.504-33.44v-504.192c0-18.496 15.008-33.376 33.504-33.376h663.008c18.496 0 33.504 14.88 33.504 33.376v504.192z" + ], + "attrs": [ + {}, + {}, + {}, + {} + ], + "isMulticolor": false, + "grid": 32, + "tags": [ + "gift-registry" + ] + }, + "attrs": [ + {}, + {}, + {}, + {} + ], + "properties": { + "order": 39, + "id": 36, + "prevSize": 16, + "code": 58923, + "name": "gift-registry" + }, + "setIdx": 0, + "setId": 1, + "iconIdx": 1 + }, + { + "icon": { + "paths": [ + "M301.792 326.112h-224.384c-18.080 0-32.768 14.624-32.768 32.736v160c0 18.112 14.688 32.736 32.768 32.736h224.384c18.112 0 32.864-14.624 32.864-32.736v-160c0-18.112-14.752-32.736-32.864-32.736z", + "M301.792 617.888h-158.752c-18.112 0-32.864 14.624-32.864 32.736v340.64c-0.032 18.112 14.72 32.736 32.864 32.736h158.752c18.112 0 32.864-14.624 32.864-32.736v-340.64c0-18.112-14.752-32.736-32.864-32.736z", + "M946.656 326.112h-489.76c-18.112 0-32.736 14.624-32.736 32.736v160c0 18.112 14.624 32.736 32.736 32.736h489.76c17.984 0 32.736-14.624 32.736-32.736v-160c0-18.112-14.72-32.736-32.736-32.736z", + "M879.040 621.248h-421.12c-18.112 0-32.736 14.688-32.736 32.8v337.184c0 18.112 14.624 32.736 32.736 32.736h421.12c18.112 0 32.736-14.624 32.736-32.736v-337.184c0-18.112-14.624-32.8-32.736-32.8z", + "M503.904 288.64c38.24 7.008 75.136 11.072 109.632 11.072 173.376 0 267.36-93.184 267.872-180.928 0.256-56.512-41.504-117.76-136.736-118.752-127.616 0-206.624 90.112-247.744 156.992-41.888-66.624-121.248-154.944-249.12-154.944-92.512 0.928-134.4 62.176-134.016 118.656 0.352 87.776 94.496 181.024 267.872 181.024v0c37.504 0 77.76-4.256 119.744-12.672l2.496-0.448zM746.528 81.984c16 0.128 53.12 4 52.864 36.384-0.128 41.248-57.984 99.36-185.888 99.36-17.632 0-36-1.12-55.264-3.36 29.152-51.296 90.432-132.384 188.288-132.384zM381.664 219.744v0c-127.872 0-185.76-58.112-185.984-99.36-0.16-32.32 36.992-36.192 54.72-36.384 96.736 0 157.632 81.12 186.368 132.448-19.104 2.176-37.472 3.296-55.104 3.296z" + ], + "attrs": [ + {}, + {}, + {}, + {}, + {} + ], + "isMulticolor": false, + "grid": 32, + "tags": [ + "gift-wrapping" + ] + }, + "attrs": [ + {}, + {}, + {}, + {}, + {} + ], + "properties": { + "order": 38, + "id": 35, + "prevSize": 16, + "code": 58922, + "name": "present" + }, + "setIdx": 0, + "setId": 1, + "iconIdx": 2 + }, { "icon": { "paths": [ "M1004.16 389.248h-361.408l-111.904-343.488c-2.688-8.192-10.272-13.76-18.88-13.76-8.544 0-16.192 5.568-18.88 13.76l-112.48 343.488h-360.768c-8.512 0-16.192 5.568-18.88 13.76-2.624 8.128 0.256 17.184 7.168 22.176l291.968 212.64-112.512 345.44c-2.656 8.192 0.256 17.184 7.232 22.24 6.912 4.992 16.416 4.992 23.328 0l293.792-213.248 293.28 213.248c3.584 2.56 7.52 3.872 11.616 3.872 4.192 0 8.288-1.312 11.712-3.872 7.136-5.056 9.92-14.016 7.2-22.24l-112.48-345.44 292.576-212.64c6.976-4.992 9.856-14.016 7.2-22.176-2.624-8.192-10.336-13.76-18.88-13.76zM666.848 619.488l96.416 296.128-251.264-182.72-251.936 182.88 96.512-296.256-250.336-182.272h309.152l96.512-294.752 96.032 294.752h309.664l-250.752 182.24z" ], - "grid": 0, + "grid": 32, "tags": [ "star-empty" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 3, "id": 2, @@ -20,7 +127,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 0 + "setId": 1, + "iconIdx": 3 }, { "icon": { @@ -28,11 +136,13 @@ "M638.752 512.352v-255.52h-253.504v255.52h-179.488l306.336 377.216 306.176-377.216z", "M512.032 0c-282.784 0-512 229.216-512 511.968 0 282.784 229.216 512.032 512 512.032 282.752 0 512-229.248 512-512.032-0-282.752-229.248-511.968-512-511.968zM512.032 960c-247.040 0-448-200.992-448-448.032-0-247.008 200.96-447.968 448-447.968s448 200.96 448 447.968c0 247.040-200.96 448.032-448 448.032z" ], - "grid": 0, + "grid": 32, "tags": [ "download" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 2, "id": 1, @@ -42,18 +152,21 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 1 + "setId": 1, + "iconIdx": 4 }, { "icon": { "paths": [ "M189.6 314.816l-186.848-156.928-0.992 643.936 633.376-112.672-178.432-149.92c364.224-335.040 455.808 16.256 492.544 409.568 131.872-1148.128-459.68-890.656-759.648-633.984z" ], - "grid": 0, + "grid": 32, "tags": [ "undo" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 1, "id": 0, @@ -63,7 +176,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 2 + "setId": 1, + "iconIdx": 5 }, { "icon": { @@ -73,8 +187,10 @@ "tags": [ "print" ], - "grid": 0 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 2, "id": 0, @@ -83,8 +199,9 @@ "name": "print", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 0 + "setIdx": 0, + "setId": 1, + "iconIdx": 6 }, { "icon": { @@ -94,8 +211,10 @@ "tags": [ "help" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 37, "id": 2, @@ -104,8 +223,9 @@ "name": "help", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 1 + "setIdx": 0, + "setId": 1, + "iconIdx": 7 }, { "icon": { @@ -115,8 +235,10 @@ "tags": [ "success" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 34, "id": 1, @@ -125,8 +247,9 @@ "name": "success", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 2 + "setIdx": 0, + "setId": 1, + "iconIdx": 8 }, { "icon": { @@ -136,8 +259,10 @@ "tags": [ "error" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 35, "id": 0, @@ -146,8 +271,9 @@ "name": "error", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 3 + "setIdx": 0, + "setId": 1, + "iconIdx": 9 }, { "icon": { @@ -157,8 +283,10 @@ "tags": [ "account" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 30, "id": 4, @@ -167,8 +295,9 @@ "name": "account", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 4 + "setIdx": 0, + "setId": 1, + "iconIdx": 10 }, { "icon": { @@ -178,8 +307,10 @@ "tags": [ "edit" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 32, "id": 5, @@ -188,8 +319,9 @@ "name": "edit", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 5 + "setIdx": 0, + "setId": 1, + "iconIdx": 11 }, { "icon": { @@ -199,8 +331,10 @@ "tags": [ "wishlist" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 31, "id": 32, @@ -209,8 +343,9 @@ "name": "wishlist-full", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 6 + "setIdx": 0, + "setId": 1, + "iconIdx": 12 }, { "icon": { @@ -220,8 +355,10 @@ "tags": [ "warning" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 33, "id": 30, @@ -230,8 +367,9 @@ "name": "warning", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 7 + "setIdx": 0, + "setId": 1, + "iconIdx": 13 }, { "icon": { @@ -241,8 +379,10 @@ "tags": [ "update" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 1, "id": 29, @@ -251,8 +391,9 @@ "name": "update", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 8 + "setIdx": 0, + "setId": 1, + "iconIdx": 14 }, { "icon": { @@ -262,8 +403,10 @@ "tags": [ "trash" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 2, "id": 28, @@ -272,8 +415,9 @@ "name": "trash", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 9 + "setIdx": 0, + "setId": 1, + "iconIdx": 15 }, { "icon": { @@ -283,8 +427,10 @@ "tags": [ "star" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 36, "id": 27, @@ -293,8 +439,9 @@ "name": "star", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 10 + "setIdx": 0, + "setId": 1, + "iconIdx": 16 }, { "icon": { @@ -304,8 +451,10 @@ "tags": [ "settings" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 3, "id": 26, @@ -314,8 +463,9 @@ "name": "settings", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 11 + "setIdx": 0, + "setId": 1, + "iconIdx": 17 }, { "icon": { @@ -325,8 +475,10 @@ "tags": [ "pointer down" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 4, "id": 19, @@ -335,8 +487,9 @@ "name": "pointer-down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 12 + "setIdx": 0, + "setId": 1, + "iconIdx": 18 }, { "icon": { @@ -346,8 +499,10 @@ "tags": [ "next" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 5, "id": 18, @@ -356,8 +511,9 @@ "name": "next", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 13 + "setIdx": 0, + "setId": 1, + "iconIdx": 19 }, { "icon": { @@ -367,8 +523,10 @@ "tags": [ "menu" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 6, "id": 17, @@ -377,8 +535,9 @@ "name": "menu", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 14 + "setIdx": 0, + "setId": 1, + "iconIdx": 20 }, { "icon": { @@ -388,8 +547,10 @@ "tags": [ "location" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 7, "id": 16, @@ -398,8 +559,9 @@ "name": "location", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 15 + "setIdx": 0, + "setId": 1, + "iconIdx": 21 }, { "icon": { @@ -409,8 +571,10 @@ "tags": [ "list" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 8, "id": 15, @@ -419,8 +583,9 @@ "name": "list", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 16 + "setIdx": 0, + "setId": 1, + "iconIdx": 22 }, { "icon": { @@ -430,8 +595,10 @@ "tags": [ "info" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 9, "id": 14, @@ -440,8 +607,9 @@ "name": "info", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 17 + "setIdx": 0, + "setId": 1, + "iconIdx": 23 }, { "icon": { @@ -451,8 +619,10 @@ "tags": [ "grid" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 10, "id": 13, @@ -461,8 +631,9 @@ "name": "grid", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 18 + "setIdx": 0, + "setId": 1, + "iconIdx": 24 }, { "icon": { @@ -472,8 +643,10 @@ "tags": [ "minus" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 11, "id": 5, @@ -482,8 +655,9 @@ "name": "minus", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 19 + "setIdx": 0, + "setId": 1, + "iconIdx": 25 }, { "icon": { @@ -493,8 +667,10 @@ "tags": [ "checkmark" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 12, "id": 4, @@ -503,8 +679,9 @@ "name": "checkmark", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 20 + "setIdx": 0, + "setId": 1, + "iconIdx": 26 }, { "icon": { @@ -514,8 +691,10 @@ "tags": [ "cart" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 13, "id": 3, @@ -524,8 +703,9 @@ "name": "cart", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 21 + "setIdx": 0, + "setId": 1, + "iconIdx": 27 }, { "icon": { @@ -535,8 +715,10 @@ "tags": [ "calendar" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 14, "id": 2, @@ -545,8 +727,9 @@ "name": "calendar", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 22 + "setIdx": 0, + "setId": 1, + "iconIdx": 28 }, { "icon": { @@ -556,8 +739,10 @@ "tags": [ "arrow up" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 15, "id": 1, @@ -566,8 +751,9 @@ "name": "arrow-up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 23 + "setIdx": 0, + "setId": 1, + "iconIdx": 29 }, { "icon": { @@ -577,8 +763,10 @@ "tags": [ "arrow down" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 16, "id": 0, @@ -587,8 +775,9 @@ "name": "arrow-down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 24 + "setIdx": 0, + "setId": 1, + "iconIdx": 30 }, { "icon": { @@ -598,8 +787,10 @@ "tags": [ "search" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 17, "id": 25, @@ -608,8 +799,9 @@ "name": "search", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 25 + "setIdx": 0, + "setId": 1, + "iconIdx": 31 }, { "icon": { @@ -619,8 +811,10 @@ "tags": [ "remove" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 18, "id": 24, @@ -629,8 +823,9 @@ "name": "remove", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 26 + "setIdx": 0, + "setId": 1, + "iconIdx": 32 }, { "icon": { @@ -640,8 +835,10 @@ "tags": [ "prev" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 19, "id": 23, @@ -650,8 +847,9 @@ "name": "prev", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 27 + "setIdx": 0, + "setId": 1, + "iconIdx": 33 }, { "icon": { @@ -661,8 +859,10 @@ "tags": [ "pointer up" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 20, "id": 22, @@ -671,8 +871,9 @@ "name": "pointer-up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 28 + "setIdx": 0, + "setId": 1, + "iconIdx": 34 }, { "icon": { @@ -682,8 +883,10 @@ "tags": [ "pointer right" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 21, "id": 21, @@ -692,8 +895,9 @@ "name": "pointer-right", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 29 + "setIdx": 0, + "setId": 1, + "iconIdx": 35 }, { "icon": { @@ -703,8 +907,10 @@ "tags": [ "pointer left" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 22, "id": 20, @@ -713,8 +919,9 @@ "name": "pointer-left", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 30 + "setIdx": 0, + "setId": 1, + "iconIdx": 36 }, { "icon": { @@ -724,8 +931,10 @@ "tags": [ "flag" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 23, "id": 12, @@ -734,8 +943,9 @@ "name": "flag", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 31 + "setIdx": 0, + "setId": 1, + "iconIdx": 37 }, { "icon": { @@ -745,8 +955,10 @@ "tags": [ "expand" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 24, "id": 11, @@ -755,8 +967,9 @@ "name": "expand", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 32 + "setIdx": 0, + "setId": 1, + "iconIdx": 38 }, { "icon": { @@ -767,8 +980,10 @@ "tags": [ "envelope" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 25, "id": 10, @@ -777,8 +992,9 @@ "name": "envelope", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 33 + "setIdx": 0, + "setId": 1, + "iconIdx": 39 }, { "icon": { @@ -788,8 +1004,10 @@ "tags": [ "compare" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 26, "id": 9, @@ -798,8 +1016,9 @@ "name": "compare-full", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 34 + "setIdx": 0, + "setId": 1, + "iconIdx": 40 }, { "icon": { @@ -809,8 +1028,10 @@ "tags": [ "comment" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 27, "id": 7, @@ -819,8 +1040,9 @@ "name": "comment", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 35 + "setIdx": 0, + "setId": 1, + "iconIdx": 41 }, { "icon": { @@ -830,8 +1052,10 @@ "tags": [ "up" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 28, "id": 34, @@ -840,8 +1064,9 @@ "name": "up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 36 + "setIdx": 0, + "setId": 1, + "iconIdx": 42 }, { "icon": { @@ -851,8 +1076,10 @@ "tags": [ "down" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 29, "id": 33, @@ -861,8 +1088,9 @@ "name": "down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 37 + "setIdx": 0, + "setId": 1, + "iconIdx": 43 } ], "height": 1024, @@ -889,6 +1117,8 @@ "historySize": 100, "showCodes": true, "search": "", - "gridSize": 16 + "gridSize": 16, + "showQuickUse2": true, + "showSVGs": true } } \ No newline at end of file diff --git a/app/i18n/magento/de_de/composer.json b/app/i18n/magento/de_de/composer.json index 8792a746870334173328153bee80077157349745..752d5584e51535511fc382bd1edfad901affa4fd 100644 --- a/app/i18n/magento/de_de/composer.json +++ b/app/i18n/magento/de_de/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-de_de", "description": "German (Germany) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/en_us/composer.json b/app/i18n/magento/en_us/composer.json index 12f592f50bc7f6772183dc3e44a42ecb65fbfb05..4feb2ced23f3e909170d222c43410ff08edc5cd7 100644 --- a/app/i18n/magento/en_us/composer.json +++ b/app/i18n/magento/en_us/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-en_us", "description": "English (United States) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/es_es/composer.json b/app/i18n/magento/es_es/composer.json index eec09e8483fbe8846f06947d7d8fef60d284d0d0..c2a70d39babadc84b11b03652e750d590ffd15fa 100644 --- a/app/i18n/magento/es_es/composer.json +++ b/app/i18n/magento/es_es/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-es_es", "description": "Spanish (Spain) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/fr_fr/composer.json b/app/i18n/magento/fr_fr/composer.json index 7ff13b7e8f3aa58340613fe97806ecfcc1b174aa..b6c40d9c8fa9be5d193c4f81534ab9cf0bebdd89 100644 --- a/app/i18n/magento/fr_fr/composer.json +++ b/app/i18n/magento/fr_fr/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-fr_fr", "description": "French (France) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/nl_nl/composer.json b/app/i18n/magento/nl_nl/composer.json index af92cc0e22f2de55041a7b8d0f6973cfa7244e09..c905b708215fd32745c8c1313fca3649c31f4c7c 100644 --- a/app/i18n/magento/nl_nl/composer.json +++ b/app/i18n/magento/nl_nl/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-nl_nl", "description": "Dutch (Netherlands) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/pt_br/composer.json b/app/i18n/magento/pt_br/composer.json index ea475dfb76206af0453c1d37586d71107d2ea7bb..4f80afff03c0adbfab31185741fdb201c6391b50 100644 --- a/app/i18n/magento/pt_br/composer.json +++ b/app/i18n/magento/pt_br/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-pt_br", "description": "Portuguese (Brazil) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/zh_cn/composer.json b/app/i18n/magento/zh_cn/composer.json index fe43b44fcdc7f9e7a3f2b31fa64b08e5bee94b3b..63c14d0af900801962fcaa32f179cf375fa451f9 100644 --- a/app/i18n/magento/zh_cn/composer.json +++ b/app/i18n/magento/zh_cn/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-zh_cn", "description": "Chinese (China) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/composer.json b/composer.json index 94549cfd2878cbc97c0476f54c7a7f2d4f1b093f..2fca4d005a36670877caf6253c70e0bb38e92a90 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "magento/magento2ce", "description": "Magento 2 (Community Edition)", "type": "project", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/composer.lock b/composer.lock index 77a18945169153ccdfd51d970fdd2255c499d42b..4e3421ad6e05957d87c2807e67fe0152cbf10bac 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "daa84b5d3ea8eabcd1bb1f33c07e08dd", + "hash": "32f26595c37e07bb66613d23424788e0", "packages": [ { "name": "composer/composer", @@ -49,7 +49,7 @@ "Composer": "src/" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -261,7 +261,7 @@ "ZF1", "framework" ], - "time": "2015-06-02 08:04:41" + "time": "2015-02-06 17:25:45" }, { "name": "monolog/monolog", @@ -567,7 +567,7 @@ "Symfony\\Component\\Finder\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -616,7 +616,7 @@ "Symfony\\Component\\Process\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -684,12 +684,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-code.git", - "reference": "0ed94f842ba60cdc900c46a61bdbd7ac95a3e140" + "reference": "cfd5951ff4348e4430850560416c7ddb755f95d3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-code/zipball/0ed94f842ba60cdc900c46a61bdbd7ac95a3e140", - "reference": "0ed94f842ba60cdc900c46a61bdbd7ac95a3e140", + "reference": "cfd5951ff4348e4430850560416c7ddb755f95d3", "shasum": "" }, "require": { @@ -698,9 +698,6 @@ }, "require-dev": { "doctrine/common": ">=2.1", - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-stdlib": "self.version" }, "suggest": { @@ -716,7 +713,7 @@ }, "autoload": { "psr-4": { - "Zend\\Code\\": "src/" + "Zend\\Code\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -724,12 +721,12 @@ "BSD-3-Clause" ], "description": "provides facilities to generate arbitrary code using an object oriented interface", - "homepage": "https://github.com/zendframework/zend-code", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "code", "zf2" ], - "time": "2015-03-31 15:39:14" + "time": "2015-04-01 17:59:08" }, { "name": "zendframework/zend-config", @@ -737,12 +734,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-config.git", - "reference": "95f3a4b3fa85d49e6f060183122de4596fa6d29d" + "reference": "8682fe4e2923b383bb6472fc84b5796a07589163" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-config/zipball/95f3a4b3fa85d49e6f060183122de4596fa6d29d", - "reference": "95f3a4b3fa85d49e6f060183122de4596fa6d29d", + "reference": "8682fe4e2923b383bb6472fc84b5796a07589163", "shasum": "" }, "require": { @@ -750,9 +747,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-filter": "self.version", "zendframework/zend-i18n": "self.version", "zendframework/zend-json": "self.version", @@ -773,7 +767,7 @@ }, "autoload": { "psr-4": { - "Zend\\Config\\": "src/" + "Zend\\Config\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -781,12 +775,12 @@ "BSD-3-Clause" ], "description": "provides a nested object property based user interface for accessing this configuration data within application code", - "homepage": "https://github.com/zendframework/zend-config", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "config", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 17:59:31" }, { "name": "zendframework/zend-console", @@ -794,23 +788,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-console.git", - "reference": "54823d9ba6f8ce39046384ee5a043b5b3d5f56d7" + "reference": "94ab6663b07e19f20b3319ecf317bd72b6a72dca" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-console/zipball/54823d9ba6f8ce39046384ee5a043b5b3d5f56d7", - "reference": "54823d9ba6f8ce39046384ee5a043b5b3d5f56d7", + "reference": "94ab6663b07e19f20b3319ecf317bd72b6a72dca", "shasum": "" }, "require": { "php": ">=5.3.23", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "suggest": { "zendframework/zend-filter": "To support DefaultRouteMatcher usage", "zendframework/zend-validator": "To support DefaultRouteMatcher usage" @@ -824,19 +813,19 @@ }, "autoload": { "psr-4": { - "Zend\\Console\\": "src/" + "Zend\\Console\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-console", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "console", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 17:59:48" }, { "name": "zendframework/zend-di", @@ -844,12 +833,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-di.git", - "reference": "b9f8de081adecf71a003a569e9ba76c0a4c00bf2" + "reference": "0811f2a67ad0b50dfb8d602ed67cde0b82249190" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-di/zipball/b9f8de081adecf71a003a569e9ba76c0a4c00bf2", - "reference": "b9f8de081adecf71a003a569e9ba76c0a4c00bf2", + "reference": "0811f2a67ad0b50dfb8d602ed67cde0b82249190", "shasum": "" }, "require": { @@ -858,9 +847,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -875,19 +861,19 @@ }, "autoload": { "psr-4": { - "Zend\\Di\\": "src/" + "Zend\\Di\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-di", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "di", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:01:30" }, { "name": "zendframework/zend-escaper", @@ -895,22 +881,17 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-escaper.git", - "reference": "15e5769e4fcdb4bf07ebd76500810e7070e23a97" + "reference": "65b3328627362b0be1d5e9067bc846511d1fbc96" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-escaper/zipball/15e5769e4fcdb4bf07ebd76500810e7070e23a97", - "reference": "15e5769e4fcdb4bf07ebd76500810e7070e23a97", + "reference": "65b3328627362b0be1d5e9067bc846511d1fbc96", "shasum": "" }, "require": { "php": ">=5.3.23" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -920,19 +901,19 @@ }, "autoload": { "psr-4": { - "Zend\\Escaper\\": "src/" + "Zend\\Escaper\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-escaper", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "escaper", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:02:07" }, { "name": "zendframework/zend-eventmanager", @@ -940,23 +921,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "58d21c95c7005a527262fd536499195f104e83f9" + "reference": "38df5b567d4ff4d22144745c503ba0502d0d5695" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/58d21c95c7005a527262fd536499195f104e83f9", - "reference": "58d21c95c7005a527262fd536499195f104e83f9", + "reference": "38df5b567d4ff4d22144745c503ba0502d0d5695", "shasum": "" }, "require": { "php": ">=5.3.23", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -966,19 +942,19 @@ }, "autoload": { "psr-4": { - "Zend\\EventManager\\": "src/" + "Zend\\EventManager\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-event-manager", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "eventmanager", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:05:26" }, { "name": "zendframework/zend-filter", @@ -986,12 +962,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-filter.git", - "reference": "6d8aed2da81b62a04747346c4370562cdbe34595" + "reference": "b13741a88553351fc52472de529b57b580b8f6f1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/6d8aed2da81b62a04747346c4370562cdbe34595", - "reference": "6d8aed2da81b62a04747346c4370562cdbe34595", + "reference": "b13741a88553351fc52472de529b57b580b8f6f1", "shasum": "" }, "require": { @@ -999,9 +975,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-crypt": "self.version", "zendframework/zend-servicemanager": "self.version", "zendframework/zend-uri": "self.version" @@ -1021,7 +994,7 @@ }, "autoload": { "psr-4": { - "Zend\\Filter\\": "src/" + "Zend\\Filter\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1029,12 +1002,12 @@ "BSD-3-Clause" ], "description": "provides a set of commonly needed data filters", - "homepage": "https://github.com/zendframework/zend-filter", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "filter", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:25" }, { "name": "zendframework/zend-form", @@ -1042,12 +1015,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-form.git", - "reference": "bca0db55718355d25c2c10fdd41a83561f1c94b3" + "reference": "09f5bd46ffbf783df22281898e2175b291bd43a3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-form/zipball/bca0db55718355d25c2c10fdd41a83561f1c94b3", - "reference": "bca0db55718355d25c2c10fdd41a83561f1c94b3", + "reference": "09f5bd46ffbf783df22281898e2175b291bd43a3", "shasum": "" }, "require": { @@ -1056,9 +1029,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-captcha": "self.version", "zendframework/zend-code": "self.version", "zendframework/zend-eventmanager": "self.version", @@ -1089,19 +1059,19 @@ }, "autoload": { "psr-4": { - "Zend\\Form\\": "src/" + "Zend\\Form\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-form", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "form", "zf2" ], - "time": "2015-03-28 20:29:18" + "time": "2015-04-01 18:09:25" }, { "name": "zendframework/zend-http", @@ -1109,12 +1079,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-http.git", - "reference": "9c6047a0bdb3094d3ea07a215ff929cc47de4deb" + "reference": "ee6220609845b32d1b2873c9ac694aef56d508f5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-http/zipball/9c6047a0bdb3094d3ea07a215ff929cc47de4deb", - "reference": "9c6047a0bdb3094d3ea07a215ff929cc47de4deb", + "reference": "ee6220609845b32d1b2873c9ac694aef56d508f5", "shasum": "" }, "require": { @@ -1124,11 +1094,6 @@ "zendframework/zend-uri": "self.version", "zendframework/zend-validator": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1138,7 +1103,7 @@ }, "autoload": { "psr-4": { - "Zend\\Http\\": "src/" + "Zend\\Http\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1146,12 +1111,12 @@ "BSD-3-Clause" ], "description": "provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", - "homepage": "https://github.com/zendframework/zend-http", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "http", "zf2" ], - "time": "2015-03-27 15:46:30" + "time": "2015-04-01 18:09:25" }, { "name": "zendframework/zend-i18n", @@ -1159,12 +1124,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-i18n.git", - "reference": "9aebc5287373a802540d75fe5508417f866c2e52" + "reference": "33051775d9a8c341fe3b77d1f3daa0e921e2f4bd" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/9aebc5287373a802540d75fe5508417f866c2e52", - "reference": "9aebc5287373a802540d75fe5508417f866c2e52", + "reference": "33051775d9a8c341fe3b77d1f3daa0e921e2f4bd", "shasum": "" }, "require": { @@ -1172,9 +1137,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-cache": "self.version", "zendframework/zend-config": "self.version", "zendframework/zend-eventmanager": "self.version", @@ -1203,19 +1165,19 @@ }, "autoload": { "psr-4": { - "Zend\\I18n\\": "src/" + "Zend\\I18n\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-i18n", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "i18n", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-inputfilter", @@ -1223,12 +1185,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-inputfilter.git", - "reference": "4b1398f3635fae3cc5e873c5bb067274f3d10a93" + "reference": "16856fec61f285e41e5492235220a4dec06ab90f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-inputfilter/zipball/4b1398f3635fae3cc5e873c5bb067274f3d10a93", - "reference": "4b1398f3635fae3cc5e873c5bb067274f3d10a93", + "reference": "16856fec61f285e41e5492235220a4dec06ab90f", "shasum": "" }, "require": { @@ -1238,9 +1200,6 @@ "zendframework/zend-validator": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -1255,19 +1214,19 @@ }, "autoload": { "psr-4": { - "Zend\\InputFilter\\": "src/" + "Zend\\InputFilter\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-input-filter", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "inputfilter", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-json", @@ -1275,12 +1234,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-json.git", - "reference": "2d845e151c1b9a237cf1899ac31e17fb10bd1e3f" + "reference": "76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-json/zipball/2d845e151c1b9a237cf1899ac31e17fb10bd1e3f", - "reference": "2d845e151c1b9a237cf1899ac31e17fb10bd1e3f", + "reference": "76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c", "shasum": "" }, "require": { @@ -1288,9 +1247,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-http": "self.version", "zendframework/zend-server": "self.version" }, @@ -1308,7 +1264,7 @@ }, "autoload": { "psr-4": { - "Zend\\Json\\": "src/" + "Zend\\Json\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1316,12 +1272,12 @@ "BSD-3-Clause" ], "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", - "homepage": "https://github.com/zendframework/zend-json", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "json", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-loader", @@ -1329,22 +1285,17 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-loader.git", - "reference": "65de2c7a56f8eee633c6bf1cfab73e45648880d4" + "reference": "6868b8a0c346f17fb97724c3a63aa2cbf6b94865" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-loader/zipball/65de2c7a56f8eee633c6bf1cfab73e45648880d4", - "reference": "65de2c7a56f8eee633c6bf1cfab73e45648880d4", + "reference": "6868b8a0c346f17fb97724c3a63aa2cbf6b94865", "shasum": "" }, "require": { "php": ">=5.3.23" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1354,19 +1305,19 @@ }, "autoload": { "psr-4": { - "Zend\\Loader\\": "src/" + "Zend\\Loader\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-loader", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "loader", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-log", @@ -1374,12 +1325,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-log.git", - "reference": "002e3c810cad7e31e51c9895e9e3cb6fbd312cdd" + "reference": "2d5d20fd45470506bdaff727c46dc25fe953146e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-log/zipball/002e3c810cad7e31e51c9895e9e3cb6fbd312cdd", - "reference": "002e3c810cad7e31e51c9895e9e3cb6fbd312cdd", + "reference": "2d5d20fd45470506bdaff727c46dc25fe953146e", "shasum": "" }, "require": { @@ -1388,9 +1339,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-console": "self.version", "zendframework/zend-db": "self.version", "zendframework/zend-escaper": "self.version", @@ -1414,7 +1362,7 @@ }, "autoload": { "psr-4": { - "Zend\\Log\\": "src/" + "Zend\\Log\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1422,13 +1370,13 @@ "BSD-3-Clause" ], "description": "component for general purpose logging", - "homepage": "https://github.com/zendframework/zend-log", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "log", "logging", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-math", @@ -1436,22 +1384,17 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-math.git", - "reference": "f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73" + "reference": "634123f83ca90b6613f132d0d100e6b5e9890a29" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-math/zipball/f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73", - "reference": "f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73", + "reference": "634123f83ca90b6613f132d0d100e6b5e9890a29", "shasum": "" }, "require": { "php": ">=5.3.23" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "suggest": { "ext-bcmath": "If using the bcmath functionality", "ext-gmp": "If using the gmp functionality", @@ -1467,19 +1410,19 @@ }, "autoload": { "psr-4": { - "Zend\\Math\\": "src/" + "Zend\\Math\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-math", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "math", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:27" }, { "name": "zendframework/zend-modulemanager", @@ -1487,12 +1430,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-modulemanager.git", - "reference": "af7ae3cd29a1efb73cc66ae1081e606039d5c20f" + "reference": "cbe16b0eafe734a062ed0182381e64b9c953dccf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-modulemanager/zipball/af7ae3cd29a1efb73cc66ae1081e606039d5c20f", - "reference": "af7ae3cd29a1efb73cc66ae1081e606039d5c20f", + "reference": "cbe16b0eafe734a062ed0182381e64b9c953dccf", "shasum": "" }, "require": { @@ -1501,9 +1444,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-config": "self.version", "zendframework/zend-console": "self.version", "zendframework/zend-loader": "self.version", @@ -1525,19 +1465,19 @@ }, "autoload": { "psr-4": { - "Zend\\ModuleManager\\": "src/" + "Zend\\ModuleManager\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-module-manager", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "modulemanager", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:27" }, { "name": "zendframework/zend-mvc", @@ -1545,12 +1485,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-mvc.git", - "reference": "0b4a4a829b30be510a3f215c4ff00c703ee8b431" + "reference": "bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-mvc/zipball/0b4a4a829b30be510a3f215c4ff00c703ee8b431", - "reference": "0b4a4a829b30be510a3f215c4ff00c703ee8b431", + "reference": "bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412", "shasum": "" }, "require": { @@ -1561,9 +1501,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-authentication": "self.version", "zendframework/zend-console": "self.version", "zendframework/zend-di": "self.version", @@ -1612,19 +1549,19 @@ }, "autoload": { "psr-4": { - "Zend\\Mvc\\": "src/" + "Zend\\Mvc\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-mvc", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "mvc", "zf2" ], - "time": "2015-03-26 18:55:14" + "time": "2015-04-01 18:09:27" }, { "name": "zendframework/zend-serializer", @@ -1632,12 +1569,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-serializer.git", - "reference": "3c531789a9882a5deb721356a7bd2642b65d4b09" + "reference": "a46960854d6326f0036d98c9abc7a79e36e25928" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/3c531789a9882a5deb721356a7bd2642b65d4b09", - "reference": "3c531789a9882a5deb721356a7bd2642b65d4b09", + "reference": "a46960854d6326f0036d98c9abc7a79e36e25928", "shasum": "" }, "require": { @@ -1647,9 +1584,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -1664,7 +1598,7 @@ }, "autoload": { "psr-4": { - "Zend\\Serializer\\": "src/" + "Zend\\Serializer\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1672,12 +1606,12 @@ "BSD-3-Clause" ], "description": "provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover", - "homepage": "https://github.com/zendframework/zend-serializer", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "serializer", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:28" }, { "name": "zendframework/zend-server", @@ -1685,12 +1619,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-server.git", - "reference": "d11ff0bd529d202022823d4accf5983cbd50fc49" + "reference": "fc73c34490908ba143af3c57c7e166b40c4b9f8e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-server/zipball/d11ff0bd529d202022823d4accf5983cbd50fc49", - "reference": "d11ff0bd529d202022823d4accf5983cbd50fc49", + "reference": "fc73c34490908ba143af3c57c7e166b40c4b9f8e", "shasum": "" }, "require": { @@ -1698,11 +1632,6 @@ "zendframework/zend-code": "self.version", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1712,19 +1641,19 @@ }, "autoload": { "psr-4": { - "Zend\\Server\\": "src/" + "Zend\\Server\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-server", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "server", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:28" }, { "name": "zendframework/zend-servicemanager", @@ -1732,21 +1661,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-servicemanager.git", - "reference": "57cf99fa5ac08c05a135a8d0d676c52a5e450083" + "reference": "d3c27c708a148a30608f313a5b7a61a531bd9cb9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/57cf99fa5ac08c05a135a8d0d676c52a5e450083", - "reference": "57cf99fa5ac08c05a135a8d0d676c52a5e450083", + "reference": "d3c27c708a148a30608f313a5b7a61a531bd9cb9", "shasum": "" }, "require": { "php": ">=5.3.23" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-di": "self.version" }, "suggest": { @@ -1762,19 +1688,19 @@ }, "autoload": { "psr-4": { - "Zend\\ServiceManager\\": "src/" + "Zend\\ServiceManager\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-service-manager", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "servicemanager", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:28" }, { "name": "zendframework/zend-soap", @@ -1782,12 +1708,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-soap.git", - "reference": "a599463aba97ce247faf3fb443e3c7858b46449b" + "reference": "e42b900798ea95a9063fa4922da976d8b3a8ab6f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-soap/zipball/a599463aba97ce247faf3fb443e3c7858b46449b", - "reference": "a599463aba97ce247faf3fb443e3c7858b46449b", + "reference": "e42b900798ea95a9063fa4922da976d8b3a8ab6f", "shasum": "" }, "require": { @@ -1797,9 +1723,6 @@ "zendframework/zend-uri": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-http": "self.version" }, "suggest": { @@ -1814,19 +1737,19 @@ }, "autoload": { "psr-4": { - "Zend\\Soap\\": "src/" + "Zend\\Soap\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-soap", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "soap", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-stdlib", @@ -1834,21 +1757,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-stdlib.git", - "reference": "cf05c5ba75606e47ffee91cedc72778da46f74c3" + "reference": "eab586f4c18af3fa63c977611939f1f4a3cf1030" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/cf05c5ba75606e47ffee91cedc72778da46f74c3", - "reference": "cf05c5ba75606e47ffee91cedc72778da46f74c3", + "reference": "eab586f4c18af3fa63c977611939f1f4a3cf1030", "shasum": "" }, "require": { "php": ">=5.3.23" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-eventmanager": "self.version", "zendframework/zend-filter": "self.version", "zendframework/zend-serializer": "self.version", @@ -1869,19 +1789,19 @@ }, "autoload": { "psr-4": { - "Zend\\Stdlib\\": "src/" + "Zend\\Stdlib\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-stdlib", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "stdlib", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-text", @@ -1889,12 +1809,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-text.git", - "reference": "d962ea25647b20527f3ca34ae225bbc885dabfc7" + "reference": "35f519e20e575a331c2ee554e5a555a59ce4b9e2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-text/zipball/d962ea25647b20527f3ca34ae225bbc885dabfc7", - "reference": "d962ea25647b20527f3ca34ae225bbc885dabfc7", + "reference": "35f519e20e575a331c2ee554e5a555a59ce4b9e2", "shasum": "" }, "require": { @@ -1902,11 +1822,6 @@ "zendframework/zend-servicemanager": "self.version", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1916,19 +1831,19 @@ }, "autoload": { "psr-4": { - "Zend\\Text\\": "src/" + "Zend\\Text\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-text", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "text", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-uri", @@ -1936,12 +1851,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-uri.git", - "reference": "bd9e625639415376f6a82551c73328448d7bc7d1" + "reference": "53f5b162b293f80de8b951eece8e08be83c4fe16" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-uri/zipball/bd9e625639415376f6a82551c73328448d7bc7d1", - "reference": "bd9e625639415376f6a82551c73328448d7bc7d1", + "reference": "53f5b162b293f80de8b951eece8e08be83c4fe16", "shasum": "" }, "require": { @@ -1949,11 +1864,6 @@ "zendframework/zend-escaper": "self.version", "zendframework/zend-validator": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1963,7 +1873,7 @@ }, "autoload": { "psr-4": { - "Zend\\Uri\\": "src/" + "Zend\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1971,12 +1881,12 @@ "BSD-3-Clause" ], "description": "a component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", - "homepage": "https://github.com/zendframework/zend-uri", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "uri", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-validator", @@ -1984,12 +1894,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-validator.git", - "reference": "45fac2545a0f2eb66d71cb7966feee481e7c475f" + "reference": "eb678d20256f120a72ca27276bbb2875841701ab" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-validator/zipball/45fac2545a0f2eb66d71cb7966feee481e7c475f", - "reference": "45fac2545a0f2eb66d71cb7966feee481e7c475f", + "reference": "eb678d20256f120a72ca27276bbb2875841701ab", "shasum": "" }, "require": { @@ -1997,9 +1907,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-db": "self.version", "zendframework/zend-filter": "self.version", "zendframework/zend-i18n": "self.version", @@ -2027,7 +1934,7 @@ }, "autoload": { "psr-4": { - "Zend\\Validator\\": "src/" + "Zend\\Validator\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -2035,12 +1942,12 @@ "BSD-3-Clause" ], "description": "provides a set of commonly needed validators", - "homepage": "https://github.com/zendframework/zend-validator", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "validator", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:30" }, { "name": "zendframework/zend-view", @@ -2048,12 +1955,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-view.git", - "reference": "37beb1ad46e530f627b4b6c3716efd728e976ba9" + "reference": "e119b4b5f082af58a96eb206e782b62c193227bf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-view/zipball/37beb1ad46e530f627b4b6c3716efd728e976ba9", - "reference": "37beb1ad46e530f627b4b6c3716efd728e976ba9", + "reference": "e119b4b5f082af58a96eb206e782b62c193227bf", "shasum": "" }, "require": { @@ -2063,9 +1970,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-authentication": "self.version", "zendframework/zend-escaper": "self.version", "zendframework/zend-feed": "self.version", @@ -2104,7 +2008,7 @@ }, "autoload": { "psr-4": { - "Zend\\View\\": "src/" + "Zend\\View\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -2112,12 +2016,12 @@ "BSD-3-Clause" ], "description": "provides a system of helpers, output filters, and variable escaping", - "homepage": "https://github.com/zendframework/zend-view", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "view", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:30" } ], "packages-dev": [ @@ -2789,7 +2693,7 @@ "src/" ] }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3288,7 +3192,7 @@ "Symfony\\Component\\Config\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -3348,7 +3252,7 @@ "Symfony\\Component\\DependencyInjection\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -3406,7 +3310,7 @@ "Symfony\\Component\\EventDispatcher\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -3455,7 +3359,7 @@ "Symfony\\Component\\Filesystem\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -3504,7 +3408,7 @@ "Symfony\\Component\\Stopwatch\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -3553,7 +3457,7 @@ "Symfony\\Component\\Yaml\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], diff --git a/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php b/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php index f8ef77f8e297b3bdf6a41c501c70adb40d31db99..0f49b8bef0ae3f56dfff91db4c9ae8cc25f371c4 100644 --- a/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php +++ b/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php @@ -29,7 +29,12 @@ class StockItemTest extends WebapiAbstract /** * Resource path */ - const RESOURCE_PATH = '/V1/stockItems'; + const RESOURCE_GET_PATH = '/V1/stockItems'; + + /** + * Resource path + */ + const RESOURCE_PUT_PATH = '/V1/products/:productSku/stockItems/:itemId'; /** @var \Magento\Catalog\Model\Resource\Product\Collection */ protected $productCollection; @@ -73,7 +78,7 @@ class StockItemTest extends WebapiAbstract $productSku = 'simple1'; $serviceInfo = [ 'rest' => [ - 'resourcePath' => self::RESOURCE_PATH . "/$productSku", + 'resourcePath' => self::RESOURCE_GET_PATH . "/$productSku", 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, ], 'soap' => [ @@ -100,9 +105,13 @@ class StockItemTest extends WebapiAbstract { $stockItemOld = $this->getStockItemBySku($fixtureData); $productSku = 'simple1'; + $itemId = $stockItemOld['item_id']; + + $resourcePath = str_replace([':productSku', ':itemId'], [$productSku, $itemId], self::RESOURCE_PUT_PATH); + $serviceInfo = [ 'rest' => [ - 'resourcePath' => self::RESOURCE_PATH . "/$productSku", + 'resourcePath' => $resourcePath, 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT, ], 'soap' => [ diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php index 2779a7f88a11bb648a963962033bb28cd7341f74..25731e25eb92fb18463be4388b47a6678f6d4971 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php @@ -3,9 +3,10 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\GiftMessage\Api; +// @codingStandardsIgnoreFile + use Magento\TestFramework\TestCase\WebapiAbstract; class CartRepositoryTest extends WebapiAbstract @@ -26,6 +27,8 @@ class CartRepositoryTest extends WebapiAbstract /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled */ public function testGet() { @@ -60,6 +63,42 @@ class CartRepositoryTest extends WebapiAbstract $this->assertEquals($expectedMessage, $resultMessage); } + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_customer_and_message.php + */ + public function testGetForMyCart() + { + $this->_markTestAsRestOnly(); + + // get customer ID token + /** @var \Magento\Integration\Api\CustomerTokenServiceInterface $customerTokenService */ + $customerTokenService = $this->objectManager->create( + 'Magento\Integration\Api\CustomerTokenServiceInterface' + ); + $token = $customerTokenService->createCustomerAccessToken('customer@example.com', 'password'); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . 'mine/gift-message', + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + 'token' => $token, + ], + ]; + + $expectedMessage = [ + 'recipient' => 'Mercutio', + 'sender' => 'Romeo', + 'message' => 'I thought all for the best.', + ]; + + $requestData = []; + $resultMessage = $this->_webApiCall($serviceInfo, $requestData); + $this->assertCount(5, $resultMessage); + unset($resultMessage['gift_message_id']); + unset($resultMessage['customer_id']); + $this->assertEquals($expectedMessage, $resultMessage); + } + /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php */ @@ -102,4 +141,50 @@ class CartRepositoryTest extends WebapiAbstract $this->assertEquals('Jane Roe', $message->getSender()); $this->assertEquals('Gift Message Text New', $message->getMessage()); } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + */ + public function testSaveForMyCart() + { + $this->_markTestAsRestOnly(); + + // get customer ID token + /** @var \Magento\Integration\Api\CustomerTokenServiceInterface $customerTokenService */ + $customerTokenService = $this->objectManager->create( + 'Magento\Integration\Api\CustomerTokenServiceInterface' + ); + $token = $customerTokenService->createCustomerAccessToken('customer@example.com', 'password'); + + // sales/gift_options/allow_order must be set to 1 in system configuration + // @todo remove next statement when \Magento\TestFramework\TestCase\WebapiAbstract::_updateAppConfig is fixed + $this->markTestIncomplete('This test relies on system configuration state.'); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . 'mine/gift-message', + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, + 'token' => $token, + ], + ]; + + $requestData = [ + 'giftMessage' => [ + 'recipient' => 'John Doe', + 'sender' => 'Jane Roe', + 'message' => 'Gift Message Text New', + ], + ]; + $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); + + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $quote->getGiftMessageId(); + /** @var \Magento\GiftMessage\Model\Message $message */ + $message = $this->objectManager->create('Magento\GiftMessage\Model\Message')->load($quote->getGiftMessageId()); + $this->assertEquals('John Doe', $message->getRecipient()); + $this->assertEquals('Jane Roe', $message->getSender()); + $this->assertEquals('Gift Message Text New', $message->getMessage()); + } } diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2d2da9d2ff9a6ccc7a139787152be21671897341 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php @@ -0,0 +1,122 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Api; + +// @codingStandardsIgnoreFile + +use Magento\TestFramework\TestCase\WebapiAbstract; + +class GuestCartRepositoryTest extends WebapiAbstract +{ + const SERVICE_VERSION = 'V1'; + const SERVICE_NAME = 'giftMessageGuestCartRepositoryV1'; + const RESOURCE_PATH = '/V1/guest-carts/'; + + /** + * @var \Magento\TestFramework\ObjectManager + */ + protected $objectManager; + + protected function setUp() + { + $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled + */ + public function testGet() + { + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('message_order_21', 'reserved_order_id'); + $cartId = $quote->getId(); + /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ + $quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); + $quoteIdMask->load($cartId, 'quote_id'); + //Use masked cart Id + $cartId = $quoteIdMask->getMaskedId(); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . $cartId . '/gift-message', + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + ], + 'soap' => [ + 'service' => self::SERVICE_NAME, + 'serviceVersion' => self::SERVICE_VERSION, + 'operation' => self::SERVICE_NAME . 'Get', + ], + ]; + + $expectedMessage = [ + 'recipient' => 'Mercutio', + 'sender' => 'Romeo', + 'message' => 'I thought all for the best.', + ]; + + $requestData = ["cartId" => $cartId]; + $resultMessage = $this->_webApiCall($serviceInfo, $requestData); + $this->assertCount(5, $resultMessage); + unset($resultMessage['gift_message_id']); + unset($resultMessage['customer_id']); + $this->assertEquals($expectedMessage, $resultMessage); + } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + */ + public function testSave() + { + // sales/gift_options/allow_order must be set to 1 in system configuration + // @todo remove next statement when \Magento\TestFramework\TestCase\WebapiAbstract::_updateAppConfig is fixed + $this->markTestIncomplete('This test relies on system configuration state.'); + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $cartId = $quote->getId(); + /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ + $quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); + $quoteIdMask->load($cartId, 'quote_id'); + //Use masked cart Id + $cartId = $quoteIdMask->getMaskedId(); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . $cartId . '/gift-message', + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, + ], + 'soap' => [ + 'service' => self::SERVICE_NAME, + 'serviceVersion' => self::SERVICE_VERSION, + 'operation' => self::SERVICE_NAME . 'Save', + ], + ]; + + $requestData = [ + 'cartId' => $cartId, + 'giftMessage' => [ + 'recipient' => 'John Doe', + 'sender' => 'Jane Roe', + 'message' => 'Gift Message Text New', + ], + ]; + $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $quote->getGiftMessageId(); + /** @var \Magento\GiftMessage\Model\Message $message */ + $message = $this->objectManager->create('Magento\GiftMessage\Model\Message')->load($quote->getGiftMessageId()); + $this->assertEquals('John Doe', $message->getRecipient()); + $this->assertEquals('Jane Roe', $message->getSender()); + $this->assertEquals('Gift Message Text New', $message->getMessage()); + } +} diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..c749c3b39eeca5c3858f1b52b7eab71e309067e7 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php @@ -0,0 +1,130 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Api; + +// @codingStandardsIgnoreFile + +use Magento\TestFramework\TestCase\WebapiAbstract; + +class GuestItemRepositoryTest extends WebapiAbstract +{ + const SERVICE_VERSION = 'V1'; + const SERVICE_NAME = 'giftMessageGuestItemRepositoryV1'; + const RESOURCE_PATH = '/V1/guest-carts/'; + + /** + * @var \Magento\TestFramework\ObjectManager + */ + protected $objectManager; + + protected function setUp() + { + $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled + */ + public function testGet() + { + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $product = $this->objectManager->create('Magento\Catalog\Model\Product'); + $product->load($product->getIdBySku('simple_with_message')); + $itemId = $quote->getItemByProduct($product)->getId(); + /** @var \Magento\Catalog\Model\Product $product */ + $cartId = $quote->getId(); + /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ + $quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); + $quoteIdMask->load($cartId, 'quote_id'); + //Use masked cart Id + $cartId = $quoteIdMask->getMaskedId(); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . $cartId . '/gift-message/' . $itemId, + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + ], + 'soap' => [ + 'service' => self::SERVICE_NAME, + 'serviceVersion' => self::SERVICE_VERSION, + 'operation' => self::SERVICE_NAME . 'Get', + ], + ]; + + $expectedMessage = [ + 'recipient' => 'Jane Roe', + 'sender' => 'John Doe', + 'message' => 'Gift Message Text', + ]; + + $requestData = ["cartId" => $cartId, "itemId" => $itemId]; + $resultMessage = $this->_webApiCall($serviceInfo, $requestData); + $this->assertCount(5, $resultMessage); + unset($resultMessage['gift_message_id']); + unset($resultMessage['customer_id']); + $this->assertEquals($expectedMessage, $resultMessage); + } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + */ + public function testSave() + { + // sales/gift_options/allow_items must be set to 1 in system configuration + // @todo remove next statement when \Magento\TestFramework\TestCase\WebapiAbstract::_updateAppConfig is fixed + $this->markTestIncomplete('This test relies on system configuration state.'); + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $product = $this->objectManager->create('Magento\Catalog\Model\Product'); + $product->load($product->getIdBySku('simple_with_message')); + $itemId = $quote->getItemByProduct($product)->getId(); + $cartId = $quote->getId(); + /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ + $quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); + $quoteIdMask->load($cartId, 'quote_id'); + //Use masked cart Id + $cartId = $quoteIdMask->getMaskedId(); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . $cartId . '/gift-message/' . $itemId, + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, + ], + 'soap' => [ + 'service' => self::SERVICE_NAME, + 'serviceVersion' => self::SERVICE_VERSION, + 'operation' => self::SERVICE_NAME . 'Save', + ], + ]; + + $requestData = [ + 'cartId' => $cartId, + 'itemId' => $itemId, + 'giftMessage' => [ + 'recipient' => 'John Doe', + 'sender' => 'Jane Roe', + 'message' => 'Gift Message Text New', + ], + ]; + $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); +// $quote->load('test_order_item_with_message', 'reserved_order_id'); + $messageId = $quote->getItemByProduct($product)->getGiftMessageId(); + /** @var \Magento\GiftMessage\Model\Message $message */ + $message = $this->objectManager->create('Magento\GiftMessage\Model\Message')->load($messageId); + $this->assertEquals('John Doe', $message->getRecipient()); + $this->assertEquals('Jane Roe', $message->getSender()); + $this->assertEquals('Gift Message Text New', $message->getMessage()); + } +} diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php index 3673cb930e82da642a39cdbfded396f829bc1b4a..2dbc24cb67a17afde0f586df5ddab0f3a382aba3 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php @@ -3,11 +3,10 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ +namespace Magento\GiftMessage\Api; // @codingStandardsIgnoreFile -namespace Magento\GiftMessage\Api; - use Magento\TestFramework\TestCase\WebapiAbstract; class ItemRepositoryTest extends WebapiAbstract @@ -28,6 +27,8 @@ class ItemRepositoryTest extends WebapiAbstract /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled */ public function testGet() { @@ -65,6 +66,49 @@ class ItemRepositoryTest extends WebapiAbstract $this->assertEquals($expectedMessage, $resultMessage); } + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + */ + public function testGetForMyCart() + { + $this->_markTestAsRestOnly(); + + // get customer ID token + /** @var \Magento\Integration\Api\CustomerTokenServiceInterface $customerTokenService */ + $customerTokenService = $this->objectManager->create( + 'Magento\Integration\Api\CustomerTokenServiceInterface' + ); + $token = $customerTokenService->createCustomerAccessToken('customer@example.com', 'password'); + + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $product = $this->objectManager->create('Magento\Catalog\Model\Product'); + $product->load($product->getIdBySku('simple_with_message')); + $itemId = $quote->getItemByProduct($product)->getId(); + /** @var \Magento\Catalog\Model\Product $product */ + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . 'mine/gift-message/' . $itemId, + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + 'token' => $token, + ], + ]; + + $expectedMessage = [ + 'recipient' => 'Jane Roe', + 'sender' => 'John Doe', + 'message' => 'Gift Message Text', + ]; + + $requestData = ["itemId" => $itemId]; + $resultMessage = $this->_webApiCall($serviceInfo, $requestData); + $this->assertCount(5, $resultMessage); + unset($resultMessage['gift_message_id']); + unset($resultMessage['customer_id']); + $this->assertEquals($expectedMessage, $resultMessage); + } + /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php */ @@ -102,6 +146,55 @@ class ItemRepositoryTest extends WebapiAbstract ], ]; $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); +// $quote->load('test_order_item_with_message', 'reserved_order_id'); + $messageId = $quote->getItemByProduct($product)->getGiftMessageId(); + /** @var \Magento\GiftMessage\Model\Message $message */ + $message = $this->objectManager->create('Magento\GiftMessage\Model\Message')->load($messageId); + $this->assertEquals('John Doe', $message->getRecipient()); + $this->assertEquals('Jane Roe', $message->getSender()); + $this->assertEquals('Gift Message Text New', $message->getMessage()); + } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + */ + public function testSaveForMyCart() + { + $this->_markTestAsRestOnly(); + + // get customer ID token + /** @var \Magento\Integration\Api\CustomerTokenServiceInterface $customerTokenService */ + $customerTokenService = $this->objectManager->create( + 'Magento\Integration\Api\CustomerTokenServiceInterface' + ); + $token = $customerTokenService->createCustomerAccessToken('customer@example.com', 'password'); + + // sales/gift_options/allow_items must be set to 1 in system configuration + // @todo remove next statement when \Magento\TestFramework\TestCase\WebapiAbstract::_updateAppConfig is fixed + $this->markTestIncomplete('This test relies on system configuration state.'); + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $product = $this->objectManager->create('Magento\Catalog\Model\Product'); + $product->load($product->getIdBySku('simple_with_message')); + $itemId = $quote->getItemByProduct($product)->getId(); + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . 'mine/gift-message/' . $itemId, + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, + 'token' => $token, + ], + ]; + + $requestData = [ + 'itemId' => $itemId, + 'giftMessage' => [ + 'recipient' => 'John Doe', + 'sender' => 'Jane Roe', + 'message' => 'Gift Message Text New', + ], + ]; + $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); // $quote->load('test_order_item_with_message', 'reserved_order_id'); $messageId = $quote->getItemByProduct($product)->getGiftMessageId(); /** @var \Magento\GiftMessage\Model\Message $message */ diff --git a/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php b/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php index 5e31104da1607a3d8da4b3e1dd3f497138b58796..993a369782eca345eb717089573788b800f548e2 100644 --- a/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php @@ -13,6 +13,7 @@ use Magento\TestFramework\Helper\Bootstrap; use Magento\TestFramework\TestCase\WebapiAbstract; use Magento\User\Model\User as UserModel; use Magento\Framework\Webapi\Exception as HTTPExceptionCodes; +use Magento\Integration\Model\Resource\Oauth\Token\CollectionFactory; /** * api-functional test for \Magento\Integration\Model\CustomerTokenService. @@ -35,9 +36,9 @@ class CustomerTokenServiceTest extends WebapiAbstract private $customerAccountManagement; /** - * @var TokenModel + * @var CollectionFactory */ - private $tokenModel; + private $tokenCollection; /** * @var UserModel @@ -54,7 +55,10 @@ class CustomerTokenServiceTest extends WebapiAbstract $this->customerAccountManagement = Bootstrap::getObjectManager()->get( 'Magento\Customer\Api\AccountManagementInterface' ); - $this->tokenModel = Bootstrap::getObjectManager()->get('Magento\Integration\Model\Oauth\Token'); + $tokenCollectionFactory = Bootstrap::getObjectManager()->get( + 'Magento\Integration\Model\Resource\Oauth\Token\CollectionFactory' + ); + $this->tokenCollection = $tokenCollectionFactory->create(); $this->userModel = Bootstrap::getObjectManager()->get('Magento\User\Model\User'); } @@ -65,6 +69,7 @@ class CustomerTokenServiceTest extends WebapiAbstract { $customerUserName = 'customer@example.com'; $password = 'password'; + $isTokenCorrect = false; $serviceInfo = [ 'rest' => [ @@ -76,9 +81,17 @@ class CustomerTokenServiceTest extends WebapiAbstract $accessToken = $this->_webApiCall($serviceInfo, $requestData); $customerData = $this->customerAccountManagement->authenticate($customerUserName, $password); - /** @var $token TokenModel */ - $token = $this->tokenModel->loadByCustomerId($customerData->getId())->getToken(); - $this->assertEquals($accessToken, $token); + + /** @var $this->tokenCollection \Magento\Integration\Model\Resource\Oauth\Token\Collection */ + $this->tokenCollection->addFilterByCustomerId($customerData->getId()); + + foreach ($this->tokenCollection->getItems() as $item) { + /** @var $item TokenModel */ + if ($item->getToken() == $accessToken) { + $isTokenCorrect = true; + } + } + $this->assertTrue($isTokenCorrect); } /** diff --git a/dev/tests/functional/composer.json b/dev/tests/functional/composer.json index 8ce924bd190d77c558cedd1ff4a7f04b83af3df5..ca4b3bc7f79e43c04109d7162163832f89340ec8 100644 --- a/dev/tests/functional/composer.json +++ b/dev/tests/functional/composer.json @@ -1,6 +1,6 @@ { "require": { - "magento/mtf": "1.0.0-rc26", + "magento/mtf": "1.0.0-rc27", "php": "~5.5.0|~5.6.0", "phpunit/phpunit": "4.1.0", "phpunit/phpunit-selenium": ">=1.2", diff --git a/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php b/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php index e1bcbd54580d6daa2bd2eac1a39657b8dd7c8f24..50307147313fa52285d237b6637cb22244f546a6 100644 --- a/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php +++ b/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php @@ -14,11 +14,6 @@ use Magento\Mtf\Client\ElementInterface; */ class GlobalsearchElement extends SimpleElement { - /** - * "Backspace" key code. - */ - const BACKSPACE = "\xEE\x80\x83"; - /** * Search icon selector. * @@ -63,43 +58,14 @@ class GlobalsearchElement extends SimpleElement public function setValue($value) { $this->eventManager->dispatchEvent(['set_value'], [__METHOD__, $this->getAbsoluteSelector()]); - $this->waitInitElement(); - if (!$this->find($this->searchInput)->isVisible()) { $this->find($this->searchIcon)->click(); } - $this->selectWindow(); - $this->clear(); - $this->find($this->searchInput)->setValue($value); - $this->selectWindow(); - + $this->find($this->searchInput)->keys(str_split($value)); $this->waitResult(); } - /** - * Clear value of element. - * - * @return void - */ - protected function clear() - { - $element = $this->find($this->searchInput); - while ('' != $element->getValue()) { - $element->setValue([self::BACKSPACE]); - } - } - - /** - * Select to last window. - * - * @return void - */ - protected function selectWindow() - { - $this->driver->selectWindow(); - } - /** * Wait init search suggest container. * @@ -130,12 +96,7 @@ class GlobalsearchElement extends SimpleElement $this->driver->waitUntil( function () use ($browser, $selector) { - if ($browser->find($selector)->isVisible()) { - return true; - } else { - $browser->selectWindow(); - return null; - } + return $browser->find($selector)->isVisible() ? true : null; } ); } diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form/Group.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form/Group.php index 0d3244802c70260eedce3ed996df9856c77a3057..09123d09767bf838415192989cd1f5f06732360b 100644 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form/Group.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form/Group.php @@ -9,7 +9,7 @@ namespace Magento\Backend\Test\Block\System\Config\Form; use Magento\Mtf\Client\Locator; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; /** * Class Group diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Form.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Form.php deleted file mode 100644 index d57bd1aa4d78f8f9829b08857a27611793b1d462..0000000000000000000000000000000000000000 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Form.php +++ /dev/null @@ -1,199 +0,0 @@ -<?php -/** - * @api - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Backend\Test\Block\Widget; - -use Magento\Mtf\Block\Form as FormInstance; -use Magento\Mtf\Client\Locator; -use Magento\Mtf\Factory\Factory; -use Magento\Mtf\Fixture\FixtureInterface; - -/** - * Class Form - * Is used to represent any form on the page - * - * @SuppressWarnings(PHPMD.NumberOfChildren) - */ -class Form extends FormInstance -{ - /** - * 'Save' button - * - * @var string - */ - protected $saveButton = '#save'; - - /** - * 'Save And Continue Edit' button - * - * @var string - */ - protected $saveAndContinueButton = '#save_and_continue'; - - /** - * 'Save And Continue Edit' button - * - * @var string - */ - protected $saveAndContinueEditButton = '#save_and_continue_edit'; - - /** - * Back button - * - * @var string - */ - protected $backButton = '#back'; - - /** - * Reset button - * - * @var string - */ - protected $resetButton = '#reset'; - - /** - * 'Delete' button - * - * @var string - */ - protected $deleteButton = '#delete-button-button'; - - /** - * Backend abstract block - * - * @var string - */ - protected $templateBlock = './ancestor::body'; - - /** - * Selector of element to wait for. If set by child will wait for element after action - * - * @var string - */ - protected $waitForSelector; - - /** - * Locator type of waitForSelector - * - * @var Locator - */ - protected $waitForSelectorType = Locator::SELECTOR_CSS; - - /** - * Wait for should be for visibility or not? - * - * @var boolean - */ - protected $waitForSelectorVisible = true; - - /** - * Update the root form - * - * @param FixtureInterface $fixture - * @return Form - */ - public function update(FixtureInterface $fixture) - { - $this->fill($fixture); - return $this; - } - - /** - * Get backend abstract block - * - * @return \Magento\Backend\Test\Block\Template - */ - protected function getTemplateBlock() - { - return Factory::getBlockFactory()->getMagentoBackendTemplate( - $this->_rootElement->find($this->templateBlock, Locator::SELECTOR_XPATH) - ); - } - - /** - * Save the form - * - * @param FixtureInterface $fixture - * @return Form - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function save(FixtureInterface $fixture = null) - { - $this->_rootElement->find($this->saveButton, Locator::SELECTOR_CSS)->click(); - $this->waitForElement(); - return $this; - } - - /** - * Method that waits for the configured selector using class attributes. - */ - protected function waitForElement() - { - if (!empty($this->waitForSelector)) { - if ($this->waitForSelectorVisible) { - $this->getTemplateBlock()->waitForElementVisible($this->waitForSelector, $this->waitForSelectorType); - } else { - $this->getTemplateBlock()->waitForElementNotVisible($this->waitForSelector, $this->waitForSelectorType); - } - } - } - - /** - * Back action - * - * @return Form - */ - public function back() - { - $this->_rootElement->find($this->backButton, Locator::SELECTOR_CSS)->click(); - return $this; - } - - /** - * Reset the form - * - * @return Form - */ - public function reset() - { - $this->_rootElement->find($this->resetButton, Locator::SELECTOR_CSS)->click(); - return $this; - } - - /** - * Delete current form item - * - * @param FixtureInterface $fixture - * @return Form - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function delete(FixtureInterface $fixture = null) - { - $this->_rootElement->find($this->deleteButton, Locator::SELECTOR_CSS)->click(); - return $this; - } - - /** - * Click save and continue button on form - */ - public function clickSaveAndContinue() - { - $this->_rootElement->find($this->saveAndContinueButton, Locator::SELECTOR_CSS)->click(); - return $this; - } - - /** - * Click save and continue button on form - */ - public function clickSaveAndContinueEdit() - { - $this->_rootElement->find($this->saveAndContinueEditButton, Locator::SELECTOR_CSS)->click(); - return $this; - } -} diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php index b11db4365fa2d253ebf571ea4495200274fc74d6..b104c3230510c08d70f30d1d17d49be50cebd18d 100755 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php @@ -7,6 +7,7 @@ namespace Magento\Backend\Test\Block\Widget; use Magento\Mtf\Block\BlockFactory; +use Magento\Mtf\Block\Form; use Magento\Mtf\Block\Mapper; use Magento\Mtf\Client\Locator; use Magento\Mtf\Client\ElementInterface; @@ -87,8 +88,7 @@ class FormTabs extends Form foreach ($tabs as $tabName => $tabFields) { $tab = $this->getTab($tabName); $this->openTab($tabName); - $tab->fillFormTab(array_merge($tabFields, $this->unassignedFields), $context); - $this->updateUnassignedFields($tab); + $tab->fillFormTab($tabFields, $context); } if (!empty($this->unassignedFields)) { $this->fillMissedFields($tabs); @@ -97,34 +97,25 @@ class FormTabs extends Form return $this; } - /** - * Update array with fields which aren't assigned to any tab - * - * @param Tab $tab - */ - protected function updateUnassignedFields(Tab $tab) - { - $this->unassignedFields = array_diff_key( - $this->unassignedFields, - array_intersect_key($this->unassignedFields, $tab->setFields) - ); - } - /** * Fill fields which weren't found on filled tabs * - * @param array $tabs * @throws \Exception - * * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ - protected function fillMissedFields(array $tabs) + protected function fillMissedFields() { - foreach (array_diff_key($this->tabs, $tabs) as $tabName => $tabData) { + foreach ($this->tabs as $tabName => $tabData) { $tab = $this->getTab($tabName); - if ($this->openTab($tabName)) { - $tab->fillFormTab($this->unassignedFields, $this->_rootElement); - $this->updateUnassignedFields($tab); + if ($this->openTab($tabName) && $this->isTabVisible($tabName)) { + $mapping = $tab->dataMapping($this->unassignedFields); + foreach ($mapping as $fieldName => $data) { + $element = $tab->_rootElement->find($data['selector'], $data['strategy'], $data['input']); + if ($element->isVisible()) { + $element->setValue($data['value']); + unset($this->unassignedFields[$fieldName]); + } + } if (empty($this->unassignedFields)) { break; } diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.php b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9624a9398b6ac7c7bb2f25f47b49bfde089978f5 --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.php @@ -0,0 +1,65 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Backend\Test\TestCase; + +use Magento\Backend\Test\Fixture\GlobalSearch; +use Magento\Backend\Test\Page\Adminhtml\Dashboard; +use Magento\Mtf\TestCase\Injectable; + +/** + * Preconditions: + * 1. Create customer + * 2. Create two simple products + * 3. Create order with one of created simple product + * + * Steps: + * 1. Login to backend + * 2. Click on Search button on the top of page + * 3. Fill in data according dataSet + * 4. Perform assertions + * + * @group Search_Core_(MX) + * @ZephyrId MAGETWO-28457 + */ +class GlobalSearchEntityTest extends Injectable +{ + /* tags */ + const MVP = 'no'; + const DOMAIN = 'MX'; + /* end tags */ + + /** + * Backend Dashboard page. + * + * @var Dashboard + */ + protected $dashboard; + + /** + * Preparing pages for test. + * + * @param Dashboard $dashboard + * @return void + */ + public function __inject(Dashboard $dashboard) + { + $this->dashboard = $dashboard; + } + + /** + * Run Global Search Entity Test. + * + * @param GlobalSearch $search + * @return void + */ + public function test(GlobalSearch $search) + { + //Steps: + $this->dashboard->open(); + $this->dashboard->getAdminPanelHeader()->search($search->getQuery()); + } +} diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.xml b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..7adcf2b0241bad21f32708ea1416b7a9afcf5128 --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + --> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> + <testCase name="Magento\Backend\Test\TestCase\GlobalSearchEntityTest"> + <variation name="GlobalSearchEntityTestVariation2"> + <data name="description" xsi:type="string">search with 2 sign return no results</data> + <data name="search/data/query" xsi:type="string">:)</data> + <constraint name="Magento\Backend\Test\Constraint\AssertGlobalSearchNoRecordsFound" /> + </variation> + <variation name="GlobalSearchEntityTestVariation3"> + <data name="description" xsi:type="string">search product by sku</data> + <data name="search/data/query" xsi:type="string">orderInjectable::default::product::sku</data> + <constraint name="Magento\Backend\Test\Constraint\AssertGlobalSearchProductName" /> + </variation> + <variation name="GlobalSearchEntityTestVariation4"> + <data name="description" xsi:type="string">search existed customer</data> + <data name="search/data/query" xsi:type="string">customer::johndoe_unique::lastname</data> + <constraint name="Magento\Backend\Test\Constraint\AssertGlobalSearchCustomerName" /> + </variation> + <variation name="GlobalSearchEntityTestVariation5"> + <data name="description" xsi:type="string">search order (by order id)</data> + <data name="search/data/query" xsi:type="string">orderInjectable::default::id</data> + <constraint name="Magento\Backend\Test\Constraint\AssertGlobalSearchOrderId" /> + </variation> + </testCase> +</config> diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/NavigateMenuTest.php b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/NavigateMenuTest.php index b8d486de23c5b4006f491a3f1fad1532a2a0f928..2e4509a1e66eab3cb43acfd0a9f0407c7bf50ffc 100644 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/NavigateMenuTest.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/NavigateMenuTest.php @@ -13,7 +13,7 @@ use Magento\Backend\Test\Page\Adminhtml\Dashboard; * Steps: * 1. Log in to backend. * 2. Navigate throught menu to the page. - * 6. Perform asserts. + * 3. Perform asserts. * * @ZephyrId MAGETWO-34874 */ diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertProductCustomOptionsOnBundleProductPage.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertProductCustomOptionsOnBundleProductPage.php index 308ebbe82565e481275b3940ca1f3bece6a11cae..dcb74539acd16a4e77972e99f68f331d328bfc1b 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertProductCustomOptionsOnBundleProductPage.php +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertProductCustomOptionsOnBundleProductPage.php @@ -9,8 +9,7 @@ namespace Magento\Bundle\Test\Constraint; use Magento\Catalog\Test\Constraint\AssertProductCustomOptionsOnProductPage; /** - * Class AssertProductCustomOptionsOnBundleProductPage - * Assertion that commodity options are displayed correctly on bundle product page + * Assertion that commodity options are displayed correctly on bundle product page. */ class AssertProductCustomOptionsOnBundleProductPage extends AssertProductCustomOptionsOnProductPage { diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertTierPriceOnBundleProductPage.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertTierPriceOnBundleProductPage.php index 3c62ea1c4eac77055ad478c6b28de567657631cf..156e24f75aa75a93d7ca1fb19c39fd69c5888508 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertTierPriceOnBundleProductPage.php +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertTierPriceOnBundleProductPage.php @@ -32,7 +32,7 @@ class AssertTierPriceOnBundleProductPage extends AssertProductTierPriceOnProduct * * @var int */ - protected $priceFormat = 4; + protected $priceFormat = 0; /** * Assertion that tier prices are displayed correctly diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/BundleProduct/Price.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/BundleProduct/Price.php index a30b316e1e8901d96241ba11f3a7547a5f4b184e..c4f0aee1ebebec8092b22ef6e821825495669879 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/BundleProduct/Price.php +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/BundleProduct/Price.php @@ -139,13 +139,13 @@ class Price implements FixtureInterface 'price_to' => '120.00', ], 'fixed-115' => [ - 'price_from' => '115.00', - 'price_to' => '120.00', + 'price_from' => '317.00', + 'price_to' => '362.00', 'cart_price' => '317.00', ], - 'fixed-159' => [ - 'price_from' => '115.00', - 'price_to' => '120.00', + 'fixed-110' => [ + 'price_from' => '159.00', + 'price_to' => '164.00', 'cart_price' => '159.00', ], 'fixed-756' => [ diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.xml index 2fddc12693d45cf68779b2f75cabcb6b492b47cc..597a6d7f735a93b8a301a9aaff642a95606c0af0 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.xml +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.xml @@ -6,10 +6,10 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="CatalogProductView" area="Product" mca="catalog/product/view"> - <block name="viewBlock"> - <render name="bundle" class="Magento\Bundle\Test\Block\Catalog\Product\View"/> - </block> - <block name="bundleViewBlock" class="Magento\Bundle\Test\Block\Catalog\Product\View" locator="#maincontent" strategy="css selector"/> - </page> + <page name="CatalogProductView" area="Product" mca="catalog/product/view"> + <block name="viewBlock"> + <render name="bundle" class="Magento\Bundle\Test\Block\Catalog\Product\View" /> + </block> + <block name="bundleViewBlock" class="Magento\Bundle\Test\Block\Catalog\Product\View" locator="#maincontent" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml index 51d270f4d41e0230b4b54570806b8faa5e0080f3..ad5b9bfa0c055caf84c363a3dcc9067689628cc6 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml @@ -228,7 +228,6 @@ <constraint name="Magento\Bundle\Test\Constraint\AssertBundlePriceType" /> </variation> <variation name="CreateBundleProductEntityTestVariation10"> - <data name="tag" xsi:type="string">to_maintain:yes</data> <data name="description" xsi:type="string">Create dynamic bundle</data> <data name="product/data/url_key" xsi:type="string">bundle-product-%isolation%</data> <data name="product/data/name" xsi:type="string">Bundle Dynamic %isolation%</data> @@ -272,7 +271,7 @@ <data name="product/data/sku" xsi:type="string">sku_bundle_fixed_%isolation%</data> <data name="product/data/price_type" xsi:type="string">Fixed</data> <data name="product/data/price/value" xsi:type="string">110</data> - <data name="product/data/price/preset" xsi:type="string">fixed-159</data> + <data name="product/data/price/preset" xsi:type="string">fixed-110</data> <data name="product/data/bundle_selections/preset" xsi:type="string">second</data> <data name="product/data/bundle_selections/products" xsi:type="string">catalogProductSimple::product_100_dollar,catalogProductSimple::product_40_dollar</data> <data name="product/data/checkout_data/preset" xsi:type="string">with_custom_options_2</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/Main/EditForm.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/Main/EditForm.xml index 887e1983789462f31d40ec9c2846931bb225abd8..ab116cdecc2f5118629b781c8985557529e882a4 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/Main/EditForm.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/Main/EditForm.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<mapping strict="0"> +<mapping strict="1"> <fields> <attribute_set_name /> </fields> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Attribute.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Attribute.php index 39e76e2c98eec4d2d018e8048116199a27c683b7..bd1b633deedd32b670b10b1adf4faae4c2a87e58 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Attribute.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Attribute.php @@ -7,7 +7,7 @@ namespace Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Action; use Magento\Mtf\Fixture\FixtureInterface; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Element\SimpleElement; /** @@ -25,6 +25,7 @@ class Attribute extends Form public function fill(FixtureInterface $fixture, SimpleElement $element = null) { $data = $fixture->getData(); + $fields = []; foreach ($data as $name => $dataValue) { $fields['toggle_' . $name] = 'Yes'; $fields[$name] = $dataValue; diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/NewCategoryIds.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/NewCategoryIds.php index c1baad740ef47f6564c703afddebd6d11d772b35..5c44c611d8da52a7080edabd5699d5b5c0582af2 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/NewCategoryIds.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/NewCategoryIds.php @@ -7,7 +7,7 @@ namespace Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Tab\ProductDetails; use Magento\Catalog\Test\Fixture\Category; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; /** * Create new category. diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductInGrid.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductInGrid.php index edc00d8db75fe91c060c124232eadf815fc4c115..bb1e7cc32bbd8dbecc5bdfe2e8764e3c71a071ae 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductInGrid.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductInGrid.php @@ -11,7 +11,6 @@ use Magento\Mtf\Constraint\AbstractConstraint; use Magento\Mtf\Fixture\FixtureInterface; /** - * Class AssertProductInGrid * Assert that product is present in products grid. */ class AssertProductInGrid extends AbstractConstraint @@ -63,7 +62,7 @@ class AssertProductInGrid extends AbstractConstraint } /** - * Get product type + * Get product type. * * @return string */ diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml index 1e99a0752d4e407a6dfac02c519cf83d9f6ded54..1a38dd8158cd63cd9553ba8cde4daaa7e3c76eed 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml @@ -111,13 +111,13 @@ <field name="is_wysiwyg_enabled" is_required=""> <default_value xsi:type="number">0</default_value> </field> - <field name="is_used_for_promo_rules" is_required=""> + <field name="is_used_for_promo_rules" is_required="" group="frontend-properties"> <default_value xsi:type="number">0</default_value> </field> <field name="search_weight" is_required=""> <default_value xsi:type="string">1</default_value> </field> - <field name="options" is_required="" source="Magento\Catalog\Test\Fixture\CatalogProductAttribute\Options"> + <field name="options" is_required="" group="properties" source="Magento\Catalog\Test\Fixture\CatalogProductAttribute\Options"> <default_value xsi:type="null"/> </field> <field name="default_value_text" group="advanced-properties"/> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual.xml index cc82e98b336dbdd13b1088b90762f29d081f212f..2e2903a0cf35267fb62eb27cec89bee8c831baef 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual.xml @@ -36,6 +36,23 @@ </field> </dataset> + <dataset name="required_fields"> + <field name="url_key" xsi:type="string">virtual-product%isolation%</field> + <field name="name" xsi:type="string">Virtual product %isolation%</field> + <field name="sku" xsi:type="string">sku_virtual_product_%isolation%</field> + <field name="is_virtual" xsi:type="string">Yes</field> + <field name="price" xsi:type="array"> + <item name="value" xsi:type="string">10</item> + <item name="preset" xsi:type="string">-</item> + </field> + <field name="tax_class_id" xsi:type="array"> + <item name="dataSet" xsi:type="string">taxable_goods</item> + </field> + <field name="website_ids" xsi:type="array"> + <item name="0" xsi:type="string">Main Website</item> + </field> + </dataset> + <dataset name="required_fields_with_category"> <field name="url_key" xsi:type="string">virtual-product%isolation%</field> <field name="name" xsi:type="string">Virtual product %isolation%</field> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml index e84f0409dada6c372eead7ef608a6adb8544f588..364854e6870bbf6a8b9aa15989b7ccececcb7cbc 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml @@ -257,7 +257,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> </variation> <variation name="CreateSimpleProductEntityTestVariation15"> - <data name="tag" xsi:type="string">to_maintain:yes</data> <data name="description" xsi:type="string">Create product with tax class and group price</data> <data name="product/data/url_key" xsi:type="string">simple-product-%isolation%</data> <data name="product/data/name" xsi:type="string">Simple Product %isolation%</data> @@ -317,7 +316,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductTierPriceOnProductPage" /> </variation> <variation name="CreateSimpleProductEntityTestVariation18"> - <data name="issue" xsi:type="string">Bug: MAGETWO-35342</data> <data name="description" xsi:type="string">Create product wit suite of custom options</data> <data name="product/data/url_key" xsi:type="string">simple-product-%isolation%</data> <data name="product/data/name" xsi:type="string">Simple Product %isolation%</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.php index 6c297ef596e1f08f89d4d4f578e4945d1a67caa9..1cdff9dbf0ed156e55ea0d5bbc657f7628f7e02d 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.php @@ -30,7 +30,6 @@ class ProductTypeSwitchingOnCreationTest extends Injectable /* tags */ const MVP = 'yes'; const DOMAIN = 'MX'; - const TO_MAINTAIN = 'yes'; /* end tags */ /** diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.xml index af77d4f6fd3d4ea47bad0a0bb3cf512ada4ab3f1..d4850eed96207c39e7d3a43265eab36300c2bcf9 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.xml @@ -27,13 +27,13 @@ </variation> <variation name="ProductTypeSwitchingOnCreationTestVariation3"> <data name="createProduct" xsi:type="string">configurable</data> - <data name="product" xsi:type="string">catalogProductSimple::default</data> + <data name="product" xsi:type="string">catalogProductSimple::product_without_category</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnCreationTestVariation4"> <data name="createProduct" xsi:type="string">configurable</data> - <data name="product" xsi:type="string">catalogProductVirtual::default</data> + <data name="product" xsi:type="string">catalogProductVirtual::required_fields</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml index d477c119f14ec5c992f4f9285a47c94bac67effc..8d1fc4b9e09c4fe2d44ffc29021fa079d9a88191 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml @@ -8,7 +8,6 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Catalog\Test\TestCase\Product\ProductTypeSwitchingOnUpdateTest"> <variation name="ProductTypeSwitchingOnUpdateTestVariation1"> - <data name="tag" xsi:type="string">stable:no</data> <data name="productOrigin" xsi:type="string">catalogProductSimple::default</data> <data name="product" xsi:type="string">configurableProduct::default</data> <data name="actionName" xsi:type="string">-</data> @@ -28,17 +27,15 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnUpdateTestVariation3"> - <data name="tag" xsi:type="string">stable:no</data> <data name="productOrigin" xsi:type="string">configurableProduct::default</data> - <data name="product" xsi:type="string">catalogProductSimple::default</data> + <data name="product" xsi:type="string">catalogProductSimple::product_without_category</data> <data name="actionName" xsi:type="string">deleteAttributes</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnUpdateTestVariation4"> - <data name="tag" xsi:type="string">stable:no</data> <data name="productOrigin" xsi:type="string">configurableProduct::default</data> - <data name="product" xsi:type="string">catalogProductVirtual::default</data> + <data name="product" xsi:type="string">catalogProductVirtual::required_fields</data> <data name="actionName" xsi:type="string">deleteAttributes</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> @@ -51,7 +48,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnUpdateTestVariation6"> - <data name="tag" xsi:type="string">stable:no</data> <data name="productOrigin" xsi:type="string">catalogProductVirtual::default</data> <data name="product" xsi:type="string">configurableProduct::not_virtual_for_type_switching</data> <data name="actionName" xsi:type="string">-</data> @@ -82,7 +78,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnUpdateTestVariation9"> - <data name="tag" xsi:type="string">stable:no</data> <data name="productOrigin" xsi:type="string">downloadableProduct::default</data> <data name="product" xsi:type="string">configurableProduct::not_virtual_for_type_switching</data> <data name="actionName" xsi:type="string">-</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml index 73e20318e00350a5fc21cc5089a833cdc7469cd1..4dde51eae09a370f540fa8e3b2e9970d40c19dc6 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml @@ -70,7 +70,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductVisibleInCategory" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSearchableBySku" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> </variation> <variation name="UpdateSimpleProductEntityTestVariation5"> <data name="description" xsi:type="string">Update stock to Out of Stock</data> @@ -104,7 +103,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" /> </variation> <variation name="UpdateSimpleProductEntityTestVariation7"> - <data name="tag" xsi:type="string">stable:no</data> <data name="description" xsi:type="string">Update category</data> <data name="initialProduct/dataSet" xsi:type="string">product_with_category</data> <data name="product/data/category_ids/presets" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateVirtualProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateVirtualProductEntityTest.xml index 0346cc1467f5ee7cf386c0d0f304c5bef9625a62..d6607d67fd40b773f4af4c01f0f6dad154b31237 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateVirtualProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateVirtualProductEntityTest.xml @@ -15,11 +15,8 @@ <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">999</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> - <data name="product/data/special_price" xsi:type="string">-</data> <data name="product/data/tier_price/preset" xsi:type="string">MAGETWO-23002</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -38,18 +35,13 @@ <data name="product/data/tax_class_id/dataSet" xsi:type="string">taxable_goods</data> <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">999</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/category_ids/presets" xsi:type="string">-</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> <data name="product/data/special_price" xsi:type="string">45</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog, Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductForm" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductVisibleInCategory" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInCategory" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> @@ -64,17 +56,13 @@ <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">999</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> - <data name="product/data/special_price" xsi:type="string">-</data> <data name="product/data/tier_price/preset" xsi:type="string">MAGETWO-23002</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog, Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductForm" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductVisibleInCategory" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductOutOfStock" /> @@ -86,14 +74,8 @@ <data name="product/data/sku" xsi:type="string">virtual_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">99.99</data> <data name="product/data/tax_class_id/dataSet" xsi:type="string">taxable_goods</data> - <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">-</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/category_ids/presets" xsi:type="string">-</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> - <data name="product/data/special_price" xsi:type="string">-</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -108,14 +90,8 @@ <data name="product/data/sku" xsi:type="string">virtual_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">5.00</data> <data name="product/data/tax_class_id/dataSet" xsi:type="string">None</data> - <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">-</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/category_ids/presets" xsi:type="string">-</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> - <data name="product/data/special_price" xsi:type="string">-</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -134,10 +110,8 @@ <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> <data name="product/data/group_price/preset" xsi:type="string">MAGETWO-23055</data> - <data name="product/data/special_price" xsi:type="string">-</data> <data name="product/data/tier_price/preset" xsi:type="string">MAGETWO-23002</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog, Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -154,14 +128,10 @@ <data name="product/data/sku" xsi:type="string">virtual_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">99.99</data> <data name="product/data/tax_class_id/dataSet" xsi:type="string">None</data> - <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">-</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> <data name="product/data/special_price" xsi:type="string">45</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog, Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -176,14 +146,9 @@ <data name="product/data/sku" xsi:type="string">virtual_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">5.00</data> <data name="product/data/tax_class_id/dataSet" xsi:type="string">taxable_goods</data> - <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">-</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/category_ids/presets" xsi:type="string">-</data> <data name="product/data/group_price/preset" xsi:type="string">MAGETWO-23055</data> - <data name="product/data/special_price" xsi:type="string">-</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -201,9 +166,6 @@ <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">999</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> - <data name="product/data/special_price" xsi:type="string">-</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> <data name="product/data/custom_options/preset" xsi:type="string">options-suite</data> <data name="product/data/visibility" xsi:type="string">Search</data> @@ -221,14 +183,9 @@ <data name="product/data/sku" xsi:type="string">virtual_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">99.99</data> <data name="product/data/tax_class_id/dataSet" xsi:type="string">taxable_goods</data> - <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">-</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/category_ids/presets" xsi:type="string">-</data> <data name="product/data/group_price/preset" xsi:type="string">MAGETWO-23055</data> - <data name="product/data/special_price" xsi:type="string">-</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog, Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -247,19 +204,15 @@ <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> <data name="product/data/group_price/preset" xsi:type="string">MAGETWO-23055</data> - <data name="product/data/special_price" xsi:type="string">-</data> <data name="product/data/tier_price/preset" xsi:type="string">MAGETWO-23002</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductForm" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductVisibleInCategory" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSpecialPriceOnProductPage" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductGroupedPriceOnProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductTierPriceOnProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInCategory" /> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml index 93ba98c55dd97d03970e3d0ea2d951f3886c634b..320e99b58a4df53b9a155bad31d53748404b84d5 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml @@ -6,14 +6,14 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\CreateAttributeSetEntityTest"> - <variation name="CreateAttributeSetEntityTestVariation1"> - <data name="attributeSet/data/attribute_set_name" xsi:type="string">ProductTemplate%isolation%</data> - <data name="attributeSet/data/skeleton_set/dataSet" xsi:type="string">default</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm"/> - </variation> - </testCase> + <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\CreateAttributeSetEntityTest"> + <variation name="CreateAttributeSetEntityTestVariation1"> + <data name="attributeSet/data/attribute_set_name" xsi:type="string">ProductTemplate%isolation%</data> + <data name="attributeSet/data/skeleton_set/dataSet" xsi:type="string">default</data> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml index f569a5dbbd81d73b74ad961f2d3941e5f78b86f8..7597b2416ba022c4ba0a68073835d2af87313ada 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml @@ -6,17 +6,17 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateAttributeSetTest"> - <variation name="UpdateAttributeSetTestVariation1"> - <data name="attributeSet/data/attribute_set_name" xsi:type="string">ProductTemplateEdit1%isolation%</data> - <data name="attributeSet/data/group" xsi:type="string">Custom-group%isolation%</data> - <data name="attributeSetOriginal/dataSet" xsi:type="string">custom_attribute_set</data> - <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_text_field</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateGroupOnProductForm"/> - </variation> - </testCase> + <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateAttributeSetTest"> + <variation name="UpdateAttributeSetTestVariation1"> + <data name="attributeSet/data/attribute_set_name" xsi:type="string">ProductTemplateEdit1%isolation%</data> + <data name="attributeSet/data/group" xsi:type="string">Custom-group%isolation%</data> + <data name="attributeSetOriginal/dataSet" xsi:type="string">custom_attribute_set</data> + <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_text_field</data> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateGroupOnProductForm" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml index de42ea1eca4ef4ad387c7315f103b0cb0aa75ff0..0e74dfb542a73f312a319c9aef11e02d330176da 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml @@ -6,58 +6,48 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateProductAttributeEntityTest"> - <variation name="UpdateProductAttributeEntityTestVariation1"> - <data name="productTemplate/dataSet" xsi:type="string">custom_attribute_set</data> - <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_text_field</data> - <data name="attribute/data/frontend_label" xsi:type="string">Text_Field_%isolation%</data> - <data name="attribute/data/frontend_input" xsi:type="string">-</data> - <data name="attribute/data/options/preset" xsi:type="string">-</data> - <data name="attribute/data/is_required" xsi:type="string">Yes</data> - <data name="attribute/data/attribute_code" xsi:type="string">-</data> - <data name="attribute/data/is_global" xsi:type="string">Global</data> - <data name="attribute/data/default_value_text" xsi:type="string">attribute_edited%isolation%</data> - <data name="attribute/data/is_unique" xsi:type="string">Yes</data> - <data name="attribute/data/manage_frontend_label" xsi:type="string">-</data> - <data name="attribute/data/is_searchable" xsi:type="string">Yes</data> - <data name="attribute/data/is_visible_in_advanced_search" xsi:type="string">Yes</data> - <data name="attribute/data/is_comparable" xsi:type="string">Yes</data> - <data name="attribute/data/is_filterable" xsi:type="string">-</data> - <data name="attribute/data/is_filterable_in_search" xsi:type="string">-</data> - <data name="attribute/data/is_used_for_promo_rules" xsi:type="string">Yes</data> - <data name="attribute/data/is_html_allowed_on_front" xsi:type="string">Yes</data> - <data name="attribute/data/is_visible_on_front" xsi:type="string">Yes</data> - <data name="attribute/data/used_in_product_listing" xsi:type="string">Yes</data> - <data name="attribute/data/used_for_sort_by" xsi:type="string">Yes</data> - <data name="isRequired" xsi:type="string">Yes</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeSaveMessage"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm"/> - </variation> - <variation name="UpdateProductAttributeEntityTestVariation2"> - <data name="productTemplate/dataSet" xsi:type="string">custom_attribute_set</data> - <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_dropdown</data> - <data name="attribute/data/frontend_label" xsi:type="string">Dropdown_%isolation%</data> - <data name="attribute/data/frontend_input" xsi:type="string">-</data> - <data name="attribute/data/options/preset" xsi:type="string">default</data> - <data name="attribute/data/is_required" xsi:type="string">Yes</data> - <data name="attribute/data/attribute_code" xsi:type="string">-</data> - <data name="attribute/data/is_global" xsi:type="string">Global</data> - <data name="attribute/data/default_value_text" xsi:type="string">-</data> - <data name="attribute/data/is_unique" xsi:type="string">Yes</data> - <data name="attribute/data/manage_frontend_label" xsi:type="string">-</data> - <data name="attribute/data/is_searchable" xsi:type="string">Yes</data> - <data name="attribute/data/is_visible_in_advanced_search" xsi:type="string">Yes</data> - <data name="attribute/data/is_comparable" xsi:type="string">Yes</data> - <data name="attribute/data/is_filterable" xsi:type="string">Filterable (with results)</data> - <data name="attribute/data/is_filterable_in_search" xsi:type="string">Yes</data> - <data name="attribute/data/is_used_for_promo_rules" xsi:type="string">No</data> - <data name="attribute/data/is_html_allowed_on_front" xsi:type="string">Yes</data> - <data name="attribute/data/is_visible_on_front" xsi:type="string">Yes</data> - <data name="attribute/data/used_in_product_listing" xsi:type="string">Yes</data> - <data name="attribute/data/used_for_sort_by" xsi:type="string">Yes</data> - <data name="isRequired" xsi:type="string">Yes</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeSaveMessage"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm"/> - </variation> - </testCase> + <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateProductAttributeEntityTest"> + <variation name="UpdateProductAttributeEntityTestVariation1"> + <data name="productTemplate/dataSet" xsi:type="string">custom_attribute_set</data> + <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_text_field</data> + <data name="attribute/data/frontend_label" xsi:type="string">Text_Field_%isolation%</data> + <data name="attribute/data/is_required" xsi:type="string">Yes</data> + <data name="attribute/data/is_global" xsi:type="string">Global</data> + <data name="attribute/data/default_value_text" xsi:type="string">attribute_edited%isolation%</data> + <data name="attribute/data/is_unique" xsi:type="string">Yes</data> + <data name="attribute/data/is_searchable" xsi:type="string">Yes</data> + <data name="attribute/data/is_visible_in_advanced_search" xsi:type="string">Yes</data> + <data name="attribute/data/is_comparable" xsi:type="string">Yes</data> + <data name="attribute/data/is_used_for_promo_rules" xsi:type="string">Yes</data> + <data name="attribute/data/is_html_allowed_on_front" xsi:type="string">Yes</data> + <data name="attribute/data/is_visible_on_front" xsi:type="string">Yes</data> + <data name="attribute/data/used_in_product_listing" xsi:type="string">Yes</data> + <data name="attribute/data/used_for_sort_by" xsi:type="string">Yes</data> + <data name="isRequired" xsi:type="string">Yes</data> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeSaveMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" /> + </variation> + <variation name="UpdateProductAttributeEntityTestVariation2"> + <data name="productTemplate/dataSet" xsi:type="string">custom_attribute_set</data> + <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_dropdown</data> + <data name="attribute/data/frontend_label" xsi:type="string">Dropdown_%isolation%</data> + <data name="attribute/data/options/preset" xsi:type="string">default</data> + <data name="attribute/data/is_required" xsi:type="string">Yes</data> + <data name="attribute/data/is_global" xsi:type="string">Global</data> + <data name="attribute/data/is_unique" xsi:type="string">Yes</data> + <data name="attribute/data/is_searchable" xsi:type="string">Yes</data> + <data name="attribute/data/is_visible_in_advanced_search" xsi:type="string">Yes</data> + <data name="attribute/data/is_comparable" xsi:type="string">Yes</data> + <data name="attribute/data/is_filterable" xsi:type="string">Filterable (with results)</data> + <data name="attribute/data/is_filterable_in_search" xsi:type="string">Yes</data> + <data name="attribute/data/is_used_for_promo_rules" xsi:type="string">No</data> + <data name="attribute/data/is_html_allowed_on_front" xsi:type="string">Yes</data> + <data name="attribute/data/is_visible_on_front" xsi:type="string">Yes</data> + <data name="attribute/data/used_in_product_listing" xsi:type="string">Yes</data> + <data name="attribute/data/used_for_sort_by" xsi:type="string">Yes</data> + <data name="isRequired" xsi:type="string">Yes</data> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeSaveMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Block/Adminhtml/Edit/SearchTermForm.php b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Block/Adminhtml/Edit/SearchTermForm.php index c3c576a8b7d4cff2100653d3aa4a62b1d7912130..25ca938dde09070eefb4cc191d65d1a75e5d1f79 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Block/Adminhtml/Edit/SearchTermForm.php +++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Block/Adminhtml/Edit/SearchTermForm.php @@ -6,11 +6,10 @@ namespace Magento\CatalogSearch\Test\Block\Adminhtml\Edit; -use Magento\Backend\Test\Block\Widget\Form as WidgetForm; +use Magento\Mtf\Block\Form as WidgetForm; /** - * Class Form - * Form for search term + * Form for search term. */ class SearchTermForm extends WidgetForm { diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Shipping.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Shipping.php index 5581bb47ea913a86cb7ba2a4bfaaddffdfe69bb8..c52774c67d3d912b1dd8813e9aacd7a61d89dd57 100644 --- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Shipping.php +++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Shipping.php @@ -11,55 +11,61 @@ use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Locator; /** - * Class Shipping - * Cart shipping block + * Cart shipping block. */ class Shipping extends Form { /** - * Form wrapper selector + * Form wrapper selector. * * @var string */ protected $formWrapper = '.content'; /** - * Open shipping form selector + * Open shipping form selector. * * @var string */ protected $openForm = '.title'; /** - * Get quote selector + * Get quote selector. * * @var string */ protected $getQuote = '.action.quote'; /** - * Update total selector + * Update total selector. * * @var string */ protected $updateTotalSelector = '.action.update'; /** - * Selector to access the shipping carrier method + * Selector to access the shipping carrier method. * * @var string */ protected $shippingMethod = '//span[text()="%s"]/following::*//*[contains(text(), "%s")]'; /** - * From with shipping available shipping methods + * From with shipping available shipping methods. * * @var string */ protected $shippingMethodForm = '#co-shipping-method-form'; /** - * Open estimate shipping and tax form + * Fields that are used in estimation shipping form. + * + * @var array + */ + protected $estimationFields = ['country_id', 'region_id', 'region', 'postcode']; + + /** + * Open estimate shipping and tax form. * * @return void */ @@ -71,7 +77,7 @@ class Shipping extends Form } /** - * Click Get quote button + * Click Get quote button. * * @return void */ @@ -81,7 +87,7 @@ class Shipping extends Form } /** - * Select shipping method + * Select shipping method. * * @param array $shipping * @return void @@ -97,7 +103,7 @@ class Shipping extends Form } /** - * Fill shipping and tax form + * Fill shipping and tax form. * * @param Address $address * @return void @@ -105,12 +111,14 @@ class Shipping extends Form public function fillEstimateShippingAndTax(Address $address) { $this->openEstimateShippingAndTax(); - $this->fill($address); + $data = $address->getData(); + $mapping = $this->dataMapping(array_intersect_key($data, array_flip($this->estimationFields))); + $this->_fill($mapping, $this->_rootElement); $this->clickGetQuote(); } /** - * Determines if the specified shipping carrier/method is visible on the cart + * Determines if the specified shipping carrier/method is visible on the cart. * * @param $carrier * @param $method diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Billing.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Billing.php index f4df8ae791b970291e26684656e2199df91d1445..dcc945eaafd750c6d4fcb282c791c3f611e0e8a1 100644 --- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Billing.php +++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Billing.php @@ -48,8 +48,6 @@ class Billing extends Form $isShippingAddress = false ) { if ($billingAddress) { - //@TODO: MAGETWO-34756 - sleep(5); $this->fill($billingAddress); } if ($isShippingAddress) { diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsBlockEntityTest.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsBlockEntityTest.xml index 2e1583ed1df208668de87b8fc5a3e62edd4b4628..a6fb5bb04526031f8a9e828ea496e769bde0590b 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsBlockEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsBlockEntityTest.xml @@ -18,7 +18,6 @@ <constraint name="Magento\Cms\Test\Constraint\AssertCmsBlockOnCategoryPage" /> </variation> <variation name="CreateCmsBlockEntityTestVariation2"> - <data name="issue" xsi:type="string">Bug: MAGETWO-35059</data> <data name="cmsBlock/data/title" xsi:type="string">block_%isolation%</data> <data name="cmsBlock/data/identifier" xsi:type="string">identifier_%isolation%</data> <data name="cmsBlock/data/stores/dataSet/option_0" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php index 60e0ea23b8526546d7ef2dca4f1d92a7c870c99b..7c1cddceb98ec3c10a9706921d161ae55629fec8 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php @@ -9,6 +9,7 @@ namespace Magento\Cms\Test\TestCase; use Magento\Cms\Test\Fixture\CmsPage as CmsPageFixture; use Magento\Cms\Test\Page\Adminhtml\CmsPageIndex; use Magento\Cms\Test\Page\Adminhtml\CmsPageNew; +use Magento\Mtf\Fixture\FixtureFactory; use Magento\Mtf\TestCase\Injectable; /** @@ -29,7 +30,6 @@ class CreateCmsPageEntityTest extends Injectable const MVP = 'yes'; const DOMAIN = 'PS'; const TEST_TYPE = 'acceptance_test'; - const TO_MAINTAIN = 'yes'; /* end tags */ /** @@ -46,33 +46,46 @@ class CreateCmsPageEntityTest extends Injectable */ protected $cmsPageNew; + /** + * Fixture factory. + * + * @var FixtureFactory + */ + protected $fixtureFactory; + /** * Inject pages. * * @param CmsPageIndex $cmsIndex * @param CmsPageNew $cmsPageNew + * @param FixtureFactory $fixtureFactory * @return void */ - public function __inject(CmsPageIndex $cmsIndex, CmsPageNew $cmsPageNew) + public function __inject(CmsPageIndex $cmsIndex, CmsPageNew $cmsPageNew, FixtureFactory $fixtureFactory) { $this->cmsIndex = $cmsIndex; $this->cmsPageNew = $cmsPageNew; + $this->fixtureFactory = $fixtureFactory; } /** * Creating Cms page. * - * @param CmsPageFixture $cms - * @return void + * @param array $data + * @param string $fixtureType + * @return array */ - public function test(CmsPageFixture $cms) + public function test(array $data, $fixtureType) { // Steps + $cms = $this->fixtureFactory->createByCode($fixtureType, ['data' => $data]); $this->cmsIndex->open(); $this->cmsIndex->getPageActionsBlock()->addNew(); //TODO: remove cms page new refresh after resolve issue with static js files publication (MAGETWO-37898) $this->cmsPageNew->open(); $this->cmsPageNew->getPageForm()->fill($cms); $this->cmsPageNew->getPageMainActions()->save(); + + return ['cms' => $cms]; } } diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml index 21c9773ef8a4518f1ebdd6c466585dd4d2749fd2..a549ca390d66817d3c7a2c64590aaa833bd1ed8a 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml @@ -9,10 +9,11 @@ <testCase name="Magento\Cms\Test\TestCase\CreateCmsPageEntityTest"> <variation name="CreateCmsPageEntityTestVariation1"> <data name="description" xsi:type="string">MAGETWO-12399: Create CMS Content Page</data> - <data name="cms/data/title" xsi:type="string">NewCmsPage%isolation%</data> - <data name="cms/data/identifier" xsi:type="string">identifier-%isolation%</data> - <data name="cms/data/store_id" xsi:type="string">All Store Views</data> - <data name="cms/data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> + <data name="fixtureType" xsi:type="string">cmsPage</data> + <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> + <data name="data/identifier" xsi:type="string">identifier-%isolation%</data> + <data name="data/store_id" xsi:type="string">All Store Views</data> + <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> <data name="tag" xsi:type="string">test_type:acceptance_test</data> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageSuccessSaveMessage" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageInGrid" /> @@ -20,20 +21,21 @@ </variation> <variation name="CreateCmsPageEntityTestVariation2"> <data name="description" xsi:type="string">Create page for default store view</data> - <data name="cms/data/title" xsi:type="string">NewCmsPage%isolation%</data> - <data name="cms/data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="cms/data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> + <data name="fixtureType" xsi:type="string">cmsPage</data> + <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> + <data name="data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageSuccessSaveMessage" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageForm" /> </variation> <variation name="CreateCmsPageEntityTestVariation3"> - <data name="issue" xsi:type="string">Bug: MAGETWO-34858</data> <data name="description" xsi:type="string">Create page with widget and system variable</data> - <data name="cms/data/title" xsi:type="string">NewCmsPage%isolation%</data> - <data name="cms/data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="cms/data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> - <data name="cms/data/content/widget/preset" xsi:type="string">default</data> - <data name="cms/data/content/variable" xsi:type="string">General Contact Name</data> + <data name="fixtureType" xsi:type="string">cmsPage</data> + <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> + <data name="data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> + <data name="data/content/widget/preset" xsi:type="string">default</data> + <data name="data/content/variable" xsi:type="string">General Contact Name</data> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageSuccessSaveMessage" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageForm" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageInGrid" /> @@ -41,10 +43,11 @@ </variation> <variation name="CreateCmsPageEntityTestVariation4"> <data name="description" xsi:type="string">Create disabled page</data> - <data name="cms/data/title" xsi:type="string">NewCmsPage%isolation%</data> - <data name="cms/data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="cms/data/is_active" xsi:type="string">Disabled</data> - <data name="cms/data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> + <data name="fixtureType" xsi:type="string">cmsPage</data> + <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> + <data name="data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="data/is_active" xsi:type="string">Disabled</data> + <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageSuccessSaveMessage" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageForm" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageInGrid" /> diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageRewriteEntityTest.php b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageRewriteEntityTest.php index 5023d9a37f2449be13b0c1153842e92014fa779c..5a0511def48fa2e7ac955637e7132367330113b4 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageRewriteEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageRewriteEntityTest.php @@ -75,7 +75,7 @@ class CreateCmsPageRewriteEntityTest extends Injectable //Steps $this->urlRewriteIndex->open(); $this->urlRewriteIndex->getPageActionsBlock()->addNew(); - $this->urlRewriteEdit->getFormBlock()->fill($urlRewrite); + $this->urlRewriteEdit->getUrlRewriteTypeSelectorBlock()->selectType($urlRewrite->getEntityType()); $cmsPage = $urlRewrite->getDataFieldConfig('target_path')['source']->getEntity(); $filter = ['title' => $cmsPage->getTitle()]; $this->urlRewriteEdit->getCmsGridBlock()->searchAndOpen($filter); diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsBlockEntityTest.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsBlockEntityTest.xml index 472e5a6558643e5ba71f676aa4811e555ff98515..048ff19fc06e9c2126be6cf5113afdaaa5349c9a 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsBlockEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsBlockEntityTest.xml @@ -18,7 +18,6 @@ <constraint name="Magento\Cms\Test\Constraint\AssertCmsBlockOnCategoryPage" /> </variation> <variation name="UpdateCmsBlockEntityTestVariation2"> - <data name="issue" xsi:type="string">Bug: MAGETWO-35059</data> <data name="cmsBlock/data/title" xsi:type="string">block_updated_%isolation%</data> <data name="cmsBlock/data/identifier" xsi:type="string">identifier_updated_%isolation%</data> <data name="cmsBlock/data/stores/dataSet/option_0" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsPageEntityTest.php b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsPageEntityTest.php index 8da0baf1779dbb8f1509e4e74ad68bf8fe31d3ea..4c8f8d1cf29e792b75501b2d16471d83671cb0cc 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsPageEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsPageEntityTest.php @@ -32,7 +32,6 @@ class UpdateCmsPageEntityTest extends Injectable /* tags */ const MVP = 'yes'; const DOMAIN = 'PS'; - const STABLE = 'no'; /* end tags */ /** diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/AffectedAttributeSet.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/AffectedAttributeSet.php index 1385164d592ac0608f057730e41b2897938ae55f..c838565a3d1ade69fe36b7cecf324a8bcd7e5402 100755 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/AffectedAttributeSet.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/AffectedAttributeSet.php @@ -10,7 +10,7 @@ use Magento\Mtf\Client\Element; use Magento\Mtf\Client\Locator; use Magento\Mtf\Fixture\FixtureInterface; use Magento\Mtf\Client\Element\SimpleElement; -use Magento\Backend\Test\Block\Widget\Form as ParentForm; +use Magento\Mtf\Block\Form as ParentForm; /** * Class AffectedAttributeSet diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php index 9008800f6dd2ed58aec9821449f7fbd8ac12cd7f..17dc4b9d01f3141652064cfa61f058c34df4b68c 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php @@ -6,7 +6,7 @@ namespace Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Super\Config; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute\AttributeSelector; use Magento\Mtf\Client\Element\SimpleElement; use Magento\Mtf\Client\Locator; @@ -247,7 +247,12 @@ class Attribute extends Form $attributeBlock->find($this->addOption)->click(); } $mapping = $this->dataMapping($option); - $this->_fill($mapping, $optionContainer); + foreach ($mapping as $field) { + $element = $this->getElement($optionContainer, $field); + if ($element->isVisible() && !$element->isDisabled()) { + $element->setValue($field['value']); + } + } } } diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php index d3c32d608a143ce63212eef08da97c7df4372a93..4d2bf2cb8268168557df928f63a3cb0b8cde12c8 100755 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php @@ -21,14 +21,16 @@ class AttributeSelector extends SuggestElement */ public function waitResult() { - $browser = $this; - $selector = $this->searchResult; - $browser->waitUntil( - function () use ($browser, $selector) { - $element = $browser->find($selector); - return $element->isVisible() ? true : null; - } - ); + try { + $this->waitUntil( + function () { + return $this->find($this->searchResult)->isVisible() ? true : null; + } + ); + } catch (\Exception $e) { + // In parallel run on windows change the focus is lost on element + // that causes disappearing of result suggest list. + } } /** diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php index 11db5ed304636b2e2f25019e3c7b08bc5d8ac1f5..8ecdc5aa867ac14b09de37a8dfc480144d468b6f 100755 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php @@ -8,7 +8,7 @@ namespace Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Supe use Magento\Mtf\Client\Locator; use Magento\Backend\Test\Block\Template; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Element\SimpleElement; /** diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/ProductForm.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/ProductForm.php index 1fbc66894cebacdfb377b9a2edc64a5e04fa17a1..6b79d3f4378eb68c03306271d9f951fae10259cd 100755 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/ProductForm.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/ProductForm.php @@ -34,6 +34,7 @@ class ProductForm extends \Magento\Catalog\Test\Block\Adminhtml\Product\ProductF } $this->showAdvancedSettings(); + $this->getTab('variations')->showContent(); return $this->fillTabs($tabs, $element); } } diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml index 4ffc8f05740d4454c14ded3bdc171699a7d93c1c..333fd02a273cdf57938df7df7fa4e9e801d26537 100644 --- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml +++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<mapping strict="0"> +<mapping strict="1"> <wrapper>rate</wrapper> <fields> <rate> diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/CurrencySymbolForm.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/CurrencySymbolForm.php index 2f758e545f4821b7f8fc3fc271881099d2c70d82..33e1e795ca940f4dc40ade7b565ba87969a0c54f 100644 --- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/CurrencySymbolForm.php +++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/CurrencySymbolForm.php @@ -34,6 +34,10 @@ class CurrencySymbolForm extends Form public function fill(FixtureInterface $fixture, SimpleElement $element = null) { $element = $this->_rootElement->find(sprintf($this->currencyRow, $fixture->getCode()), Locator::SELECTOR_XPATH); - return parent::fill($fixture, $element); + $data = $fixture->getData(); + unset($data['code']); + $mapping = $this->dataMapping($data); + $this->_fill($mapping, $element); + return $this; } } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/Group/Edit/Form.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/Group/Edit/Form.php index b262872d048e724c5c3fc5570cb79e82b6030db4..e840b736e06357961ff3446ab37e661e27d93e58 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/Group/Edit/Form.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/Group/Edit/Form.php @@ -6,15 +6,10 @@ namespace Magento\Customer\Test\Block\Adminhtml\Group\Edit; -use Magento\Backend\Test\Block\Widget\Form as AbstractForm; - /** - * Class Form - * Customer group edit form - * - * @package Magento\Customer\Test\Block\Adminhtml\Group\Edit + * Customer group edit form. */ -class Form extends AbstractForm +class Form extends \Magento\Mtf\Block\Form { // } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomer.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomer.php deleted file mode 100644 index 744387049f2bc348cc2ea1ad106c6d472e3c885b..0000000000000000000000000000000000000000 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomer.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Customer\Test\Handler\Curl; - -use Magento\Mtf\Fixture\FixtureInterface; -use Magento\Mtf\Handler\Curl; -use Magento\Mtf\Util\Protocol\CurlInterface; -use Magento\Mtf\Util\Protocol\CurlTransport; - -/** - * Class CreateCustomer. - * Curl handler for creating customer through registration page. - * - */ -class CreateCustomer extends Curl -{ - /** - * Post request for creating customer - * - * @param FixtureInterface $fixture [optional] - * @return mixed|string - */ - public function persist(FixtureInterface $fixture = null) - { - $data = $fixture->getData('fields'); - $fields = []; - foreach ($data as $key => $field) { - $fields[$key] = $field['value']; - } - $url = $_ENV['app_frontend_url'] . 'customer/account/createpost/?nocookie=true'; - $curl = new CurlTransport(); - $curl->write(CurlInterface::POST, $url, '1.0', [], $fields); - $response = $curl->read(); - $curl->close(); - - return $response; - } -} diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomerBackend.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomerBackend.php deleted file mode 100644 index cad3c992efa4681f8bf0851d50fa211c22aad7cc..0000000000000000000000000000000000000000 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomerBackend.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Customer\Test\Handler\Curl; - -use Magento\Mtf\Fixture\FixtureInterface; -use Magento\Mtf\Handler\Curl; -use Magento\Mtf\Util\Protocol\CurlInterface; -use Magento\Mtf\Util\Protocol\CurlTransport; -use Magento\Mtf\Util\Protocol\CurlTransport\BackendDecorator; - -/** - * Curl handler for creating customer in admin - * - */ -class CreateCustomerBackend extends Curl -{ - /** - * Prepare POST data for creating customer request - * - * @param FixtureInterface $fixture - * @return array - */ - protected function _prepareData(FixtureInterface $fixture) - { - $data = $fixture->getData('fields'); - foreach ($data as $key => $values) { - $value = $this->_getValue($values); - if (null === $value) { - continue; - } - $data[$key] = $value; - } - - $curlData['account'] = $data; - return $curlData; - } - - /** - * Retrieve field value or return null if value does not exist - * - * @param array $values - * @return null|mixed - */ - protected function _getValue($values) - { - if (!isset($values['value'])) { - return null; - } - return isset($values['input_value']) ? $values['input_value'] : $values['value']; - } - - /** - * Post request for creating customer in backend - * - * @param FixtureInterface $fixture [optional] - * @return mixed|string - */ - public function persist(FixtureInterface $fixture = null) - { - $params = $this->_prepareData($fixture); - - $url = $_ENV['app_backend_url'] . 'customer/index/save/active_tab/account'; - $curl = new BackendDecorator(new CurlTransport(), $this->_configuration); - $curl->addOption(CURLOPT_HEADER, 1); - $curl->write(CurlInterface::POST, $url, '1.0', [], $params); - $response = $curl->read(); - $curl->close(); - - return $response; - } -} diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/SaveCustomerWithAddress.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/SaveCustomerWithAddress.php deleted file mode 100644 index 43456cb34eec54dc87dd5f795753e44e06856fd7..0000000000000000000000000000000000000000 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/SaveCustomerWithAddress.php +++ /dev/null @@ -1,147 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Customer\Test\Handler\Curl; - -use Magento\Mtf\Fixture\FixtureInterface; -use Magento\Mtf\Handler\Curl; -use Magento\Mtf\Util\Protocol\CurlInterface; -use Magento\Mtf\Util\Protocol\CurlTransport; - -/** - * Curl handler for saving customer address in admin - * - */ -class SaveCustomerWithAddress extends Curl -{ - /** - * Url for saving data - * - * @var string - */ - protected $saveUrl = '/customer/address/formPost/?nocookie=true'; - - /** - * Url for saving customer - * - * @var string - */ - protected $saveCustomer = 'customer/account/createpost/?nocookie=true'; - - /** - * Url of new address form - * - * @var string - */ - protected $addressNew = '/customer/address/new/?nocookie=true'; - - /** - * Form key - * - * @var string - */ - protected $formKey; - - /** - * Prepare POST data for creating customer request - * - * @param array $data - * @return array - */ - protected function prepareData($data) - { - $curlData = []; - foreach ($data as $key => $values) { - $value = $this->getValue($values); - if (null === $value) { - continue; - } - $curlData[$key] = $value; - } - $curlData['success_url'] = ''; - $curlData['error_url'] = ''; - $curlData['default_billing'] = 1; - $curlData['default_shipping'] = 1; - - return $curlData; - } - - /** - * Retrieve field value or return null if value does not exist - * - * @param array $values - * @return null|mixed - */ - protected function getValue($values) - { - if (!isset($values['value'])) { - return null; - } - return isset($values['input_value']) ? $values['input_value'] : $values['value']; - } - - /** - * Execute handler - * - * @param FixtureInterface $fixture - * @return mixed - */ - public function persist(FixtureInterface $fixture = null) - { - /** @var \Magento\Customer\Test\Fixture\Customer $fixture */ - $address = $fixture->getDefaultBilling(); - $fields = $this->prepareData($address->getData('fields')); - $url = $_ENV['app_frontend_url'] . $this->saveUrl; - $curl = $this->saveCustomer($fixture); - $fields['form_key'] = $this->formKey; - $curl->write(CurlInterface::POST, $url, '1.0', [], $fields); - $response = $curl->read(); - $curl->close(); - - return $response; - } - - /** - * Get from key from response - * - * @param string $response - * @return string - */ - protected function getFromKey($response) - { - preg_match('/input name="form_key" type="hidden" value="(\w+)"/', $response, $matches); - $formKey = ''; - if (!empty($matches[1])) { - $formKey = $matches[1]; - } - return $formKey; - } - - /** - * Save new customer and get form key - * - * @param \Magento\Customer\Test\Fixture\Customer $fixture - * @return CurlTransport - */ - protected function saveCustomer(\Magento\Customer\Test\Fixture\Customer $fixture) - { - $data = $fixture->getData('fields'); - $fields = []; - foreach ($data as $key => $field) { - $fields[$key] = $field['value']; - } - $url = $_ENV['app_frontend_url'] . $this->saveCustomer; - $curl = new CurlTransport(); - $curl->write(CurlInterface::POST, $url, '1.0', [], $fields); - $curl->read(); - $urlForm = $_ENV['app_frontend_url'] . $this->addressNew; - $curl->write(CurlInterface::GET, $urlForm, '1.0', []); - $response = $curl->read(); - $this->formKey = $this->getFromKey($response); - - return $curl; - } -} diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php index a13c263aeab7fe4db7e475dc11ee6f668fbfe4a8..2d8f5faf09f8860b6d20b3e5a08bdc2ca5b21c0f 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php @@ -195,23 +195,27 @@ class Curl extends AbstractCurl implements CustomerInterface */ protected function prepareAddressData(array $curlData) { + $address = []; foreach (array_keys($curlData['address']) as $key) { - $curlData['address'][$key]['_deleted'] = ''; - $curlData['address'][$key]['region'] = ''; - if (!is_array($curlData['address'][$key]['street'])) { - $street = $curlData['address'][$key]['street']; - $curlData['address'][$key]['street'] = []; - $curlData['address'][$key]['street'][] = $street; + $addressKey = 'new_' . $key; + $address[$addressKey] = $curlData['address'][$key]; + $address[$addressKey]['_deleted'] = ''; + $address[$addressKey]['region'] = ''; + if (!is_array($address[$addressKey]['street'])) { + $street = $address[$addressKey]['street']; + $address[$addressKey]['street'] = []; + $address[$addressKey]['street'][] = $street; } - if (isset($curlData['address'][$key]['default_billing'])) { - $value = $curlData['address'][$key]['default_billing'] === 'Yes' ? 'true' : 'false'; - $curlData['address'][$key]['default_billing'] = $value; + if (isset($address[$addressKey]['default_billing'])) { + $value = $address[$addressKey]['default_billing'] === 'Yes' ? 'true' : 'false'; + $address[$addressKey]['default_billing'] = $value; } - if (isset($curlData['address'][$key]['default_shipping'])) { - $value = $curlData['address'][$key]['default_shipping'] === 'Yes' ? 'true' : 'false'; - $curlData['address'][$key]['default_shipping'] = $value; + if (isset($address[$addressKey]['default_shipping'])) { + $value = $address[$addressKey]['default_shipping'] === 'Yes' ? 'true' : 'false'; + $address[$addressKey]['default_shipping'] = $value; } } + $curlData['address'] = $address; return $curlData; } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Ui/CreateAddress.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Ui/CreateAddress.php deleted file mode 100644 index b2e9bdd33d69766478fad90cc5c20634f96f45f6..0000000000000000000000000000000000000000 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Ui/CreateAddress.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Customer\Test\Handler\Ui; - -use Magento\Mtf\Factory\Factory; -use Magento\Mtf\Fixture\FixtureInterface; - -/** - * UI handler for creating customer address. - */ -class CreateAddress extends \Magento\Mtf\Handler\Ui -{ - /** - * Execute handler - * - * @param FixtureInterface $fixture [optional] - * @return mixed - */ - public function persist(FixtureInterface $fixture = null) - { - /** @var \Magento\Customer\Test\Fixture\Address $fixture */ - // Pages - $loginPage = Factory::getPageFactory()->getCustomerAccountLogin(); - $addressPage = Factory::getPageFactory()->getCustomerAddressEdit(); - - $loginPage->open(); - if ($loginPage->getLoginBlock()->isVisible()) { - $loginPage->getLoginBlock()->login($fixture->getCustomer()); - } - - $addressPage->open(); - $addressPage->getEditForm()->editCustomerAddress($fixture); - } -} diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Webapi/CreateCustomer.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Webapi/CreateCustomer.php deleted file mode 100644 index af06e68b03ef85b14d92d27f4044803de10e059b..0000000000000000000000000000000000000000 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Webapi/CreateCustomer.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Customer\Test\Handler\Webapi; - -use Magento\Mtf\Fixture\FixtureInterface; -use Magento\Mtf\Handler\Webapi; -use Magento\Mtf\Util\Protocol\SoapTransport; - -/** - * Class CreateCustomer - * - */ -class CreateCustomer extends Webapi -{ - /** - * Create customer through request - * - * @param FixtureInterface $fixture [optional] - * @return mixed - */ - public function persist(FixtureInterface $fixture = null) - { - $configuration = $this->_configuration->get('handler/0/webapi/0/value'); - - $soap = new SoapTransport($configuration['soap']); - return $soap->call('customerCustomerList', $fixture->getData()); - } -} diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.php index 6012db8cdd17d501e64154dfe8892b8c14dcc2f3..ab84bfc693502818ea324506b9ff465771960798 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.php @@ -25,8 +25,8 @@ class Address extends AbstractRepository 'data' => $defaultData, ]; - $this->_data['address_US_1'] = $this->_getUS1(); - $this->_data['address_US_2'] = $this->_getUS2(); + $this->_data['US_address_1'] = $this->_getUS1(); + $this->_data['US_address_2'] = $this->_getUS2(); $this->_data['address_UK'] = $this->getAddressUK(); $this->_data['address_UK_2'] = $this->getAddressUK2(); $this->_data['address_UK_with_VAT'] = $this->getAddressUKWithVAT($this->_data['address_UK']); diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml index e379604530bcdc5cbafede7c11370a74e5639b94..b39490b24c48af4d2b10c1ac7e45fdc7d4a367d0 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml @@ -37,21 +37,6 @@ <field name="default_shipping" xsi:type="string">No</field> </dataset> - <dataset name="US_NY_address_billing"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="street" xsi:type="string">6262 Fifth Avenue</field> - <field name="city" xsi:type="string">New York</field> - <field name="region_id" xsi:type="string">New York</field> - <field name="postcode" xsi:type="string">90230</field> - <field name="country_id" xsi:type="string">United States</field> - <field name="telephone" xsi:type="string">555-55-555-55</field> - <field name="default_billing" xsi:type="string">No</field> - <field name="default_shipping" xsi:type="string">No</field> - </dataset> - <dataset name="US_address_default_shipping"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe</field> @@ -67,43 +52,42 @@ <field name="default_shipping" xsi:type="string">No</field> </dataset> - <dataset name="default_US_address"> + <dataset name="US_address_1"> + <field name="firstname" xsi:type="string">John</field> + <field name="lastname" xsi:type="string">Doe</field> <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="street" xsi:type="string">6161 West Centinela Avenue</field> + <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> <field name="city" xsi:type="string">Culver City</field> - <field name="region_id" xsi:type="string">California</field> + <field name="street" xsi:type="string">6161 West Centinela Avenue</field> <field name="postcode" xsi:type="string">90230</field> <field name="country_id" xsi:type="string">United States</field> + <field name="region_id" xsi:type="string">California</field> <field name="telephone" xsi:type="string">555-55-555-55</field> - <field name="default_billing" xsi:type="string">Yes</field> - <field name="default_shipping" xsi:type="string">Yes</field> </dataset> - <dataset name="US_address_without_email"> + <dataset name="US_address_1_without_email"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe</field> <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="street" xsi:type="string">6161 West Centinela Avenue</field> <field name="city" xsi:type="string">Culver City</field> - <field name="region_id" xsi:type="string">California</field> + <field name="street" xsi:type="string">6161 West Centinela Avenue</field> <field name="postcode" xsi:type="string">90230</field> <field name="country_id" xsi:type="string">United States</field> + <field name="region_id" xsi:type="string">California</field> <field name="telephone" xsi:type="string">555-55-555-55</field> </dataset> - <dataset name="US_address_NY"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> + <dataset name="US_address_2"> + <field name="firstname" xsi:type="string">Billy</field> + <field name="lastname" xsi:type="string">Holiday</field> <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="street" xsi:type="string">3222 Cliffside Drive</field> - <field name="city" xsi:type="string">Binghamton</field> - <field name="region_id" xsi:type="string">New York</field> - <field name="postcode" xsi:type="string">13901</field> + <field name="email" xsi:type="string">b.holliday@example.net</field> + <field name="city" xsi:type="string">New York</field> + <field name="street" xsi:type="string">727 5th Ave</field> + <field name="postcode" xsi:type="string">10022</field> <field name="country_id" xsi:type="string">United States</field> - <field name="telephone" xsi:type="string">607-481-7802</field> - <field name="default_billing" xsi:type="string">Yes</field> - <field name="default_shipping" xsi:type="string">Yes</field> + <field name="region_id" xsi:type="string">New York</field> + <field name="telephone" xsi:type="string">777-77-77-77</field> </dataset> <dataset name="US_address_TX"> @@ -121,21 +105,37 @@ <field name="default_shipping" xsi:type="string">Yes</field> </dataset> - <dataset name="customer_US"> + <dataset name="US_address_NY"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">JohnDoe_%isolation%@example.com</field> + <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="city" xsi:type="string">Culver City</field> - <field name="street" xsi:type="string">6161 West Centinela Avenue</field> + <field name="street" xsi:type="string">3222 Cliffside Drive</field> + <field name="city" xsi:type="string">Binghamton</field> + <field name="region_id" xsi:type="string">New York</field> + <field name="postcode" xsi:type="string">13901</field> + <field name="country_id" xsi:type="string">United States</field> + <field name="telephone" xsi:type="string">607-481-7802</field> + <field name="default_billing" xsi:type="string">Yes</field> + <field name="default_shipping" xsi:type="string">Yes</field> + </dataset> + + <dataset name="US_address_NY_default_no"> + <field name="firstname" xsi:type="string">John</field> + <field name="lastname" xsi:type="string">Doe</field> + <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> + <field name="company" xsi:type="string">Magento %isolation%</field> + <field name="street" xsi:type="string">6262 Fifth Avenue</field> + <field name="city" xsi:type="string">New York</field> + <field name="region_id" xsi:type="string">New York</field> <field name="postcode" xsi:type="string">90230</field> <field name="country_id" xsi:type="string">United States</field> - <field name="region_id" xsi:type="string">California</field> <field name="telephone" xsi:type="string">555-55-555-55</field> - <field name="fax" xsi:type="string">555-55-555-55</field> + <field name="default_billing" xsi:type="string">No</field> + <field name="default_shipping" xsi:type="string">No</field> </dataset> - <dataset name="customer_UK"> + <dataset name="UK_address_default_billing"> <field name="firstname" xsi:type="string">Jane</field> <field name="lastname" xsi:type="string">Doe</field> <field name="email" xsi:type="string">JaneDoe_%isolation%@example.com</field> @@ -147,9 +147,11 @@ <field name="region" xsi:type="string">London</field> <field name="telephone" xsi:type="string">444-44-444-44</field> <field name="fax" xsi:type="string">444-44-444-44</field> + <field name="default_billing" xsi:type="string">Yes</field> + <field name="default_shipping" xsi:type="string">Yes</field> </dataset> - <dataset name="address_UK_default_billing_address"> + <dataset name="UK_address"> <field name="firstname" xsi:type="string">Jane</field> <field name="lastname" xsi:type="string">Doe</field> <field name="email" xsi:type="string">JaneDoe_%isolation%@example.com</field> @@ -161,61 +163,9 @@ <field name="region" xsi:type="string">London</field> <field name="telephone" xsi:type="string">444-44-444-44</field> <field name="fax" xsi:type="string">444-44-444-44</field> - <field name="default_billing" xsi:type="string">Yes</field> - <field name="default_shipping" xsi:type="string">Yes</field> - </dataset> - - <dataset name="address_US_1"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> - <field name="city" xsi:type="string">Culver City</field> - <field name="street" xsi:type="string">6161 West Centinela Avenue</field> - <field name="postcode" xsi:type="string">90230</field> - <field name="country_id" xsi:type="string">United States</field> - <field name="region_id" xsi:type="string">California</field> - <field name="telephone" xsi:type="string">555-55-555-55</field> - </dataset> - - <dataset name="address_US_2"> - <field name="firstname" xsi:type="string">Billy</field> - <field name="lastname" xsi:type="string">Holiday</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="email" xsi:type="string">b.holliday@example.net</field> - <field name="city" xsi:type="string">New York</field> - <field name="street" xsi:type="string">727 5th Ave</field> - <field name="postcode" xsi:type="string">10022</field> - <field name="country_id" xsi:type="string">United States</field> - <field name="region_id" xsi:type="string">New York</field> - <field name="telephone" xsi:type="string">777-77-77-77</field> - </dataset> - - <dataset name="address_data_US_1"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="city" xsi:type="string">Culver City</field> - <field name="street" xsi:type="string">6161 West Centinela Avenue</field> - <field name="postcode" xsi:type="string">90230</field> - <field name="country_id" xsi:type="string">United States</field> - <field name="region_id" xsi:type="string">California</field> - <field name="telephone" xsi:type="string">555-55-555-55</field> - </dataset> - - <dataset name="address_DE"> - <field name="firstname" xsi:type="string">Jan</field> - <field name="lastname" xsi:type="string">Jansen</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="city" xsi:type="string">Berlin</field> - <field name="street" xsi:type="string">Augsburger Strabe 41</field> - <field name="postcode" xsi:type="string">10789</field> - <field name="country_id" xsi:type="string">Germany</field> - <field name="region_id" xsi:type="string">Berlin</field> - <field name="telephone" xsi:type="string">333-33-333-33</field> </dataset> - <dataset name="address_UK"> + <dataset name="UK_address_without_email"> <field name="firstname" xsi:type="string">Jane</field> <field name="lastname" xsi:type="string">Doe</field> <field name="company" xsi:type="string">Magento %isolation%</field> @@ -223,23 +173,12 @@ <field name="street" xsi:type="string">172, Westminster Bridge Rd</field> <field name="postcode" xsi:type="string">SE1 7RW</field> <field name="country_id" xsi:type="string">United Kingdom</field> - <field name="region_id" xsi:type="string">London</field> - <field name="telephone" xsi:type="string">444-44-444-44</field> - </dataset> - - <dataset name="address_UK_2"> - <field name="firstname" xsi:type="string">Jane</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="city" xsi:type="string">Manchester</field> - <field name="street" xsi:type="string">42 King Street West</field> - <field name="postcode" xsi:type="string">M3 2WY</field> - <field name="country_id" xsi:type="string">United Kingdom</field> - <field name="region_id" xsi:type="string">Manchester</field> + <field name="region" xsi:type="string">London</field> <field name="telephone" xsi:type="string">444-44-444-44</field> + <field name="fax" xsi:type="string">444-44-444-44</field> </dataset> - <dataset name="address_UK_with_VAT"> + <dataset name="UK_address_with_VAT"> <field name="firstname" xsi:type="string">Jane</field> <field name="lastname" xsi:type="string">Doe</field> <field name="company" xsi:type="string">Magento %isolation%</field> @@ -253,5 +192,17 @@ <field name="default_billing" xsi:type="string">Yes</field> <field name="default_shipping" xsi:type="string">Yes</field> </dataset> + + <dataset name="DE_address"> + <field name="firstname" xsi:type="string">Jan</field> + <field name="lastname" xsi:type="string">Jansen</field> + <field name="company" xsi:type="string">Magento %isolation%</field> + <field name="city" xsi:type="string">Berlin</field> + <field name="street" xsi:type="string">Augsburger Strabe 41</field> + <field name="postcode" xsi:type="string">10789</field> + <field name="country_id" xsi:type="string">Germany</field> + <field name="region_id" xsi:type="string">Berlin</field> + <field name="telephone" xsi:type="string">333-33-333-33</field> + </dataset> </repository> </config> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml index a3eb0e57b62a60790483e504a2f020e7252744b0..2dc95ab415c6d8bebb759f0726e17366ed87a627 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml @@ -76,22 +76,6 @@ </field> </dataset> - <dataset name="customer_US"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">JohnDoe_%isolation%@example.com</field> - <field name="password" xsi:type="string">123123q</field> - <field name="password_confirmation" xsi:type="string">123123q</field> - </dataset> - - <dataset name="customer_UK"> - <field name="firstname" xsi:type="string">Jane</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">JaneDoe_%isolation%@example.com</field> - <field name="password" xsi:type="string">123123q</field> - <field name="password_confirmation" xsi:type="string">123123q</field> - </dataset> - <dataset name="johndoe_unique"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe%isolation%</field> @@ -144,7 +128,7 @@ <field name="password" xsi:type="string">123123q</field> <field name="password_confirmation" xsi:type="string">123123q</field> <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_US_1</item> + <item name="presets" xsi:type="string">US_address_1</item> </field> </dataset> @@ -158,29 +142,18 @@ <field name="password" xsi:type="string">123123q</field> <field name="password_confirmation" xsi:type="string">123123q</field> <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_US_1</item> + <item name="presets" xsi:type="string">US_address_1</item> </field> </dataset> - <dataset name="customer_US_1"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe%isolation%</field> - <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> - <field name="password" xsi:type="string">123123q</field> - <field name="password_confirmation" xsi:type="string">123123q</field> - <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_US_1</item> - </field> - </dataset> - - <dataset name="customer_UK_1"> + <dataset name="customer_US"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe%isolation%</field> <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> <field name="password" xsi:type="string">123123q</field> <field name="password_confirmation" xsi:type="string">123123q</field> <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_UK</item> + <item name="presets" xsi:type="string">US_address_1</item> </field> </dataset> @@ -191,7 +164,7 @@ <field name="password" xsi:type="string">123123q</field> <field name="password_confirmation" xsi:type="string">123123q</field> <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_UK_default_billing_address</item> + <item name="presets" xsi:type="string">UK_address_default_billing</item> </field> </dataset> @@ -202,7 +175,7 @@ <field name="password" xsi:type="string">123123q</field> <field name="password_confirmation" xsi:type="string">123123q</field> <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_UK_with_VAT</item> + <item name="presets" xsi:type="string">UK_address_with_VAT</item> </field> </dataset> </repository> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php index ca15d9116263c4bf2b2fcf6fe9e9d91bbb27a796..aebcf4f2695ab88ee2d565c5012d4dd9dcbf2766 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php @@ -13,11 +13,9 @@ use Magento\Customer\Test\Page\CustomerAccountLogout; use Magento\Mtf\TestCase\Injectable; /** - * Test Creation for CreateExistingCustomerFrontendEntity - * - * Test Flow: * Preconditions: - * 1.Customer is created + * 1.Customer is created. + * * Steps: * 1. Go to frontend. * 2. Click Register link. @@ -36,14 +34,14 @@ class CreateExistingCustomerFrontendEntity extends Injectable /* end tags */ /** - * Page CustomerAccountCreate + * Page CustomerAccountCreate. * * @var CustomerAccountCreate */ protected $customerAccountCreate; /** - * Page CustomerAccountLogout + * Page CustomerAccountLogout. * * @var CustomerAccountLogout */ @@ -57,51 +55,48 @@ class CreateExistingCustomerFrontendEntity extends Injectable protected $cmsIndex; /** - * Injection data + * Inject pages. * * @param CustomerAccountCreate $customerAccountCreate * @param CustomerAccountLogout $customerAccountLogout * @param CmsIndex $cmsIndex - * @param Customer $customer * @return array */ public function __inject( CustomerAccountCreate $customerAccountCreate, CustomerAccountLogout $customerAccountLogout, - CmsIndex $cmsIndex, - Customer $customer + CmsIndex $cmsIndex ) { $this->customerAccountLogout = $customerAccountLogout; $this->customerAccountCreate = $customerAccountCreate; $this->cmsIndex = $cmsIndex; - //Precondition - $customer->persist(); - return [ - 'customer' => $customer, - ]; } /** - * Create Existing Customer account on frontend + * Create Existing Customer account on frontend. * * @param Customer $customer * @return void */ public function testCreateExistingCustomer(Customer $customer) { - //Steps + // Precondition + $existingCustomer = clone $customer; + $customer->persist(); + + // Steps $this->cmsIndex->open(); $this->cmsIndex->getLinksBlock()->openLink('Create an Account'); - $this->customerAccountCreate->getRegisterForm()->registerCustomer($customer); + $this->customerAccountCreate->getRegisterForm()->registerCustomer($existingCustomer); } /** - * Logout customer from frontend account + * Logout customer from frontend account. * * @return void */ public function tearDown() { - $this->customerAccountLogout->open(); + $this->objectManager->create('Magento\Customer\Test\TestStep\LogoutCustomerOnFrontendStep')->run(); } } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.xml index 7c8b8ff68e45d059212dd8b1403f175a098f7b02..3fbdcf50f62d855f3aba5c3566609a72e0b34c8e 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.xml @@ -6,9 +6,14 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Customer\Test\TestCase\CreateExistingCustomerFrontendEntity"> - <variation name="CreateExistingCustomerFrontendEntityVariation1"> - <constraint name="Magento\Customer\Test\Constraint\AssertCustomerFailRegisterMessage"/> - </variation> - </testCase> + <testCase name="Magento\Customer\Test\TestCase\CreateExistingCustomerFrontendEntity"> + <variation name="CreateExistingCustomerFrontendEntityVariation1"> + <data name="customer/data/firstname" xsi:type="string">john</data> + <data name="customer/data/lastname" xsi:type="string">doe</data> + <data name="customer/data/email" xsi:type="string">johndoe%isolation%@example.com</data> + <data name="customer/data/password" xsi:type="string">123123q</data> + <data name="customer/data/password_confirmation" xsi:type="string">123123q</data> + <constraint name="Magento\Customer\Test\Constraint\AssertCustomerFailRegisterMessage" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerAddressTest.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerAddressTest.xml index f998fde69cd1802f9eb05e63c6ae26622301b614..d4c96eef41e1caf37de7b2357dbfba0dec7e7350 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerAddressTest.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerAddressTest.xml @@ -9,7 +9,7 @@ <testCase name="Magento\Customer\Test\TestCase\DeleteCustomerAddressTest"> <variation name="DeleteCustomerAddressTestVariation1"> <data name="customer/dataSet" xsi:type="string">default</data> - <data name="customer/data/address/presets" xsi:type="string">US_address_default_billing,US_NY_address_billing</data> + <data name="customer/data/address/presets" xsi:type="string">US_address_default_billing,US_address_NY_default_no</data> <constraint name="Magento\Customer\Test\Constraint\AssertAddressDeletedFrontend"/> <constraint name="Magento\Customer\Test\Constraint\AssertAddressDeletedBackend"/> </variation> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.xml index 28a5aa51e2f9bfb87966e81d9f6e77129c2f070a..42e10059a897b80bc35e7c0bccffb34f56469c75 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.xml @@ -8,7 +8,7 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Customer\Test\TestCase\ForgotPasswordOnFrontendTest"> <variation name="ForgotPasswordOnFrontendTestVariation1"> - <data name="customer/dataSet" xsi:type="string">customer_US_1</data> + <data name="customer/dataSet" xsi:type="string">customer_US</data> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerForgotPasswordSuccessMessage" /> </variation> </testCase> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.php index 2892af943fdd10dde6a8f51e40fa4580fe885047..63308bbea50d1103e598c31a2d40558952ce77d6 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.php @@ -135,14 +135,4 @@ class UpdateCustomerFrontendEntityTest extends Injectable $this->customerAddressEdit->getEditForm()->fill($address); $this->customerAddressEdit->getEditForm()->saveAddress(); } - - /** - * Customer logout from account - * - * @return void - */ - public function tearDown() - { - $this->objectManager->create('Magento\Customer\Test\TestStep\LogoutCustomerOnFrontendStep')->run(); - } } diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php b/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php index 04aa6c4ca73d61e4ef01e61ac9929d9a225d2b59..22b8d54518de92625349f1aa55fdf5cc7044695b 100644 --- a/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php +++ b/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php @@ -25,7 +25,7 @@ use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencyIndex; * 5. Perform assertions. * * @group Localization_(PS) - * @ZephyrId MAGETWO-12427, MAGETWO-36824 + * @ZephyrId MAGETWO-36824 */ class CreateCurrencyRateTest extends Injectable { diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml index 69a8cb56138fc5d25a46a3eb72ac00e5dd66be17..10ba00e4d5db1f8c1791e7c96b82c0ddde64d343 100644 --- a/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml @@ -114,7 +114,6 @@ <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">10</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/weight" xsi:type="string">10</data> <data name="product/data/special_price" xsi:type="string">40</data> <data name="isRequired" xsi:type="string">No</data> <data name="product/data/url_key" xsi:type="string">downloadableproduct-%isolation%</data> diff --git a/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml index 5ea75d0854c3181fe54dba66db63c67499935f26..846ea00925857a42c33c6fc80933cf69d7760a19 100644 --- a/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml +++ b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml @@ -11,9 +11,9 @@ <data name="description" xsi:type="string">Check Out as Guest using FedEx with US shipping origin and UK customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">guest</data> - <data name="customer/dataSet" xsi:type="string">customer_UK</data> - <data name="address/dataSet" xsi:type="string">customer_UK</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_UK</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="address/dataSet" xsi:type="string">UK_address</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address</data> <data name="shipping/shipping_service" xsi:type="string">Federal Express</data> <data name="shipping/shipping_method" xsi:type="string">International Economy</data> <data name="cart/data/shipping_method" xsi:type="string">International Economy</data> diff --git a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml index 18f90c0f3157a1fc6295e3647311913f2fcf3f84..b6433e7ad8ed1e3a5d3715920b9e4f7cc85f4e47 100644 --- a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml +++ b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml @@ -9,8 +9,8 @@ <testCase name="Magento\GiftMessage\Test\TestCase\CheckoutWithGiftMessagesTest"> <variation name="CheckoutWithGiftMessagesTestVariation1"> <data name="products" xsi:type="string">catalogProductSimple::default, catalogProductVirtual::default</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="checkoutMethod" xsi:type="string">login</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> @@ -26,8 +26,8 @@ </variation> <variation name="CheckoutWithGiftMessagesTestVariation2"> <data name="products" xsi:type="string">catalogProductSimple::default, catalogProductVirtual::default</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="checkoutMethod" xsi:type="string">login</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> diff --git a/dev/tests/functional/tests/app/Magento/ImportExport/Test/Fixture/ImportExport.xml b/dev/tests/functional/tests/app/Magento/ImportExport/Test/Fixture/ImportExport.xml index 01f5463b5f052fac98c49d795f3ac38e4979139f..ac1253f96a0c0d1486389a3bf354b1842e4df1ac 100644 --- a/dev/tests/functional/tests/app/Magento/ImportExport/Test/Fixture/ImportExport.xml +++ b/dev/tests/functional/tests/app/Magento/ImportExport/Test/Fixture/ImportExport.xml @@ -6,22 +6,22 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd"> - <fixture name="importExport" module="Magento_ImportExport" type="flat" entity_type="importexport_importdata" class="Magento\ImportExport\Test\Fixture\ImportExport"> - <dataset name="default"> - <field name="entity" xsi:type="string">Products</field> - <field name="behavior" xsi:type="string">CSV</field> - </dataset> - <field name="id" is_required="1"> - <default_value xsi:type="null"/> - </field> - <field name="entity" is_required=""> - <default_value xsi:type="string">Products</default_value> - </field> - <field name="behavior" is_required=""> - <default_value xsi:type="string">CSV</default_value> - </field> - <field name="data_export" is_required=""> - <default_value xsi:type="null"/> - </field> - </fixture> + <fixture name="importExport" module="Magento_ImportExport" type="flat" entity_type="importexport_importdata" class="Magento\ImportExport\Test\Fixture\ImportExport"> + <dataset name="default"> + <field name="entity" xsi:type="string">Products</field> + <field name="behavior" xsi:type="string">CSV</field> + </dataset> + <field name="id" is_required="1"> + <default_value xsi:type="null" /> + </field> + <field name="entity" is_required=""> + <default_value xsi:type="string">Products</default_value> + </field> + <field name="file_format" is_required=""> + <default_value xsi:type="string">CSV</default_value> + </field> + <field name="data_export" is_required=""> + <default_value xsi:type="null" /> + </field> + </fixture> </config> diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CreateAdmin.xml b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CreateAdmin.xml index 3f1616de3dbd0340573923778b6036b34776df03..b21f140454da51bf0b7428fd6d515c84b52534b6 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CreateAdmin.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CreateAdmin.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<mapping strict="0"> +<mapping strict="1"> <fields> <username> <selector>[name='adminUsername']</selector> diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.php b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.php index e9e81483fa4943a59bb69b5f31ca0bb2552d954e..efe02fa2148c8c0108b0324d6790ab31df0c78c2 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.php @@ -24,11 +24,11 @@ class CustomizeStore extends Form protected $next = "[ng-click*='checkModuleConstraints']"; /** - * First field selector + * Module configuration section. * * @var string */ - protected $firstField = '[ng-model*="language"]'; + protected $moduleConfiguration = '.customize-your-store-advanced'; /** * Click on 'Next' button. @@ -49,7 +49,17 @@ class CustomizeStore extends Form */ public function fill(FixtureInterface $fixture, SimpleElement $element = null) { - $this->waitForElementVisible($this->firstField); - return parent::fill($fixture, $element); + $this->waitForElementVisible($this->moduleConfiguration); + $data = $fixture->getData(); + $storeData = []; + foreach ($data as $key => $value) { + if (strpos($key, 'store') === 0) { + $storeData[$key] = $value; + } + } + $mapping = $this->dataMapping($storeData); + $this->_fill($mapping, $element); + + return $this; } } diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.xml b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.xml index 24eaf10fa6a1ae9b5c06b4b06d41736b6e36f93d..8c99894d4e76836ccdd88c30f6498f6fbaba0c00 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.xml @@ -7,13 +7,13 @@ --> <mapping strict="0"> <fields> - <currency> - <selector>[ng-model*='currency']</selector> + <storeCurrency> + <selector>#storeCurrency</selector> <input>select</input> - </currency> - <language> - <selector>[ng-model*='language']</selector> + </storeCurrency> + <storeLanguage> + <selector>#storeLanguage</selector> <input>select</input> - </language> + </storeLanguage> </fields> </mapping> diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/Database.php b/dev/tests/functional/tests/app/Magento/Install/Test/Block/Database.php index e1efe0955d55b1affbec3bd5ecce0045617dad7a..b532f1d1070a6439e06709987196760716415b75 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/Database.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/Database.php @@ -8,6 +8,8 @@ namespace Magento\Install\Test\Block; use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Locator; +use Magento\Mtf\Fixture\FixtureInterface; +use Magento\Mtf\Client\Element\SimpleElement; /** * Database form. @@ -28,6 +30,28 @@ class Database extends Form */ protected $next = "[ng-click*='testConnection']"; + /** + * Fill database form. + * + * @param FixtureInterface $fixture + * @param SimpleElement|null $element + * @return $this + */ + public function fill(FixtureInterface $fixture, SimpleElement $element = null) + { + $data = $fixture->getData(); + $dbData = []; + foreach ($data as $key => $value) { + if (strpos($key, 'db') === 0) { + $dbData[$key] = $value; + } + } + $mapping = $this->dataMapping($dbData); + $this->_fill($mapping, $element); + + return $this; + } + /** * Get 'Test connection successful.' message. * diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.php b/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.php index 654dd1ffc8fe3ad117cf1db3a7bb24ee7da00594..64a90917c4c0245490565f507e3def561752cd70 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.php @@ -7,6 +7,8 @@ namespace Magento\Install\Test\Block; use Magento\Mtf\Block\Form; +use Magento\Mtf\Fixture\FixtureInterface; +use Magento\Mtf\Client\Element\SimpleElement; /** * Web configuration block. @@ -27,6 +29,28 @@ class WebConfiguration extends Form */ protected $advancedOptions = "[ng-click*='advanced']"; + /** + * Fill web configuration form. + * + * @param FixtureInterface $fixture + * @param SimpleElement|null $element + * @return $this + */ + public function fill(FixtureInterface $fixture, SimpleElement $element = null) + { + $data = $fixture->getData(); + $webConfiguration = []; + foreach ($data as $key => $value) { + if (strpos($key, 'db') !== 0 && strpos($key, 'store') !== 0) { + $webConfiguration[$key] = $value; + } + } + $mapping = $this->dataMapping($webConfiguration); + $this->_fill($mapping, $element); + + return $this; + } + /** * Click on 'Next' button. * diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.xml b/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.xml index f88d760c4c9cbd9a7c8d3b81bdb73f12338a9b79..a4b04f205eebf5c1305bda785977155d6449f569 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.xml @@ -7,7 +7,9 @@ --> <mapping strict="0"> <fields> - <web /> + <baseUrl> + <selector>[name="base_url"]</selector> + </baseUrl> <admin /> <keyOwn> <selector>[value="user"]</selector> diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php b/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php index 8fffdaaf42871d9174ab8b2df4e280c780e15091..5b9914c6e35b454a88d2556ee074307e1b4b4447 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php @@ -24,7 +24,7 @@ class AssertSuccessInstall extends AbstractConstraint protected $adminFieldsList = [ ['pageData' => 'username', 'fixture' => 'username'], ['pageData' => 'email', 'fixture' => 'email'], - ['pageData' => 'your_store_address', 'fixture' => 'web'], + ['pageData' => 'your_store_address', 'fixture' => 'baseUrl'], ['pageData' => 'magento_admin_address', 'fixture' => 'admin'] ]; @@ -57,8 +57,8 @@ class AssertSuccessInstall extends AbstractConstraint $allData[$key] = isset($value['value']) ? $value['value'] : $value; } - $allData['web'] = (isset($allData['https']) ? $allData['https'] : $allData['web']); - $allData['admin'] = $allData['web'] . $allData['admin'] . '/'; + $allData['baseUrl'] = (isset($allData['https']) ? $allData['https'] : $allData['baseUrl']); + $allData['admin'] = $allData['baseUrl'] . $allData['admin'] . '/'; foreach ($this->adminFieldsList as $field) { \PHPUnit_Framework_Assert::assertEquals( diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Fixture/Install.xml b/dev/tests/functional/tests/app/Magento/Install/Test/Fixture/Install.xml index d846de8f0bd45b0ed71068f8146e171994d682f6..2d83153459204f88755791b178917c92d4c01c79 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Fixture/Install.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Fixture/Install.xml @@ -6,25 +6,25 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd"> - <fixture name="install" module="Magento_Install" type="virtual" entity_type="install" repository_class="Magento\Install\Test\Repository\Install" handler_interface="Magento\Install\Test\Handler\Install\InstallInterface" class="Magento\Install\Test\Fixture\Install"> - <field name="dbHost"/> - <field name="dbUser"/> - <field name="dbPassword"/> - <field name="dbName"/> - <field name="web"/> - <field name="admin"/> - <field name="adminUsername"/> - <field name="adminEmail"/> - <field name="adminPassword"/> - <field name="adminConfirm"/> - <field name="apacheRewrites"/> - <field name="dbTablePrefix"/> - <field name="keyOwn"/> - <field name="httpsAdmin"/> - <field name="https"/> - <field name="httpsFront"/> - <field name="keyValue"/> - <field name="language"/> - <field name="currency"/> - </fixture> + <fixture name="install" module="Magento_Install" type="virtual" entity_type="install" repository_class="Magento\Install\Test\Repository\Install" handler_interface="Magento\Install\Test\Handler\Install\InstallInterface" class="Magento\Install\Test\Fixture\Install"> + <field name="dbHost" /> + <field name="dbUser" /> + <field name="dbPassword" /> + <field name="dbName" /> + <field name="dbTablePrefix" /> + <field name="baseUrl" /> + <field name="admin" /> + <field name="adminUsername" /> + <field name="adminEmail" /> + <field name="adminPassword" /> + <field name="adminConfirm" /> + <field name="apacheRewrites" /> + <field name="keyOwn" /> + <field name="httpsAdmin" /> + <field name="https" /> + <field name="httpsFront" /> + <field name="keyValue" /> + <field name="storeLanguage" /> + <field name="storeCurrency" /> + </fixture> </config> diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.php b/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.php index fbfb262f1206d798a750dcfede4c913b96eed3c5..ccf21709a84ab2f1d5f59eaf62cb5444a49df765 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.php @@ -12,17 +12,13 @@ use Magento\Install\Test\Fixture\Install as InstallConfig; use Magento\User\Test\Fixture\User; use Magento\Mtf\Fixture\FixtureFactory; use Magento\Mtf\TestCase\Injectable; -use Magento\Mtf\Config\DataInterface; use Magento\Install\Test\Constraint\AssertAgreementTextPresent; use Magento\Install\Test\Constraint\AssertSuccessfulReadinessCheck; -use Magento\Mtf\ObjectManagerFactory; /** * PLEASE ADD NECESSARY INFO BEFORE RUNNING TEST TO * ../dev/tests/functional/config/config.xml * - * Test Flow: - * * Preconditions: * 1. Uninstall Magento. * @@ -67,20 +63,20 @@ class InstallTest extends Injectable */ public function __prepare() { - $config = ObjectManagerFactory::getObjectManager()->get('Magento\Mtf\Config\DataInterface'); + $config = $this->objectManager->get('Magento\Mtf\Config\DataInterface'); // Prepare config data $configData['dbHost'] = $config->get('install/0/host/0'); $configData['dbUser'] = $config->get('install/0/user/0'); $configData['dbPassword'] = $config->get('install/0/password/0'); $configData['dbName'] = $config->get('install/0/dbName/0'); - $configData['web'] = $config->get('install/0/baseUrl/0'); + $configData['baseUrl'] = $config->get('install/0/baseUrl/0'); $configData['admin'] = $config->get('install/0/backendName/0'); return ['configData' => $configData]; } /** - * Injection data. + * Uninstall Magento. * * @param CmsIndex $homePage * @param Install $installPage @@ -99,24 +95,24 @@ class InstallTest extends Injectable * Install Magento via web interface. * * @param User $user - * @param array $install * @param array $configData * @param FixtureFactory $fixtureFactory * @param AssertAgreementTextPresent $assertLicense * @param AssertSuccessfulReadinessCheck $assertReadiness + * @param array $install [optional] * @return array */ public function test( User $user, - array $install, array $configData, FixtureFactory $fixtureFactory, AssertAgreementTextPresent $assertLicense, - AssertSuccessfulReadinessCheck $assertReadiness + AssertSuccessfulReadinessCheck $assertReadiness, + array $install = [] ) { $dataConfig = array_merge($install, $configData); - if ($dataConfig['httpsFront'] != "-") { - $dataConfig['https'] = str_replace('http', 'https', $dataConfig['web']); + if (isset($dataConfig['httpsFront'])) { + $dataConfig['https'] = str_replace('http', 'https', $dataConfig['baseUrl']); } /** @var InstallConfig $installConfig */ $installConfig = $fixtureFactory->create('Magento\Install\Test\Fixture\Install', ['data' => $dataConfig]); diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml b/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml index a527c8538f6140ecff520b4f49e72bf3731d49ca..ff6ba2d1f1d7c44aa00109c83150752118a34b5b 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml @@ -6,113 +6,59 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Install\Test\TestCase\InstallTest"> - <variation name="InstallTestVariation1"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">-</data> - <data name="install/admin" xsi:type="string">-</data> - <data name="install/httpsFront" xsi:type="string">-</data> - <data name="install/httpsAdmin" xsi:type="string">-</data> - <data name="install/apacheRewrites" xsi:type="string">-</data> - <data name="install/keyOwn" xsi:type="string">-</data> - <data name="install/keyValue" xsi:type="string">-</data> - <data name="install/language" xsi:type="string">-</data> - <data name="install/currency" xsi:type="string">-</data> - <data name="currencySymbol" xsi:type="string">-</data> - <data name="languageTemplate" xsi:type="string">-</data> - <data name="description" xsi:type="string">install with default values</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - </variation> - <variation name="InstallTestVariation2"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">-</data> - <data name="install/admin" xsi:type="string">custom</data> - <data name="install/httpsFront" xsi:type="string">-</data> - <data name="install/httpsAdmin" xsi:type="string">-</data> - <data name="install/apacheRewrites" xsi:type="string">-</data> - <data name="install/keyOwn" xsi:type="string">-</data> - <data name="install/keyValue" xsi:type="string">-</data> - <data name="install/language" xsi:type="string">-</data> - <data name="install/currency" xsi:type="string">-</data> - <data name="currencySymbol" xsi:type="string">-</data> - <data name="languageTemplate" xsi:type="string">-</data> - <data name="description" xsi:type="string">install with custom admin path</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - </variation> - <variation name="InstallTestVariation3"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">-</data> - <data name="install/admin" xsi:type="string">-</data> - <data name="install/httpsFront" xsi:type="string">-</data> - <data name="install/httpsAdmin" xsi:type="string">-</data> - <data name="install/apacheRewrites" xsi:type="string">-</data> - <data name="install/keyOwn" xsi:type="string">Yes</data> - <data name="install/keyValue" xsi:type="string">123123qa</data> - <data name="install/language" xsi:type="string">German (Germany)</data> - <data name="install/currency" xsi:type="string">Euro (EUR)</data> - <data name="currencySymbol" xsi:type="string">€</data> - <data name="languageTemplate" xsi:type="string">Suchbegriffe</data> - <data name="description" xsi:type="string">install with custom encryption key and changed currency and locale</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\Install\Test\Constraint\AssertKeyCreated"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - <constraint name="Magento\Install\Test\Constraint\AssertCurrencySelected"/> - <constraint name="Magento\Install\Test\Constraint\AssertLanguageSelected"/> - </variation> - <variation name="InstallTestVariation4"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">prefix1_</data> - <data name="install/admin" xsi:type="string">-</data> - <data name="install/httpsFront" xsi:type="string">-</data> - <data name="install/httpsAdmin" xsi:type="string">-</data> - <data name="install/apacheRewrites" xsi:type="string">-</data> - <data name="install/keyOwn" xsi:type="string">-</data> - <data name="install/keyValue" xsi:type="string">-</data> - <data name="install/language" xsi:type="string">Chinese (China)</data> - <data name="install/currency" xsi:type="string">-</data> - <data name="currencySymbol" xsi:type="string">-</data> - <data name="languageTemplate" xsi:type="string">-</data> - <data name="description" xsi:type="string">install with table prefix</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - </variation> - <variation name="InstallTestVariation5"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">-</data> - <data name="install/admin" xsi:type="string">-</data> - <data name="install/httpsFront" xsi:type="string">-</data> - <data name="install/httpsAdmin" xsi:type="string">-</data> - <data name="install/apacheRewrites" xsi:type="string">Yes</data> - <data name="install/keyOwn" xsi:type="string">-</data> - <data name="install/keyValue" xsi:type="string">-</data> - <data name="install/language" xsi:type="string">-</data> - <data name="install/currency" xsi:type="string">-</data> - <data name="currencySymbol" xsi:type="string">-</data> - <data name="languageTemplate" xsi:type="string">-</data> - <data name="description" xsi:type="string">install with enabled url rewrites</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - <constraint name="Magento\Install\Test\Constraint\AssertRewritesEnabled"/> - </variation> - <variation name="InstallTestVariation6"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">-</data> - <data name="install/admin" xsi:type="string">-</data> - <data name="install/httpsFront" xsi:type="string">Yes</data> - <data name="install/httpsAdmin" xsi:type="string">Yes</data> - <data name="install/apacheRewrites" xsi:type="string">-</data> - <data name="install/keyOwn" xsi:type="string">-</data> - <data name="install/keyValue" xsi:type="string">-</data> - <data name="install/language" xsi:type="string">-</data> - <data name="install/currency" xsi:type="string">-</data> - <data name="currencySymbol" xsi:type="string">-</data> - <data name="languageTemplate" xsi:type="string">-</data> - <data name="description" xsi:type="string">install with enabled secure urls</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - <constraint name="Magento\Install\Test\Constraint\AssertSecureUrlEnabled"/> - </variation> - </testCase> + <testCase name="Magento\Install\Test\TestCase\InstallTest"> + <variation name="InstallTestVariation1"> + <data name="description" xsi:type="string">Install with default values.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + </variation> + <variation name="InstallTestVariation2"> + <data name="description" xsi:type="string">Install with custom admin path.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <data name="install/admin" xsi:type="string">custom</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + </variation> + <variation name="InstallTestVariation3"> + <data name="description" xsi:type="string">Install with custom encryption key and changed currency and locale.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <data name="install/keyOwn" xsi:type="string">Yes</data> + <data name="install/keyValue" xsi:type="string">123123qa</data> + <data name="install/storeLanguage" xsi:type="string">German (Germany)</data> + <data name="install/storeCurrency" xsi:type="string">Euro (EUR)</data> + <data name="currencySymbol" xsi:type="string">€</data> + <data name="languageTemplate" xsi:type="string">Suchbegriffe</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\Install\Test\Constraint\AssertKeyCreated" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + <constraint name="Magento\Install\Test\Constraint\AssertCurrencySelected" /> + <constraint name="Magento\Install\Test\Constraint\AssertLanguageSelected" /> + </variation> + <variation name="InstallTestVariation4"> + <data name="description" xsi:type="string">Install with table prefix.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <data name="install/dbTablePrefix" xsi:type="string">prefix1_</data> + <data name="install/storeLanguage" xsi:type="string">Chinese (China)</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + </variation> + <variation name="InstallTestVariation5"> + <data name="description" xsi:type="string">Install with enabled url rewrites.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <data name="install/apacheRewrites" xsi:type="string">Yes</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + <constraint name="Magento\Install\Test\Constraint\AssertRewritesEnabled" /> + </variation> + <variation name="InstallTestVariation6"> + <data name="description" xsi:type="string">Install with enabled secure urls.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <data name="install/httpsFront" xsi:type="string">Yes</data> + <data name="install/httpsAdmin" xsi:type="string">Yes</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + <constraint name="Magento\Install\Test\Constraint\AssertSecureUrlEnabled" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateEdit.xml b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateEdit.xml index c17dbfb6ada9f96177f87d9d17223643041df640..56ee9f7302d96e787e64d4e0cf408d768f65cfab 100644 --- a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateEdit.xml +++ b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateEdit.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="TemplateEdit" area="Adminhtml" mca="newsletter/template/edit" module="Magento_Newsletter"> - <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="editForm" class="Magento\Backend\Test\Block\Widget\Form" locator="[id='page:main-container']" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - </page> + <page name="TemplateEdit" area="Adminhtml" mca="newsletter/template/edit" module="Magento_Newsletter"> + <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="editForm" class="Magento\Mtf\Block\Form" locator="[id='page:main-container']" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateNewIndex.xml b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateNewIndex.xml index 968920909e50d99c93a0f21dcc54c7f645a07ddf..b2744b0902e2c80329f8a345cbf953555ca6554c 100644 --- a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateNewIndex.xml +++ b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateNewIndex.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="TemplateNewIndex" area="Adminhtml" mca="newsletter/template/new/index" module="Magento_Newsletter"> - <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="editForm" class="Magento\Backend\Test\Block\Widget\Form" locator="[id='page:main-container']" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - </page> + <page name="TemplateNewIndex" area="Adminhtml" mca="newsletter/template/new/index" module="Magento_Newsletter"> + <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="editForm" class="Magento\Mtf\Block\Form" locator="[id='page:main-container']" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateQueue.xml b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateQueue.xml index 8e17bfc6814b8ab37822b55279cb9dbffaaba742..c4840bceae2123bf11213311c8756b1707b48ba7 100644 --- a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateQueue.xml +++ b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateQueue.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="TemplateQueue" area="Adminhtml" mca="newsletter/queue/edit" module="Magento_Newsletter"> - <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="editForm" class="Magento\Backend\Test\Block\Widget\Form" locator="#queue_edit_form" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - </page> + <page name="TemplateQueue" area="Adminhtml" mca="newsletter/queue/edit" module="Magento_Newsletter"> + <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="editForm" class="Magento\Mtf\Block\Form" locator="#queue_edit_form" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/CustomerReviewReportEntityTest.xml b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/CustomerReviewReportEntityTest.xml index e996602cc41fc49ed5c141addcfd07d71325b91f..26430b8ea9c7233e8734019c057493a2435bbbf3 100644 --- a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/CustomerReviewReportEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/CustomerReviewReportEntityTest.xml @@ -6,36 +6,38 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Reports\Test\TestCase\CustomerReviewReportEntityTest"> - <variation name="CustomerReviewReportEntityTestVariation1"> - <data name="customerLogin" xsi:type="string">Yes</data> - <data name="product/dataSet" xsi:type="string">default</data> - <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> - <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> - <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> - <data name="reviewsCount" xsi:type="string">1</data> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer"/> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerInGrid"/> - </variation> - <variation name="CustomerReviewReportEntityTestVariation2"> - <data name="customerLogin" xsi:type="string">Yes</data> - <data name="product/dataSet" xsi:type="string">default</data> - <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> - <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> - <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> - <data name="reviewsCount" xsi:type="string">2</data> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer"/> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerInGrid"/> - </variation> - <variation name="CustomerReviewReportEntityTestVariation3"> - <data name="customerLogin" xsi:type="string">No</data> - <data name="product/dataSet" xsi:type="string">default</data> - <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> - <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> - <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> - <data name="reviewsCount" xsi:type="string">2</data> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer"/> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerNotInGrid"/> - </variation> - </testCase> + <testCase name="Magento\Reports\Test\TestCase\CustomerReviewReportEntityTest"> + <variation name="CustomerReviewReportEntityTestVariation1"> + <data name="customerLogin" xsi:type="string">Yes</data> + <data name="product/dataSet" xsi:type="string">default</data> + <data name="review/data/type" xsi:type="string">Customer</data> + <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> + <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> + <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> + <data name="reviewsCount" xsi:type="string">1</data> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer" /> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerInGrid" /> + </variation> + <variation name="CustomerReviewReportEntityTestVariation2"> + <data name="customerLogin" xsi:type="string">Yes</data> + <data name="product/dataSet" xsi:type="string">default</data> + <data name="review/data/type" xsi:type="string">Customer</data> + <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> + <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> + <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> + <data name="reviewsCount" xsi:type="string">2</data> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer" /> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerInGrid" /> + </variation> + <variation name="CustomerReviewReportEntityTestVariation3"> + <data name="customerLogin" xsi:type="string">No</data> + <data name="product/dataSet" xsi:type="string">default</data> + <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> + <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> + <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> + <data name="reviewsCount" xsi:type="string">2</data> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer" /> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerNotInGrid" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php index a9499d608da3f1844151c1b9c81a70f4dcbf9c9a..c3ad0a3ef2d2f631d160e7da69b7de4629296d9f 100755 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php @@ -6,38 +6,58 @@ namespace Magento\Review\Test\Block\Adminhtml; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Locator; +use Magento\Mtf\Fixture\FixtureInterface; +use Magento\Mtf\Client\Element\SimpleElement; /** - * Class Edit - * Review edit form + * Review edit form. */ class ReviewForm extends Form { /** - * Posted by field + * Posted by field. * * @var string */ protected $customer = '#customer'; /** - * Rating status + * Rating status. * * @var string */ protected $status = '[name=status_id]'; /** - * 'Save Review' button + * 'Save Review' button. * * @var string */ protected $saveButton = '[data-ui-id$=save-button-button]'; /** - * Get data from 'Posted By' field + * Fill the review form. + * + * @param FixtureInterface $fixture + * @param SimpleElement|null $element + * @return $this + */ + public function fill(FixtureInterface $fixture, SimpleElement $element = null) + { + $data = $fixture->getData(); + if (isset($data['entity_id'])) { + unset($data['entity_id']); + } + $mapping = $this->dataMapping($data); + $this->_fill($mapping, $element); + + return $this; + } + + /** + * Get data from 'Posted By' field. * * @return string */ @@ -47,7 +67,7 @@ class ReviewForm extends Form } /** - * Get data from Status field + * Get data from Status field. * * @return string */ @@ -57,7 +77,7 @@ class ReviewForm extends Form } /** - * Set approve review + * Set approve review. * * @return void */ diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewForm.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewForm.php index eb6cb92c40c0f270b3fab671135d6f00bcc364a2..edf5cb90995549c5ddd0537fbf335002d8304fc3 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewForm.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewForm.php @@ -48,8 +48,8 @@ class AssertProductReviewForm extends AbstractAssertForm $fixtureData = $review->getData(); $formData = $reviewEdit->getReviewForm()->getData(); - if (isset($fixtureData['customer'])) { - $formData['customer'] = $reviewEdit->getReviewForm()->getPostedBy(); + if (isset($fixtureData['type'])) { + $formData['type'] = $reviewEdit->getReviewForm()->getPostedBy(); } $error = $this->verifyData($fixtureData, $formData); diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewInGrid.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewInGrid.php index b448f3ac837a261457216b46465dc4ce9e719ec6..93e28f758b9eb2408328058ca50d4d93a585b18d 100755 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewInGrid.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewInGrid.php @@ -12,13 +12,12 @@ use Magento\Mtf\Constraint\AbstractConstraint; use Magento\Mtf\Fixture\FixtureInterface; /** - * Class AssertProductReviewInGrid - * Check that review is displayed in grid + * Check that review is displayed in grid. */ class AssertProductReviewInGrid extends AbstractConstraint { /** - * Filter params + * Filter params. * * @var array */ @@ -35,10 +34,10 @@ class AssertProductReviewInGrid extends AbstractConstraint ]; /** - * Assert that review is displayed in grid + * Assert that review is displayed in grid. * * @param ReviewIndex $reviewIndex - * @param Review $review , + * @param Review $review * @param FixtureInterface $product * @param string $gridStatus * @return void @@ -61,7 +60,7 @@ class AssertProductReviewInGrid extends AbstractConstraint } /** - * Prepare filter for assert + * Prepare filter for assert. * * @param FixtureInterface $product * @param array $review @@ -89,6 +88,9 @@ class AssertProductReviewInGrid extends AbstractConstraint case 'status_id': $value = $gridStatus != '' ? $gridStatus : (isset($review[$param]) ? $review[$param] : null); break; + case 'type': + $value = isset($review[$param]) ? $review[$param] : 'Administrator'; + break; default: $value = isset($review[$param]) ? $review[$param] : null; break; @@ -101,7 +103,7 @@ class AssertProductReviewInGrid extends AbstractConstraint } /** - * Text success exist review in grid on product reviews tab + * Text success exist review in grid on product reviews tab. * * @return string */ diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewBackendEntityTest.xml b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewBackendEntityTest.xml index bf97a39b60e0ab692798889c9c0d22d36a1fbd27..ee97d7bb2149563e0583afbb7328d09cf1189a3b 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewBackendEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewBackendEntityTest.xml @@ -6,48 +6,45 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Review\Test\TestCase\CreateProductReviewBackendEntityTest"> - <variation name="CreateProductReviewBackendEntityTestVariation1"> - <data name="review/data/type" xsi:type="string">Administrator</data> - <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> - <data name="review/data/status_id" xsi:type="string">Approved</data> - <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> - <data name="review/data/ratings/rating_0/rating" xsi:type="string">3</data> - <data name="review/data/nickname" xsi:type="string">John</data> - <data name="review/data/title" xsi:type="string">title %isolation%</data> - <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage"/> - </variation> - <variation name="CreateProductReviewBackendEntityTestVariation2"> - <data name="review/data/type" xsi:type="string">Administrator</data> - <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> - <data name="review/data/status_id" xsi:type="string">Pending</data> - <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> - <data name="review/data/ratings/rating_0/rating" xsi:type="string">4</data> - <data name="review/data/nickname" xsi:type="string">Britney</data> - <data name="review/data/title" xsi:type="string">title %isolation%</data> - <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage"/> - </variation> - <variation name="CreateProductReviewBackendEntityTestVariation3"> - <data name="review/data/type" xsi:type="string">Administrator</data> - <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> - <data name="review/data/status_id" xsi:type="string">Not Approved</data> - <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> - <data name="review/data/ratings/rating_0/rating" xsi:type="string">5</data> - <data name="review/data/nickname" xsi:type="string">Michael</data> - <data name="review/data/title" xsi:type="string">title %isolation%</data> - <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage"/> - </variation> - </testCase> + <testCase name="Magento\Review\Test\TestCase\CreateProductReviewBackendEntityTest"> + <variation name="CreateProductReviewBackendEntityTestVariation1"> + <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> + <data name="review/data/status_id" xsi:type="string">Approved</data> + <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> + <data name="review/data/ratings/rating_0/rating" xsi:type="string">3</data> + <data name="review/data/nickname" xsi:type="string">John</data> + <data name="review/data/title" xsi:type="string">title %isolation%</data> + <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage" /> + </variation> + <variation name="CreateProductReviewBackendEntityTestVariation2"> + <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> + <data name="review/data/status_id" xsi:type="string">Pending</data> + <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> + <data name="review/data/ratings/rating_0/rating" xsi:type="string">4</data> + <data name="review/data/nickname" xsi:type="string">Britney</data> + <data name="review/data/title" xsi:type="string">title %isolation%</data> + <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage" /> + </variation> + <variation name="CreateProductReviewBackendEntityTestVariation3"> + <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> + <data name="review/data/status_id" xsi:type="string">Not Approved</data> + <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> + <data name="review/data/ratings/rating_0/rating" xsi:type="string">5</data> + <data name="review/data/nickname" xsi:type="string">Michael</data> + <data name="review/data/title" xsi:type="string">title %isolation%</data> + <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewFrontendEntityTest.xml b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewFrontendEntityTest.xml index 747044f00e030859b162598332c766a74b5c283c..ee9096bce936c26452574d0d8362293f90933c68 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewFrontendEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewFrontendEntityTest.xml @@ -6,37 +6,35 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Review\Test\TestCase\CreateProductReviewFrontendEntityTest"> - <variation name="CreateProductReviewFrontendEntityTestVariation1"> - <data name="description" xsi:type="string">Create product review with rating</data> - <data name="review/data/customer" xsi:type="string">-</data> - <data name="review/data/nickname" xsi:type="string">name_%isolation%</data> - <data name="review/data/title" xsi:type="string">title_%isolation%</data> - <data name="review/data/detail" xsi:type="string">review_%isolation%</data> - <data name="review/data/ratings/1/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> - <data name="review/data/ratings/1/rating" xsi:type="string">4</data> - <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> - <constraint name="Magento\Review\Test\Constraint\AssertReviewCreationSuccessMessage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductRatingOnReviewPage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage"/> - </variation> - <variation name="CreateProductReviewFrontendEntityTestVariation2"> - <data name="description" xsi:type="string">MAGETWO-12403 - Add Product Review from Customer's Prospective</data> - <data name="review/data/customer" xsi:type="string">Guest</data> - <data name="review/data/nickname" xsi:type="string">name_%isolation%</data> - <data name="review/data/title" xsi:type="string">title_%isolation%</data> - <data name="review/data/detail" xsi:type="string">review_%isolation%</data> - <data name="review/data/ratings/1/dataSet" xsi:type="string">-</data> - <data name="review/data/ratings/1/rating" xsi:type="string">-</data> - <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> - <data name="tag" xsi:type="string">test_type:acceptance_test</data> - <constraint name="Magento\Review\Test\Constraint\AssertReviewCreationSuccessMessage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewIsAbsentOnProductPage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewForm"/> - <constraint name="Magento\Review\Test\Constraint\AssertSetApprovedProductReview"/> - <constraint name="Magento\Review\Test\Constraint\AssertReviewLinksIsPresentOnProductPage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewOnProductPage"/> - </variation> - </testCase> + <testCase name="Magento\Review\Test\TestCase\CreateProductReviewFrontendEntityTest"> + <variation name="CreateProductReviewFrontendEntityTestVariation1"> + <data name="description" xsi:type="string">Create product review with rating</data> + <data name="review/data/type" xsi:type="string">Guest</data> + <data name="review/data/nickname" xsi:type="string">name_%isolation%</data> + <data name="review/data/title" xsi:type="string">title_%isolation%</data> + <data name="review/data/detail" xsi:type="string">review_%isolation%</data> + <data name="review/data/ratings/1/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> + <data name="review/data/ratings/1/rating" xsi:type="string">4</data> + <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> + <constraint name="Magento\Review\Test\Constraint\AssertReviewCreationSuccessMessage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductRatingOnReviewPage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage" /> + </variation> + <variation name="CreateProductReviewFrontendEntityTestVariation2"> + <data name="description" xsi:type="string">MAGETWO-12403 - Add Product Review from Customer's Prospective</data> + <data name="review/data/type" xsi:type="string">Guest</data> + <data name="review/data/nickname" xsi:type="string">name_%isolation%</data> + <data name="review/data/title" xsi:type="string">title_%isolation%</data> + <data name="review/data/detail" xsi:type="string">review_%isolation%</data> + <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> + <data name="tag" xsi:type="string">test_type:acceptance_test</data> + <constraint name="Magento\Review\Test\Constraint\AssertReviewCreationSuccessMessage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewIsAbsentOnProductPage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewForm" /> + <constraint name="Magento\Review\Test\Constraint\AssertSetApprovedProductReview" /> + <constraint name="Magento\Review\Test\Constraint\AssertReviewLinksIsPresentOnProductPage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewOnProductPage" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml index 369d359cf8a55a41421c7228d0b91c6a924e7ac6..2439e6aeac763956de84b836bf817642a915135b 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml @@ -23,8 +23,5 @@ </region_id> <postcode /> <telephone /> - <save_in_address_book> - <input>checkbox</input> - </save_in_address_book> </fields> </mapping> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php index 0a350725839b9e8833b90dda8003c051b0c7293c..14ec5f4336b64d6429c6c04caa8bf5501666ac09 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php @@ -6,7 +6,7 @@ namespace Magento\Sales\Test\Block\Adminhtml\Order\Create; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\SalesRule\Test\Fixture\SalesRule; use Magento\Mtf\Client\Locator; diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Form/Account.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Form/Account.xml index 768fef18f37797e49cb835efa48e80e45b746f6a..ece7a7be14cf2e6234031368e4bb83310b869e49 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Form/Account.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Form/Account.xml @@ -5,12 +5,12 @@ * See COPYING.txt for license details. */ --> -<mapping strict="0"> +<mapping strict="1"> <wrapper>order[account]</wrapper> <fields> - <group> + <group_id> <input>select</input>> - </group> + </group_id> <email /> </fields> </mapping> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php index 03ec6f8187c16a1a697a93f64e6a8d861a0130fe..efcf05d2a42144b7ed72c3b2e0a9b0fd5243d911 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php @@ -8,6 +8,8 @@ namespace Magento\Sales\Test\Block\Adminhtml\Order\Create\Items; use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Locator; +use Magento\Mtf\Fixture\FixtureInterface; +use Magento\Mtf\Client\Element\SimpleElement; /** * Class ItemProduct @@ -76,6 +78,28 @@ class ItemProduct extends Form return $result; } + /** + * Fill the root form. + * + * @param FixtureInterface $fixture + * @param SimpleElement|null $element + * @return $this + */ + public function fill(FixtureInterface $fixture, SimpleElement $element = null) + { + $data = $fixture->getData(); + if (isset($data['cartItem'])) { + unset($data['cartItem']); + } + if (isset($data['options'])) { + unset($data['options']); + } + $mapping = $this->dataMapping($data); + $this->_fill($mapping, $element); + + return $this; + } + /** * Click Configure button. * diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusEdit.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusEdit.xml index c1d712de6a2d0f33e4545ce3a3983a101dd96e11..298289698a18295d355e73f5f66f515e040b2620 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusEdit.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusEdit.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="OrderStatusEdit" area="Adminhtml" mca="sales/order_status/edit" module="Magento_Sales"> - <block name="formPageActions" class="Magento\Backend\Test\Block\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="orderStatusForm" class="Magento\Backend\Test\Block\Widget\Form" locator="#edit_form" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - </page> + <page name="OrderStatusEdit" area="Adminhtml" mca="sales/order_status/edit" module="Magento_Sales"> + <block name="formPageActions" class="Magento\Backend\Test\Block\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="orderStatusForm" class="Magento\Mtf\Block\Form" locator="#edit_form" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusNew.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusNew.xml index 856880560d3ed1eaa69d6746666788ce166ce286..0457f3a4b1899a46bd3b850b7c6349733cd3d515 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusNew.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusNew.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="OrderStatusNew" area="Adminhtml" mca="sales/order_status/new" module="Magento_Sales"> - <block name="formPageActions" class="Magento\Backend\Test\Block\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="orderStatusForm" class="Magento\Backend\Test\Block\Widget\Form" locator="#edit_form" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - </page> + <page name="OrderStatusNew" area="Adminhtml" mca="sales/order_status/new" module="Magento_Sales"> + <block name="formPageActions" class="Magento\Backend\Test\Block\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="orderStatusForm" class="Magento\Mtf\Block\Form" locator="#edit_form" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml index 6371ae09b9981d48b42be0a1e9fd1c54897e91cd..ce5a4f0d95671ebaf4caf9ff4a8984b6c0853b57 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml @@ -10,8 +10,8 @@ <variation name="CreateOrderBackendTestVariation1"> <data name="description" xsi:type="string">Create order with simple product for registered US customer using Fixed shipping method and Cash on Delivery payment method</data> <data name="products" xsi:type="string">catalogProductSimple::default</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1_without_email</data> <data name="saveAddress" xsi:type="string">No</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> @@ -31,8 +31,8 @@ <variation name="CreateOrderBackendTestVariation2"> <data name="description" xsi:type="string">Create order with virtual product for registered UK customer using Check/Money Order payment method</data> <data name="products" xsi:type="string">catalogProductVirtual::default</data> - <data name="customer/dataSet" xsi:type="string">customer_UK</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_UK</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address_without_email</data> <data name="prices" xsi:type="array"> <item name="grandTotal" xsi:type="string">10.00</item> </data> @@ -49,8 +49,8 @@ <variation name="CreateOrderBackendTestVariation3"> <data name="description" xsi:type="string">Create order with simple product for registered US customer using Fixed shipping method and Bank Transfer payment method</data> <data name="products" xsi:type="string">catalogProductSimple::default</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1_without_email</data> <data name="saveAddress" xsi:type="string">No</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> @@ -71,8 +71,8 @@ <data name="tag" xsi:type="string">to_maintain:yes</data> <data name="description" xsi:type="string">Create order with virtual product for registered UK customer using Bank Transfer payment method</data> <data name="products" xsi:type="string">catalogProductVirtual::default</data> - <data name="customer/dataSet" xsi:type="string">customer_UK</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_UK</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address_without_email</data> <data name="saveAddress" xsi:type="string">No</data> <data name="prices" xsi:type="array"> <item name="grandTotal" xsi:type="string">10.00</item> @@ -91,9 +91,9 @@ <data name="tag" xsi:type="string">to_maintain:yes</data> <data name="description" xsi:type="string">Create order with simple product for registered US customer using Fixed shipping method and Purchase Order payment method</data> <data name="products" xsi:type="string">catalogProductSimple::default</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> <data name="saveAddress" xsi:type="string">No</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1_without_email</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> @@ -114,10 +114,10 @@ <data name="description" xsi:type="string">MAGETWO-12395 - Create Offline Order for Registered Customer in Admin</data> <data name="products" xsi:type="string">catalogProductSimple::simple_10_dollar, configurableProduct::with_one_option</data> <data name="taxRule" xsi:type="string">us_ca_ny_rule</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> <data name="saveAddress" xsi:type="string">No</data> <data name="checkoutMethod" xsi:type="string">login</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1_without_email</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> @@ -132,10 +132,10 @@ <data name="description" xsi:type="string">MAGETWO-12520 - Create Order for New Customer in Admin with Offline Payment Method</data> <data name="products" xsi:type="string">catalogProductSimple::simple_10_dollar, configurableProduct::with_one_option</data> <data name="taxRule" xsi:type="string">us_ca_ny_rule</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> <data name="saveAddress" xsi:type="string">Yes</data> <data name="checkoutMethod" xsi:type="string">register</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1_without_email</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/ReorderOrderEntityTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/ReorderOrderEntityTest.xml index 200b45de0adb16a93d2c5343434e3038d064973d..20b862a735ee7e9977599fd0c8f82598384d6637 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/ReorderOrderEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/ReorderOrderEntityTest.xml @@ -11,8 +11,8 @@ <data name="description" xsi:type="string">Reorder placed order (update products, billing address).</data> <data name="order/dataSet" xsi:type="string">two_simple_product</data> <data name="salesRule" xsi:type="string">active_sales_rule_with_fixed_price_discount_coupon</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> diff --git a/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Form.xml b/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Form.xml index 7e75ac518b8e7a2e66c38e5d9798c220d281e39f..bacb199390c0d3982e726b71db8c8adc51e9e9bd 100644 --- a/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Form.xml +++ b/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Form.xml @@ -6,7 +6,7 @@ */ --> <mapping strict="0"> - <wrapper>creditmemo</wrapper> + <wrapper>shipment</wrapper> <fields> <comment_text /> <shipping_amount /> diff --git a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Page/Adminhtml/SitemapNew.xml b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Page/Adminhtml/SitemapNew.xml index 4f33714bfae86e6ab15c88cb3b5c500ad429e4ad..6852866408294adf0b9516a3013a41855534e24e 100644 --- a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Page/Adminhtml/SitemapNew.xml +++ b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Page/Adminhtml/SitemapNew.xml @@ -6,8 +6,8 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="SitemapNew" area="Adminhtml" mca="sitemap/new/index" module="Magento_Sitemap"> - <block name="sitemapForm" class="Magento\Backend\Test\Block\Widget\Form" locator="#add_sitemap_form" strategy="css selector"/> - <block name="sitemapPageActions" class="Magento\Sitemap\Test\Block\Adminhtml\SitemapPageActions" locator=".page-main-actions" strategy="css selector"/> - </page> + <page name="SitemapNew" area="Adminhtml" mca="sitemap/new/index" module="Magento_Sitemap"> + <block name="sitemapForm" class="Magento\Mtf\Block\Form" locator="#add_sitemap_form" strategy="css selector" /> + <block name="sitemapPageActions" class="Magento\Sitemap\Test\Block\Adminhtml\SitemapPageActions" locator=".page-main-actions" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php index 970bede06def9787026240f7fd543488d39ed4a7..43e431fbbea44d9a0d3f6964961747b69f1cb104 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php @@ -31,10 +31,7 @@ class AssertTaxRateForm extends AbstractConstraint TaxRate $taxRate, TaxRate $initialTaxRate = null ) { - $data = ($initialTaxRate !== null) - ? array_merge($initialTaxRate->getData(), $taxRate->getData()) - : $taxRate->getData(); - $data = $this->prepareData($data); + $data = $this->prepareData($taxRate, $initialTaxRate); $filter = [ 'code' => $data['code'], ]; @@ -53,11 +50,20 @@ class AssertTaxRateForm extends AbstractConstraint /** * Preparing data for verification * - * @param array $data + * @param TaxRate $taxRate + * @param TaxRate $initialTaxRate * @return array */ - protected function prepareData(array $data) + protected function prepareData(TaxRate $taxRate, TaxRate $initialTaxRate = null) { + if ($initialTaxRate !== null) { + $data = array_merge($initialTaxRate->getData(), $taxRate->getData()); + if ($taxRate->hasData('tax_country_id') && !$taxRate->hasData('tax_region_id')) { + unset($data['tax_region_id']); + } + } else { + $data = $taxRate->getData(); + } if ($data['zip_is_range'] === 'Yes') { unset($data['tax_postcode']); } else { diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml index ae3c83014c7f0169da523f9e15c065671c69f167..d5407ecf878f38d62433a282d67c5b7e2f7f942a 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml @@ -11,11 +11,11 @@ <data name="description" xsi:type="string">MAGETWO-13436: Automatic Apply Tax Based on VAT ID.</data> <data name="vatConfig/dataSet" xsi:type="string">enable_VAT_on_frontend</data> <data name="configData" xsi:type="string">default_tax_configuration, flatrate, checkmo, store_information_DE_with_VAT, enable_VAT_on_frontend</data> - <data name="customer/dataSet" xsi:type="string">address_UK_with_VAT</data> + <data name="customer/dataSet" xsi:type="string">customer_UK_address_with_VAT</data> <data name="order/dataSet" xsi:type="string">default</data> <data name="order/data/entity_id/products" xsi:type="string">catalogProductSimple::product_10_dollar</data> <data name="order/data/customer_id/dataSet" xsi:type="string">customer_UK_address_with_VAT</data> - <data name="order/data/billing_address_id/dataSet" xsi:type="string">address_UK_with_VAT</data> + <data name="order/data/billing_address_id/dataSet" xsi:type="string">UK_address_with_VAT</data> <data name="taxRule/dataSet" xsi:type="string">retailer_uk_full_tax_rule</data> <data name="customerGroup" xsi:type="string">valid_intra_union_group</data> <data name="cart/data/subtotal" xsi:type="string">10</data> diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/CreateTaxRateEntityTest.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/CreateTaxRateEntityTest.xml index bee3fb886b6f598dd767fe1706a967247ea05736..9602d171bf546587b59734b79042e4b42d6618fc 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/CreateTaxRateEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/CreateTaxRateEntityTest.xml @@ -14,7 +14,6 @@ <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">*</data> <data name="taxRate/data/tax_country_id" xsi:type="string">Australia</data> - <data name="taxRate/data/tax_region_id" xsi:type="string">*</data> <data name="taxRate/data/rate" xsi:type="string">20</data> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateSuccessSaveMessage" /> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateInGrid" /> @@ -55,7 +54,6 @@ <data name="taxRate/data/zip_to" xsi:type="string">7800935</data> <data name="taxRate/data/tax_postcode" xsi:type="string">-</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United Kingdom</data> - <data name="taxRate/data/tax_region_id" xsi:type="string">*</data> <data name="taxRate/data/rate" xsi:type="string">7.75</data> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateSuccessSaveMessage" /> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateForm" /> diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml index 5f3a3e5fba76bad0aa9afb2fa85624cddb1e4beb..c8205ff306c4f0a543f0ab0cea2d619a6df8004a 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml @@ -11,8 +11,6 @@ <data name="initialTaxRate/dataSet" xsi:type="string">default</data> <data name="taxRate/data/code" xsi:type="string">TaxIdentifier%isolation%</data> <data name="taxRate/data/zip_is_range" xsi:type="string">No</data> - <data name="taxRate/data/zip_from" xsi:type="string">-</data> - <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">90001</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United States</data> <data name="taxRate/data/tax_region_id" xsi:type="string">California</data> @@ -27,7 +25,6 @@ <data name="taxRate/data/zip_is_range" xsi:type="string">Yes</data> <data name="taxRate/data/zip_from" xsi:type="string">90001</data> <data name="taxRate/data/zip_to" xsi:type="string">96162</data> - <data name="taxRate/data/tax_postcode" xsi:type="string">-</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United States</data> <data name="taxRate/data/tax_region_id" xsi:type="string">California</data> <data name="taxRate/data/rate" xsi:type="string">15.05</data> @@ -39,11 +36,8 @@ <data name="initialTaxRate/dataSet" xsi:type="string">default</data> <data name="taxRate/data/code" xsi:type="string">TaxIdentifier%isolation%</data> <data name="taxRate/data/zip_is_range" xsi:type="string">No</data> - <data name="taxRate/data/zip_from" xsi:type="string">-</data> - <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">*</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United Kingdom</data> - <data name="taxRate/data/tax_region_id" xsi:type="string">*</data> <data name="taxRate/data/rate" xsi:type="string">777</data> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateSuccessSaveMessage" /> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateInGrid" /> @@ -53,8 +47,6 @@ <data name="initialTaxRate/dataSet" xsi:type="string">withZipRange</data> <data name="taxRate/data/code" xsi:type="string">TaxIdentifier%isolation%</data> <data name="taxRate/data/zip_is_range" xsi:type="string">No</data> - <data name="taxRate/data/zip_from" xsi:type="string">-</data> - <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">180</data> <data name="taxRate/data/tax_country_id" xsi:type="string">Canada</data> <data name="taxRate/data/tax_region_id" xsi:type="string">*</data> @@ -69,9 +61,7 @@ <data name="taxRate/data/zip_is_range" xsi:type="string">Yes</data> <data name="taxRate/data/zip_from" xsi:type="string">1</data> <data name="taxRate/data/zip_to" xsi:type="string">7800935</data> - <data name="taxRate/data/tax_postcode" xsi:type="string">-</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United Kingdom</data> - <data name="taxRate/data/tax_region_id" xsi:type="string">*</data> <data name="taxRate/data/rate" xsi:type="string">12.99</data> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateSuccessSaveMessage" /> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateForm" /> @@ -80,8 +70,6 @@ <data name="initialTaxRate/dataSet" xsi:type="string">withZipRange</data> <data name="taxRate/data/code" xsi:type="string">TaxIdentifier%isolation%</data> <data name="taxRate/data/zip_is_range" xsi:type="string">No</data> - <data name="taxRate/data/zip_from" xsi:type="string">-</data> - <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">*</data> <data name="taxRate/data/tax_country_id" xsi:type="string">France</data> <data name="taxRate/data/tax_region_id" xsi:type="string">Val-d'Oise</data> diff --git a/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml index e69a07836fa8db70124d108c6e4fbd5d3882a640..6fc10ed38d6c56eaad94467b0d8a1a82b7f242cc 100644 --- a/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml +++ b/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml @@ -11,8 +11,8 @@ <data name="description" xsi:type="string">MAGETWO-12848 – Use UPS Online Shipping Carrier on Checkout as a Registered Customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">login</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="shipping/shipping_service" xsi:type="string">United Parcel Service</data> <data name="shipping/shipping_method" xsi:type="string">UPS Ground</data> <data name="cart/data/shipping_method" xsi:type="string">UPS Ground</data> @@ -27,9 +27,9 @@ <data name="description" xsi:type="string">Check Out as Guest using UPS with US shipping origin and UK customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">guest</data> - <data name="customer/dataSet" xsi:type="string">customer_UK</data> - <data name="address/dataSet" xsi:type="string">customer_UK</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_UK</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="address/dataSet" xsi:type="string">UK_address</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address</data> <data name="shipping/shipping_service" xsi:type="string">United Parcel Service</data> <data name="shipping/shipping_method" xsi:type="string">UPS Worldwide Expedited</data> <data name="cart/data/shipping_method" xsi:type="string">UPS Worldwide Expedited</data> diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php index 373c6c4cabd7c90d4920667f958868594b4b3946..5fb3fc21d02d69cd99399f7af6741da752448522 100644 --- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php +++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php @@ -6,7 +6,7 @@ namespace Magento\UrlRewrite\Test\Block\Adminhtml\Catalog\Edit; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Element\SimpleElement; use Magento\Mtf\Client\Element; use Magento\Mtf\Fixture\FixtureInterface; @@ -16,6 +16,42 @@ use Magento\Mtf\Fixture\FixtureInterface; */ class UrlRewriteForm extends Form { + /** + * Prepare data for url rewrite fixture. + * + * @param FixtureInterface $fixture + * @return array + */ + protected function prepareData(FixtureInterface $fixture) + { + $data = $fixture->getData(); + if (empty($data['entity_type']) && empty($this->getData()['target_path']) && !isset($data['target_path'])) { + $entity = $fixture->getDataFieldConfig('target_path')['source']->getEntity(); + $data['target_path'] = $entity->hasData('identifier') + ? $entity->getIdentifier() + : $entity->getUrlKey() . '.html'; + } + return $data; + } + + /** + * Fill visible fields on the form. + * + * @param array $data + * @param SimpleElement $context + * @retun void + */ + protected function fillFields(array $data, SimpleElement $context) + { + $mapping = $this->dataMapping($data); + foreach ($mapping as $field) { + $element = $this->getElement($context, $field); + if ($element->isVisible() && !$element->isDisabled()) { + $element->setValue($field['value']); + } + } + } + /** * Fill the root form. * @@ -29,13 +65,8 @@ class UrlRewriteForm extends Form SimpleElement $element = null, array $replace = [] ) { - $data = $fixture->getData(); - if (empty($data['entity_type']) && empty($this->getData()['target_path']) && !isset($data['target_path'])) { - $entity = $fixture->getDataFieldConfig('target_path')['source']->getEntity(); - $data['target_path'] = $entity->hasData('identifier') - ? $entity->getIdentifier() - : $entity->getUrlKey() . '.html'; - } + $context = ($element === null) ? $this->_rootElement : $element; + $data = $this->prepareData($fixture); foreach ($replace as $key => $value) { if (isset($data[$key])) { @@ -43,8 +74,7 @@ class UrlRewriteForm extends Form } } - $mapping = $this->dataMapping($data); - $this->_fill($mapping, $element); + $this->fillFields($data, $context); return $this; } diff --git a/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml index f374414df102e72c249d362c4f7c9ad8dbe36eb4..b930b0fb8abc7e9d60dbde9e80605ae26a629f1a 100644 --- a/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml +++ b/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml @@ -11,8 +11,8 @@ <data name="description" xsi:type="string">MAGETWO-12444 – Use USPS Online Shipping Carrier on Checkout as a Registered Customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">login</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="shipping/shipping_service" xsi:type="string">United States Postal Service</data> <data name="shipping/shipping_method" xsi:type="string">Priority Mail 1-Day</data> <data name="cart/data/shipping_method" xsi:type="string">Priority Mail 1-Day</data> @@ -27,9 +27,9 @@ <data name="description" xsi:type="string">Check Out as Guest using USPS with US shipping origin and UK customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">guest</data> - <data name="customer/dataSet" xsi:type="string">customer_UK</data> - <data name="address/dataSet" xsi:type="string">customer_UK</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_UK</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="address/dataSet" xsi:type="string">UK_address</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address</data> <data name="shipping/shipping_service" xsi:type="string">United States Postal Service</data> <data name="shipping/shipping_method" xsi:type="string">Priority Mail International</data> <data name="cart/data/shipping_method" xsi:type="string">Priority Mail International</data> diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AbstractWishlistTest.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AbstractWishlistTest.php index 736d2e0e8136600a99ebc424ef73e57fbfdb2a00..b3102c9d7f960e4205fd633bfb10c18008fd10f5 100644 --- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AbstractWishlistTest.php +++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AbstractWishlistTest.php @@ -119,11 +119,9 @@ abstract class AbstractWishlistTest extends Injectable */ protected function addToWishlist(array $products, $configure = false) { - $addProductsToWishlistStep = $this->objectManager->create( + $this->objectManager->create( 'Magento\Wishlist\Test\TestStep\AddProductsToWishlistStep', ['products' => $products, 'configure' => $configure] - ); - - $addProductsToWishlistStep->run(); + )->run(); } } diff --git a/dev/tests/functional/utils/generate/constraint.php b/dev/tests/functional/utils/generate/constraint.php deleted file mode 100644 index 5dfd019f6c17046591a153cb136e0245dac581a3..0000000000000000000000000000000000000000 --- a/dev/tests/functional/utils/generate/constraint.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -require_once dirname(__DIR__) . '/' . 'bootstrap.php'; - -$objectManager->create('Magento\Mtf\Util\Generate\Constraint')->launch(); -\Magento\Mtf\Util\Generate\GenerateResult::displayResults(); diff --git a/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php b/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php index 6acd799855c98ff4bdfce79c329196a94919fea0..ca4260d5c037668987898fb26a647e0ee85aa113 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php +++ b/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php @@ -5,6 +5,8 @@ */ namespace Magento\CatalogInventory\Model\Stock; +use Magento\Indexer\Model\Indexer\State; + class ItemTest extends \PHPUnit_Framework_TestCase { /** @@ -21,6 +23,7 @@ class ItemTest extends \PHPUnit_Framework_TestCase /** * @magentoDataFixture Magento/Catalog/_files/products.php + * @magentoAppIsolation enabled */ public function testSaveWithNullQty() { @@ -31,11 +34,11 @@ class ItemTest extends \PHPUnit_Framework_TestCase $product->load(1); /** @var \Magento\CatalogInventory\Model\Stock\StockItemRepository $stockItemRepository */ - $stockItemRepository = $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + $stockItemRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\CatalogInventory\Model\Stock\StockItemRepository'); /** @var \Magento\CatalogInventory\Api\StockItemCriteriaInterface $stockItemCriteria */ - $stockItemCriteria = $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + $stockItemCriteria = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\CatalogInventory\Api\StockItemCriteriaInterface'); $savedStockItem = current($stockItemRepository->getList($stockItemCriteria)->getItems()); @@ -60,15 +63,49 @@ class ItemTest extends \PHPUnit_Framework_TestCase /** * @magentoDataFixture Magento/Catalog/_files/products.php + * @magentoAppIsolation enabled + */ + public function testIndexerInvalidation() + { + /** @var \Magento\CatalogInventory\Model\Stock\StockItemRepository $stockItemRepository */ + $stockItemRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\CatalogInventory\Model\Stock\StockItemRepository'); + + /** @var \Magento\CatalogInventory\Api\StockItemCriteriaInterface $stockItemCriteria */ + $stockItemCriteria = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\CatalogInventory\Api\StockItemCriteriaInterface'); + /** @var \Magento\CatalogInventory\Model\Indexer\Stock\Processor $indexerProcessor */ + $indexerProcessor = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\CatalogInventory\Model\Indexer\Stock\Processor'); + $indexer = $indexerProcessor->getIndexer(); + $indexer->setScheduled(true); + $indexer->getState()->setStatus(State::STATUS_VALID)->save(); + + /** @var \Magento\CatalogInventory\Api\Data\StockItemInterface $savedStockItem */ + $savedStockItem = current($stockItemRepository->getList($stockItemCriteria)->getItems()); + $savedStockItem->setQty(1); + $savedStockItem->setIsInStock(false); + $savedStockItem->save(); + + + $this->assertEquals('invalid', $indexerProcessor->getIndexer()->getStatus()); + + $indexer->setScheduled(false); + $indexer->getState()->setStatus(State::STATUS_VALID)->save(); + } + + /** + * @magentoDataFixture Magento/Catalog/_files/products.php + * @magentoAppIsolation enabled */ public function testStockStatusChangedAuto() { /** @var \Magento\CatalogInventory\Model\Stock\StockItemRepository $stockItemRepository */ - $stockItemRepository = $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + $stockItemRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\CatalogInventory\Model\Stock\StockItemRepository'); /** @var \Magento\CatalogInventory\Api\StockItemCriteriaInterface $stockItemCriteria */ - $stockItemCriteria = $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + $stockItemCriteria = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\CatalogInventory\Api\StockItemCriteriaInterface'); $savedStockItem = current($stockItemRepository->getList($stockItemCriteria)->getItems()); diff --git a/dev/tests/integration/testsuite/Magento/Checkout/Block/Cart/Item/RendererTest.php b/dev/tests/integration/testsuite/Magento/Checkout/Block/Cart/Item/RendererTest.php index a6957a03133f5dbf7030dd568537dca3d102011f..08220dd340ad85bb01a1dffbea9a1490baa0d014 100644 --- a/dev/tests/integration/testsuite/Magento/Checkout/Block/Cart/Item/RendererTest.php +++ b/dev/tests/integration/testsuite/Magento/Checkout/Block/Cart/Item/RendererTest.php @@ -62,12 +62,6 @@ class RendererTest extends \PHPUnit_Framework_TestCase $this->assertStringEndsWith('magento_image.jpg', $this->_block->getProductThumbnailSidebarUrl()); } - public function testGetConfigureUrl() - { - $testString = 'checkout/cart/configure/id/' . $this->_block->getItem()->getId() . '/product_id/1/'; - $this->assertStringEndsWith($testString, $this->_block->getConfigureUrl()); - } - /** * Gets \Magento\Quote\Model\Quote\Item from \Magento\Quote\Model\Quote by product id * diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php index bc462312b6b39882e3e9f89462332a16d997e150..942f3466297e180ce4faf64d5098b53d5df4e925 100755 --- a/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php +++ b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php @@ -32,8 +32,8 @@ class TemplateTest extends \PHPUnit_Framework_TestCase )->setConstructorArgs( [ $objectManager->get('Magento\Framework\Model\Context'), - $objectManager->get('Magento\Framework\View\DesignInterface'), $objectManager->get('Magento\Framework\Registry'), + $objectManager->get('Magento\Framework\View\DesignInterface'), $objectManager->get('Magento\Store\Model\App\Emulation'), $objectManager->get('Magento\Store\Model\StoreManager'), $objectManager->create('Magento\Framework\Filesystem'), diff --git a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message.php b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message.php new file mode 100644 index 0000000000000000000000000000000000000000..56674a5ba813b2f929843d3be0bcb3c91d4d618f --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message.php @@ -0,0 +1,40 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +require __DIR__ . '/../../Customer/_files/customer.php'; + +$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + +/** @var \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository */ +$customerRepository = $objectManager->create('Magento\Customer\Api\CustomerRepositoryInterface'); +$customer = $customerRepository->getById(1); + +/** @var \Magento\GiftMessage\Model\Message $message */ +$message = $objectManager->create('Magento\GiftMessage\Model\Message'); +$message->setSender('Romeo'); +$message->setRecipient('Mercutio'); +$message->setMessage('I thought all for the best.'); +$message->save(); + +/** @var \Magento\Quote\Model\Quote $quote */ +$quote = $objectManager->create('Magento\Quote\Model\Quote'); +$quote->setData( + [ + 'store_id' => 1, + 'is_active' => 1, + 'reserved_order_id' => 'message_order_21', + 'gift_message_id' => $message->getId(), + ] +)->assignCustomer($customer); +$quote->save(); + +/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ +$quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); +$quoteIdMask->setQuoteId($quote->getId()); +$quoteIdMask->setDataChanges(true); +$quoteIdMask->save(); diff --git a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message_rollback.php b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message_rollback.php new file mode 100644 index 0000000000000000000000000000000000000000..42ae5826a8e72e9d515bb6c52f71003b108c720f --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message_rollback.php @@ -0,0 +1,18 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + +/** @var \Magento\Quote\Model\Quote $quote */ +$quote = $objectManager->create('Magento\Quote\Model\Quote'); +$quote->load('message_order_21', 'reserved_order_id'); + +/** @var \Magento\GiftMessage\Model\Message $message */ +$message = $objectManager->create('Magento\GiftMessage\Model\Message'); +$message->load($quote->getGiftMessageId()); +$message->delete(); + +$quote->delete(); diff --git a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_item_message.php b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_item_message.php index cb590f2ddd2d818b9126340b5c13e4ba366d46f2..cb56c205bad7144ef1dc45d51840c374fdc5e803 100644 --- a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_item_message.php +++ b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_item_message.php @@ -44,3 +44,11 @@ $message->setRecipient('Jane Roe'); $message->setMessage('Gift Message Text'); $message->save(); $quote->getItemByProduct($quoteProduct)->setGiftMessageId($message->getId())->save(); + +/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ +$quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); +$quoteIdMask->setQuoteId($quote->getId()); +$quoteIdMask->setDataChanges(true); +$quoteIdMask->save(); diff --git a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_message.php b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_message.php index 848b8d256241769a30cdd4f1a4eb6ba38e6bf68d..7a575f296fd59deaf631108d7fd0976fd6fece2e 100644 --- a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_message.php +++ b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_message.php @@ -24,3 +24,11 @@ $quote->setData( ] ); $quote->save(); + +/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ +$quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); +$quoteIdMask->setQuoteId($quote->getId()); +$quoteIdMask->setDataChanges(true); +$quoteIdMask->save(); diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php index 1ae037a2b477a3957cc658ecdac90f7e737eef1e..ffd2dd8bb778d3e9c0650350d663d3c1d1dd8b7b 100644 --- a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php +++ b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php @@ -90,7 +90,6 @@ return [ 'cataloginventory_stock_status' => 'Magento\CatalogInventory', 'cataloginventory_stock_status_idx' => 'Magento\CatalogInventory', 'cataloginventory_stock_status_tmp' => 'Magento\CatalogInventory', - 'catalogrule_affected_product' => 'Magento\CatalogRule', 'catalogrule_customer_group' => 'Magento\CatalogRule', 'catalogrule' => 'Magento\CatalogRule', 'catalogrule_group_website' => 'Magento\CatalogRule', diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index 638d18c04958565b8638e3bf97df343a8e58cb9d..4cfed53e55352a8a77865f52862073abbf657605 100755 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3656,5 +3656,6 @@ return [ ['Magento\Centinel\Test\TestCase\CentinelPaymentsInvalidCcTest'], ['Magento\Centinel\Test\TestCase\CentinelPaymentsValidCcTest'], ['Magento\Centinel\CreateOrderTest'], - ['Magento\Payment\Model\Checks\PaymentMethodChecksInterface', 'Magento\Payment\Model\MethodInterface'] + ['Magento\Payment\Model\Checks\PaymentMethodChecksInterface', 'Magento\Payment\Model\MethodInterface'], + ['Magento\GiftMessage\Model\Plugin\TotalsDataProcessorPlugin'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 6a29c4ccecc5c13c26750ec49375acfe81db6f82..cd660a65eb1223dad2b303f80f1b0eac7e0280d8 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2257,5 +2257,10 @@ return [ ['getOrigData', 'Magento\Framework\Object', 'Moved to Magento\Framework\Model\AbstractModel'], ['dataHasChangedFor', 'Magento\Framework\Object', 'Moved to Magento\Framework\Model\AbstractModel'], ['setDataChanges', 'Magento\Framework\Object', 'Moved to Magento\Framework\Model\AbstractModel'], + [ + 'getConfigureUrl', + 'Magento\Checkout\Block\Cart\Item\Renderer', + '\Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit::getConfigureUrl' + ], ['getCurrenCategoryKey', 'Magento\Catalog\Block\Navigation', 'getCurrentCategoryKey'], ]; diff --git a/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php b/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php index b154d0183f2a3583c5bb0c1183e6fc2ffc3c7d6e..f8889d4f2cb4937f0d4a12aefb1c04254a8d78f7 100644 --- a/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php +++ b/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php @@ -105,7 +105,6 @@ return [ 'cataloginventory/stock_status' => 'cataloginventory_stock_status', 'cataloginventory/stock_status_indexer_idx' => 'cataloginventory_stock_status_idx', 'cataloginventory/stock_status_indexer_tmp' => 'cataloginventory_stock_status_tmp', - 'catalogrule/affected_product' => 'catalogrule_affected_product', 'catalogrule/customer_group' => 'catalogrule_customer_group', 'catalogrule/rule' => 'catalogrule', 'catalogrule/rule_group_website' => 'catalogrule_group_website', diff --git a/lib/internal/Magento/Framework/AppInterface.php b/lib/internal/Magento/Framework/AppInterface.php index b0b03dfcb471f368da7964d27b52ab16cae7f171..fb61d6803b3681c56a7af5ad3a29cc8468484e27 100644 --- a/lib/internal/Magento/Framework/AppInterface.php +++ b/lib/internal/Magento/Framework/AppInterface.php @@ -17,7 +17,7 @@ interface AppInterface /** * Magento version */ - const VERSION = '0.74.0-beta13'; + const VERSION = '0.74.0-beta14'; /** * Launch application diff --git a/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php b/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php index 96eb992ade3f58cd9e3d6860c36fc1310baacd4b..8bee03a383ef497ade430b261df56d493f6790f3 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php +++ b/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php @@ -129,6 +129,16 @@ interface AdapterInterface */ public function createTemporaryTable(Table $table); + /** + * Create temporary table from other table + * + * @param string $temporaryTableName + * @param string $originTableName + * @param bool $ifNotExists + * @return \Zend_Db_Statement_Interface + */ + public function createTemporaryTableLike($temporaryTableName, $originTableName, $ifNotExists = false); + /** * Drop temporary table from database * diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index 74d74986e0e68fb81a46da87df2e4d8b359cf2d4..94cbf428fd0d3022b596922cbd5196b8da8d9584 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -396,8 +396,9 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface protected function _checkDdlTransaction($sql) { if (is_string($sql) && $this->getTransactionLevel() > 0) { - $startSql = strtolower(substr(ltrim($sql), 0, 3)); - if (in_array($startSql, $this->_ddlRoutines)) { + $sqlMessage = explode(' ', $sql, 3); + $startSql = strtolower(substr(ltrim($sqlMessage[0]), 0, 3)); + if (in_array($startSql, $this->_ddlRoutines) && strcasecmp($sqlMessage[1], 'temporary') !== 0) { trigger_error(AdapterInterface::ERROR_DDL_MESSAGE, E_USER_ERROR); } } @@ -2002,6 +2003,24 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface return $this->query($sql); } + /** + * Create temporary table like + * + * @param string $temporaryTableName + * @param string $originTableName + * @param bool $ifNotExists + * @return \Zend_Db_Statement_Pdo + */ + public function createTemporaryTableLike($temporaryTableName, $originTableName, $ifNotExists = false) + { + $ifNotExistsSql = ($ifNotExists ? 'IF NOT EXISTS' : ''); + $temporaryTable = $this->quoteIdentifier($this->_getTableName($temporaryTableName)); + $originTable = $this->quoteIdentifier($this->_getTableName($originTableName)); + $sql = sprintf('CREATE TEMPORARY TABLE %s %s LIKE %s', $ifNotExistsSql, $temporaryTable, $originTable); + + return $this->query($sql); + } + /** * Rename several tables * diff --git a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php index ba80e64a256222d7d02ac7eaae6cd95f7ec3717a..87732d71a0f068818c993fd836d8baa8bb9d9d3a 100644 --- a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php +++ b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php @@ -625,6 +625,7 @@ abstract class AbstractDb extends \Magento\Framework\Model\Resource\AbstractReso * @return $this * @throws AlreadyExistsException * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) */ protected function _checkUnique(\Magento\Framework\Model\AbstractModel $object) { @@ -640,13 +641,13 @@ abstract class AbstractDb extends \Magento\Framework\Model\Resource\AbstractReso foreach ($fields as $unique) { $select->reset(\Zend_Db_Select::WHERE); - - if (is_array($unique['field'])) { - foreach ($unique['field'] as $field) { - $select->where($field . '=?', trim($data->getData($field))); + foreach ((array)$unique['field'] as $field) { + $value = $data->getData($field); + if ($value === null) { + $select->where($field . ' IS NULL'); + } else { + $select->where($field . '=?', trim($value)); } - } else { - $select->where($unique['field'] . '=?', trim($data->getData($unique['field']))); } if ($object->getId() || $object->getId() === '0') { diff --git a/lib/internal/Magento/Framework/composer.json b/lib/internal/Magento/Framework/composer.json index 1307d01001635ca7553aabcd9dcd94884d01801c..29ca6222b30be7c45122ac19c9f1c48c04c408fc 100644 --- a/lib/internal/Magento/Framework/composer.json +++ b/lib/internal/Magento/Framework/composer.json @@ -2,7 +2,7 @@ "name": "magento/framework", "description": "N/A", "type": "magento2-library", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/lib/web/css/docs/docs.css b/lib/web/css/docs/docs.css index c582689347ea21d675d48262cc12d75868a93be5..bd3fb54a7376ad58e526e199f281a813f7be7d46 100644 --- a/lib/web/css/docs/docs.css +++ b/lib/web/css/docs/docs.css @@ -8193,7 +8193,6 @@ pre { margin: 0 0 10px; line-height: 1.42857143; padding: 10px; - word-break: break-all; word-wrap: break-word; } pre code { @@ -8258,8 +8257,6 @@ cite { line-height: 3rem; } .example-word-wrap { - word-break: break-all; - word-break: break-word; word-wrap: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; @@ -8562,7 +8559,6 @@ pre { margin: 0 0 10px; line-height: 1.42857143; padding: 10px; - word-break: break-all; word-wrap: break-word; } pre code { @@ -8732,4 +8728,4 @@ body { padding: 15px; background-image: none; } -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL191dGlsaXRpZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9icmVhZGNydW1icy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2JyZWFkY3J1bWJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2ljb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX3R5cG9ncmFwaHkubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9pY29ucy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2J1dHRvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19idXR0b25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZm9ybXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19mb3Jtcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19sb2FkZXJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9tZXNzYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX21lc3NhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZ3JpZHMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9wYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3BhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmVzcG9uc2l2ZS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3NlY3Rpb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fc2VjdGlvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL190YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90b29sdGlwcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3Rvb2x0aXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3V0aWxpdGllcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2RvY3MubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpREksZ0JBQUM7QUFDRCxnQkFBQztFQUNHLFNBQVMsRUFBVDtFQUNBLGNBQUE7O0FBRUosZ0JBQUM7RUFDRyxXQUFBOztBQ25CUixnQkMyQ0k7RUFDSSxXQUFBOztBRDVDUixnQkM4Q0k7RUFDSSxZQUFBOztBRC9DUixnQkNWSTtBRFVKLGdCQ1RJO0VBQ0ks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 */ \ No newline at end of file +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL191dGlsaXRpZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9icmVhZGNydW1icy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2JyZWFkY3J1bWJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2ljb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX3R5cG9ncmFwaHkubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9pY29ucy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2J1dHRvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19idXR0b25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZm9ybXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19mb3Jtcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19sb2FkZXJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9tZXNzYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX21lc3NhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZ3JpZHMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9wYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3BhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmVzcG9uc2l2ZS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3NlY3Rpb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fc2VjdGlvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL190YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90b29sdGlwcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3Rvb2x0aXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3V0aWxpdGllcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2RvY3MubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpREksZ0JBQUM7QUFDRCxnQkFBQztFQUNHLFNBQVMsRUFBVDtFQUNBLGNBQUE7O0FBRUosZ0JBQUM7RUFDRyxXQUFBOztBQ25CUixnQkMyQ0k7RUFDSSxXQUFBOztBRDVDUixnQkM4Q0k7RUFDSSxZQUFBOztBRC9DUixnQkNWSTtBRFVKLGdCQ1RJO0VBQ0ks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 */ \ No newline at end of file diff --git a/lib/web/css/docs/icons.html b/lib/web/css/docs/icons.html index c20166dc31e9f29cd1ba8e5d4a9c434d1c5ff13d..7058b1369e74c6a133659d934dbb7ea2b9c0b96c 100644 --- a/lib/web/css/docs/icons.html +++ b/lib/web/css/docs/icons.html @@ -1,12 +1,12 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> - +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> + <!DOCTYPE html><html><head><title>icons | Magento UI Library -</title><meta charset="utf-8"><style>*{-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;border:0}body{padding:60px 0 40px;background-color:hsl(207,10%,90%);color:hsl(207,5%,30%)}.container{max-width:1300px;margin:0 auto;padding:0 20px}.section{position:relative;margin-bottom:20px}.docs{position:relative;z-index:2;width:68%;min-height:200px;background-color:hsl(207,0%,100%);background-clip:padding-box;border:1px solid hsla(207,5%,5%,.1);border-radius:5px;box-shadow:0 0 3px hsla(207,5%,5%,.1)}.code{position:absolute;top:5px;bottom:5px;right:0;z-index:1;width:33%;padding:10px 10px 10px 20px;border-radius:0 5px 5px 0;border:1px solid hsla(207,20%,10%,.1);background-color:hsla(207,20%,95%,.9);background-clip:padding-box;opacity:.5;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.code:hover{opacity:1}.preview{background:hsl(207,0%,100%);border-top:1px solid hsl(207,30%,95%);position:relative;z-index:1}.preview-code+.preview{margin-top:0;border-top:0}.preview iframe{display:block;width:100%;height:100%;overflow:hidden}.preview-code{position:relative;z-index:2;display:block;width:100%;color:hsl(207,9%,37%);max-height:200px;padding:10px 20px;overflow-y:auto;background:hsl(207,30%,95%);border:1px solid hsl(207,30%,85%);border-left:0;border-right;box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1);line-height:1.1!important;resize:none}.preview-code:focus{outline:0;background:hsl(207,30%,97%);box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1),0 0 5px hsla(207,75%,75%,.9)}.preview-code:last-child{border-bottom:0;border-radius:0 0 5px 5px}.resizeable{padding:15px;overflow:auto;background:hsl(207,0%,100%);box-shadow:0 0 2px hsla(207,10%,20%,.2);resize:both}.preview-code,pre{white-space:pre-wrap;word-wrap:break-word;overflow-y:auto}.code pre{height:100%;margin-top:0}.bar{position:fixed;left:0;right:0;z-index:1010;min-height:40px;line-height:40px;background-image:-webkit-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-moz-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-o-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92))}.bar.top{top:0;box-shadow:0 1px 2px hsla(207,5%,0%,.2)}.bar.bottom{bottom:0;box-shadow:0 -1px 2px hsla(207,5%,0%,.2)}.bar ul{margin:0!important}.bar li{display:block;list-style:none}.bar .icon path{fill:hsla(27,10%,75%,.75)}.docs .icon path{fill:hsla(207,10%,75%,.5)}.docs .permalink:hover .icon path{fill:hsl(207,10%,75%)}.bar button{color:hsla(27,10%,75%,.75)}.bar button:hover .icon path,.bar button.is-active .icon path{fill:hsl(27,10%,85%)}.bar button:hover,.bar button.is-active{color:hsl(27,10%,85%)}.bar .icon{vertical-align:middle;display:inline-block}.bar,.bar a,.bar a:visited{color:hsl(27,10%,85%);text-shadow:1px 1px 0 hsla(27,5%,0%,.5)}.bar a:hover,.bar a.is-active{color:hsl(27,10%,95%);text-shadow:1px 1px 0 hsla(27,5%,0%,1);text-decoration:none}.brand{float:left;margin-right:20px;font-weight:700;font-size:16px;text-decoration:none}.brand,a.brand,a.brand:visited{color:hsl(27,5%,5%);text-shadow:1px 1px 0 hsla(27,5%,100%,.2)}.brand:hover,a.brand:hover{color:hsl(27,5%,0%);text-shadow:1px 1px 0 hsla(27,5%,100%,.3);text-decoration:none}.menu{font-size:12px}.menu>li{float:left;position:relative}.menu a{display:block;margin-right:15px}.dropdown-toggle{position:relative;padding-right:15px}.dropdown-toggle:after{display:block;position:absolute;right:0;top:18px;content:'';border:4px solid;border-left-color:transparent;border-right-color:transparent;border-bottom-color:transparent}.nav-results,.dropdown{position:absolute;z-index:1020;top:32px;left:-16px;width:175px;max-height:500px;padding:10px 0;overflow-y:auto;word-wrap:break-word;font-size:11px;line-height:20px;background-color:hsla(207,10%,25%,.97);border:1px solid hsla(207,5%,70%,.3);border-radius:3px;box-shadow:0 0 3px hsla(207,5%,0%,.2)}.toc-list{width:200px}.nav-results{right:0;width:200px;left:auto;padding:5px 0}.nav-results-filename{display:block;font-size:10px;opacity:.75}.nav-results a{display:block;line-height:15px;padding:5px 10px}.nav-results li:not([hidden])~li a{border-top:1px solid hsla(27,10%,90%,.1)}.dropdown a{padding:0 15px}.dropdown li:hover{background-color:hsl(207,10%,22%)}.nav{float:right;position:relative}.nav input[type="search"]{padding:2px 4px;color:#fff;width:150px;border:1px solid hsla(207,5%,0%,.3);background:hsla(207,12%,40%,.9);box-shadow:inset 1px 1px 3px hsla(207,5%,0%,.05),1px 1px 0 hsla(207,5%,100%,.05);border-radius:10px;-webkit-appearance:textfield}.nav input[type="search"]:focus{outline:0;background:hsla(207,7%,45%,.9)}.settings{text-align:center}.bar button{display:inline-block;vertical-align:middle;padding:0 5px;margin:0 3px;background:transparent}.bar button:first-child{margin-left:0}.settings .auto{line-height:32px;font-size:11px;font-weight:700;letter-spacing:-1px;text-shadow:none;text-transform:uppercase}body{font-family:sans-serif;font-size:14px;line-height:1.618}.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-left:20px;margin-right:20px}.preview,.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-top:10px}ul ul,ol ol,ul ol,ol ul,blockquote p:last-child{margin-top:0}ul,ol{padding-left:1.5em}p:last-child,ol:last-child,ul:last-child,dl:last-child{margin-bottom:20px}hr,h1,h2,h3,h4,h5,h6{margin:1em 20px .5em}h1:first-of-type{margin-top:20px}h1,h2,h3,h4,h5,h6{line-height:1.2;color:hsl(207,10%,50%)}h1 a,h1 a:hover,h1 a:visited{color:inherit;text-decoration:inherit}h1{font-size:3.052em;font-weight:400;color:hsl(207,10%,45%)}h2{font-size:1.953em}h3{font-size:1.536em}h1,h2,h3{letter-spacing:-.025em}h4{font-size:1.25em}h5{font-size:1em;text-transform:uppercase}h6{font-size:1em}.permalink{position:absolute;top:15px;right:15px}a{color:hsl(207,90%,50%);text-decoration:none}a:hover{color:hsl(207,95%,40%);text-decoration:underline}a:visited{color:hsl(207,100%,35%)}.preview-code,pre,code,var{font-style:normal;font-family:"Ubuntu Mono","Andale Mono","DejaVu Sans Mono","Monaco","Bitstream Vera Sans Mono","Consolas","Lucida Console",monospace;font-size:12px}.docs pre,code,var{padding:.1em 3px;background:hsla(207,5%,0%,.025);border:1px solid hsla(207,5%,0%,.05);border-radius:3px}.code pre{line-height:1.1!important}pre code{padding:0;background:transparent;border:0}.cf:before,.cf:after{content:'';display:table}.cf:after{clear:both}[unselectable="on"]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[hidden]{display:none!important}small{font-size:85%;opacity:.9}.docs .vars_list{width:100%}.docs .vars_list th,.docs .vars_list td{width:33%}.docs pre th{text-align:left}.docs pre table{border-collapse:collapse;margin:0}.docs th,.docs td{border:0;padding:9px 10px 9px 0;vertical-align:top}.docs tr th:last-child,.docs tr td:last-child{padding-right:0}.docs pre th{font-weight:400}.docs pre th.vars_head{border-bottom:1px solid #e5e5e5;color:#707070;white-space:nowrap}.docs pre th.vars_section{border-bottom:1px solid #e5e5e5;color:#333;font-size:18px;padding-top:30px}.vars_value{color:#338bb8}.docs li p{margin:0 0 20px}.dropdown a{text-transform:capitalize}#default-button #default-button-big+.preview+.preview-code{display:block}#actions-toolbar-alignment .preview-code,#reverse-primary-and-secondary-blocks .preview-code,#actions-toolbar-indents-customizations .preview-code,#actionstoolbarclearfloats-mixin .preview-code,#responsive-actions-toolbar .preview-code,#button-with-gradient-background .preview-code,#primary-button .preview-code,#button-as-an-icon .preview-code,#button-with-an-icon-on-the-left-or-right-side-of-the-text .preview-code,#button-with-fixed-width .preview-code,#button-as-a-link .preview-code,#link-as-a-button .preview-code,#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol .preview-code,#breadcrumbs-with-solid-background .preview-code,#pagination-without-label-with-solid-background .preview-code,#pagination-with-label-and-text-previousnext-links .preview-code,#pagination-with-label-and-gradient-background-on-links .preview-code,#fixed-height-popup .preview-code,#fixed-content-height-popup .preview-code,#margins-for-header-content-and-footer-block-in-popup .preview-code,#popup-titles-with-styled-as-theme-headings .preview-code,#popup-action-toolbar .preview-code,#popup-close-button-without-an-icon .preview-code,#modify-icon-of-popup-close-button .preview-code,#modify-overlay-styles .preview-code,#rating-summary-multiple-ratings .preview-code,#rating-summary-hide-label .preview-code,#rating-summary-icons-symbol .preview-code,#rating-summary-icons-color .preview-code,#rating-summary-set-number-of-icons .preview-code,#rating-summary .preview-code,#rating-with-vote-icon-symbol .preview-code,#rating-with-vote-setup-icons-colors .preview-code,#rating-with-vote-setup-number-of-icons .preview-code,#tabs-with-content-top-border .preview-code,#accordion-mixin-variables .preview-code,#tabs-base .preview-code,#accordion-base .preview-code,#warning-message .preview-code,#error-message .preview-code,#success-message .preview-code,#notice-message .preview-code,#message-with-inner-icon .preview-code,#message-with-lateral-icon .preview-code,#custom-message-style .preview-code,#modify-dropdown-list-styles .preview-code,#dropdown-with-icon-customization .preview-code,#split-button-button-styling .preview-code,#split-button-icon-customization .preview-code,#split-button-dropdown-list-customization .preview-code,#table-cells-resize .preview-code,#table-caption .preview-code,#table-typography .preview-code,#table-background-customization .preview-code,#table-borders-customization .preview-code,#table-without-borders .preview-code,#table-with-horizontal-borders .preview-code,#table-with-vertical-borders .preview-code,#striped-table .preview-code,#responsive-table-technics-1 .preview-code,#responsive-table-technics-2 .preview-code,#fontsize-mixin .preview-code,#word-breaking-mixin .preview-code,#word-breaking-mixin .preview-code,#text-overflow-mixin .preview-code,#text-hide .preview-code,#hyphens .preview-code,#font-style-and-color .preview-code,#reset-list-styles .preview-code,#inlineblock-list-item-styling .preview-code,#link-styling-mixin .preview-code,#heading-styling-mixin .preview-code,#icon-with-image-or-sprite .preview-code,#change-the-size-of-font-icon .preview-code,#sprite-and-font-icons-for-blank-theme .preview-code,#icon-position-for-an-icon-with-image-or-sprite .preview-code{display:none}article[id$="-variables"] .docs,#resets .docs,#ratings .docs,#tabs-and-accordions .docs,#messages .docs,#dropdown-and-split-buttons-mixins .docs,#font-face-mixin .docs,#layout .docs,#forms-mixins .docs,#including-magento-ui-library-to-your-theme .docs,#global-forms-elements-customization .docs,#mobile-off-canvas-navigation .docs,#desktop-navigation .docs,#layout-width .docs{width:100%}article[id$="-variables"] .code{display:none}article[id$="-variables"] .docs pre{background:#fff;border:0;margin-top:0}</style><script type="text/preview">(function(){"use strict";var a=function(a){return Array.prototype.slice.call(a)},b=document.getElementsByTagName("body")[0],c=["link","visited","hover","active","focus","target","enabled","disabled","checked"],d=new RegExp(":(("+c.join(")|(")+"))","gi"),e=a(document.styleSheets).map(function(b){return a(b.cssRules).filter(function(a){return a.selectorText&&a.selectorText.match(d)}).map(function(a){return a.cssText.replace(d,".\\3A $1")}).join("")}).join("");if(e.length){var f=document.createElement("style");f.innerText=e;var g=document.getElementsByTagName("style")[0];g.parentNode.insertBefore(f,g)}var h=function(){var a=window.getComputedStyle(b,null);return function(){if(b.childElementCount===0)return b.offsetHeight;var c=b.getElementsByTagName("*"),d=[];for(var e=0,f=c.length;e<f;e++)d.push(c[e].offsetTop+c[e].offsetHeight+parseInt(window.getComputedStyle(c[e],null).getPropertyValue("margin-bottom")));var g=Math.max.apply(Math,d);return g+=parseInt(a.getPropertyValue("padding-bottom"),10),Math.max(g,b.offsetHeight)}}(),i={getHeight:function(){window.parent.postMessage({height:h()},"*")}};window.addEventListener("message",function(a){if(a.data==null)return;typeof a.data=="string"&&i[a.data]()},!1)})()</script><style type="text/preview">.actions-toolbar:before,.actions-toolbar:after{content:"";display:table}.actions-toolbar:after{clear:both}.actions-toolbar .primary{float:left}.actions-toolbar .secondary{float:right}.actions-toolbar .primary,.actions-toolbar .secondary{display:inline-block}.actions-toolbar .primary a.action,.actions-toolbar .secondary a.action{display:inline-block}.actions-toolbar .primary .action{margin:0 5px 0 0}.actions-toolbar .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-2:before,.example-actions-toolbar-2:after{content:"";display:table}.example-actions-toolbar-2:after{clear:both}.example-actions-toolbar-2 .primary{float:left}.example-actions-toolbar-2 .secondary{float:right}.example-actions-toolbar-2 .primary,.example-actions-toolbar-2 .secondary{display:inline-block}.example-actions-toolbar-2 .primary a.action,.example-actions-toolbar-2 .secondary a.action{display:inline-block}.example-actions-toolbar-2 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-2 .secondary a.action{margin-top:6px}.example-actions-toolbar-3{text-align:left}.example-actions-toolbar-3:before,.example-actions-toolbar-3:after{content:"";display:table}.example-actions-toolbar-3:after{clear:both}.example-actions-toolbar-3 .primary{float:left}.example-actions-toolbar-3 .primary,.example-actions-toolbar-3 .secondary{display:inline-block}.example-actions-toolbar-3 .primary a.action,.example-actions-toolbar-3 .secondary a.action{display:inline-block}.example-actions-toolbar-3 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-3 .secondary a.action{margin-top:6px}.example-actions-toolbar-4{text-align:right}.example-actions-toolbar-4:before,.example-actions-toolbar-4:after{content:"";display:table}.example-actions-toolbar-4:after{clear:both}.example-actions-toolbar-4 .secondary{float:right}.example-actions-toolbar-4 .primary,.example-actions-toolbar-4 .secondary{display:inline-block}.example-actions-toolbar-4 .primary a.action,.example-actions-toolbar-4 .secondary a.action{display:inline-block}.example-actions-toolbar-4 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-4 .secondary a.action{margin-top:6px}.example-actions-toolbar-5{text-align:center}.example-actions-toolbar-5:before,.example-actions-toolbar-5:after{content:"";display:table}.example-actions-toolbar-5:after{clear:both}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{vertical-align:top}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{display:inline-block}.example-actions-toolbar-5 .primary a.action,.example-actions-toolbar-5 .secondary a.action{display:inline-block}.example-actions-toolbar-5 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-5 .secondary a.action{margin-top:6px}.example-actions-toolbar-6:before,.example-actions-toolbar-6:after{content:"";display:table}.example-actions-toolbar-6:after{clear:both}.example-actions-toolbar-6 .primary{float:right}.example-actions-toolbar-6 .secondary{float:left}.example-actions-toolbar-6 .primary,.example-actions-toolbar-6 .secondary{display:inline-block}.example-actions-toolbar-6 .primary a.action,.example-actions-toolbar-6 .secondary a.action{display:inline-block}.example-actions-toolbar-6 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-6 .secondary a.action{margin-top:6px}.example-actions-toolbar-7{text-align:left}.example-actions-toolbar-7:before,.example-actions-toolbar-7:after{content:"";display:table}.example-actions-toolbar-7:after{clear:both}.example-actions-toolbar-7 .secondary{float:left}.example-actions-toolbar-7 .primary,.example-actions-toolbar-7 .secondary{display:inline-block}.example-actions-toolbar-7 .primary a.action,.example-actions-toolbar-7 .secondary a.action{display:inline-block}.example-actions-toolbar-7 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-7 .secondary a.action{margin-top:6px}.example-actions-toolbar-8{text-align:right}.example-actions-toolbar-8:before,.example-actions-toolbar-8:after{content:"";display:table}.example-actions-toolbar-8:after{clear:both}.example-actions-toolbar-8 .primary{float:right}.example-actions-toolbar-8 .primary,.example-actions-toolbar-8 .secondary{display:inline-block}.example-actions-toolbar-8 .primary a.action,.example-actions-toolbar-8 .secondary a.action{display:inline-block}.example-actions-toolbar-8 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-8 .secondary a.action{margin-top:6px}.example-actions-toolbar-9{margin:10px;padding:10px}.example-actions-toolbar-9:before,.example-actions-toolbar-9:after{content:"";display:table}.example-actions-toolbar-9:after{clear:both}.example-actions-toolbar-9 .primary{float:left}.example-actions-toolbar-9 .secondary{float:right}.example-actions-toolbar-9 .primary,.example-actions-toolbar-9 .secondary{display:inline-block}.example-actions-toolbar-9 .primary a.action,.example-actions-toolbar-9 .secondary a.action{display:inline-block}.example-actions-toolbar-9 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-9 .secondary a.action{margin-top:6px}.example-actions-toolbar-10{text-align:left}.example-actions-toolbar-10:before,.example-actions-toolbar-10:after{content:"";display:table}.example-actions-toolbar-10:after{clear:both}.example-actions-toolbar-10 .primary{float:left}.example-actions-toolbar-10 .primary,.example-actions-toolbar-10 .secondary{display:inline-block}.example-actions-toolbar-10 .primary a.action,.example-actions-toolbar-10 .secondary a.action{display:inline-block}.example-actions-toolbar-10 .primary .action{margin:0 50px 0 0}.example-actions-toolbar-10 .secondary a.action{margin-top:6px}.example-actions-toolbar-11{text-align:left}.example-actions-toolbar-11:before,.example-actions-toolbar-11:after{content:"";display:table}.example-actions-toolbar-11:after{clear:both}.example-actions-toolbar-11 .primary{float:left}.example-actions-toolbar-11 .primary,.example-actions-toolbar-11 .secondary{display:inline-block}.example-actions-toolbar-11 .primary a.action,.example-actions-toolbar-11 .secondary a.action{display:inline-block}.example-actions-toolbar-11 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-11 .secondary .action{margin:0 50px 0 0}.example-actions-toolbar-11 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}@media only screen and (max-width: 768px){.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{ display:block;float:none}}.example-breadcrumbs-1{margin:0 0 20px}.example-breadcrumbs-1 .items{font-size:1.2rem;color:#a3a3a3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-1 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-1 .item{margin:0}.example-breadcrumbs-1 a{color:#333;text-decoration:none}.example-breadcrumbs-1 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-1 a:hover{color:#333;text-decoration:underline}.example-breadcrumbs-1 a:active{color:#333;text-decoration:none}.example-breadcrumbs-1 strong{font-weight:400}.example-breadcrumbs-1 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-1 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-2{margin:0 0 20px}.example-breadcrumbs-2 .items{font-size:1.2rem;color:#1979c3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-2 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-2 .item{margin:0}.example-breadcrumbs-2 a{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #ccc;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-2 a:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 strong{background-color:#ff5501;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f7b32e 0, #ff5501 100%);background-image:linear-gradient(to bottom, #f7b32e 0, #ff5501 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7b32e', endColorstr='#ff5501', GradientType=0);border:1px solid #d04b0a;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-2 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-2 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3{margin:0 0 20px}.example-breadcrumbs-3 .items{font-size:1.2rem;color:#333;margin:0;padding:0;list-style:none none}.example-breadcrumbs-3 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-3 .item{margin:0}.example-breadcrumbs-3 a{background:#f4f4f4;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-3 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-3 a:hover{background:#ccc;color:#333;text-decoration:none}.example-breadcrumbs-3 a:active{color:#333;text-decoration:none}.example-breadcrumbs-3 strong{background:#e7e7e7;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-3 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-3 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3 .item a{position:relative;margin:0 11px 0 0}.example-breadcrumbs-3 .item a:after{border:12px solid transparent;height:0;width:0;border-left-color:#f4f4f4;content:"";position:absolute;display:block;top:0;right:-23px}.example-breadcrumbs-3 .item a:hover:after{border-color:transparent transparent transparent #ccc}button{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}button:focus,button:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}button:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}button.disabled,button[disabled],fieldset[disabled] button{cursor:default;pointer-events:none;opacity:.5}button:active,button:focus{box-shadow:inset 0 2px 1px rgba(0,0,0,.12)}.example-button-1.example-button-2{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-button-1.example-button-3{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;border-radius:0;color:#000}.example-button-1.example-button-3:hover,.example-button-1.example-button-3.active{color:#000}.example-button-10{background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-10>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-button-10:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-10:hover:before{color:inherit}.example-button-10:active:before{color:inherit}.example-button-10:focus,.example-button-10:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-10:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:default;pointer-events:none;opacity:.5}.example-button-10:focus,.example-button-10:active{background:0;border:0}.example-button-10:hover{background:0;border:0}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-11{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-11:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-11:hover:before{color:inherit}.example-button-11:active:before{color:inherit}.example-button-11:focus,.example-button-11:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-11:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-11.disabled,.example-button-11[disabled],fieldset[disabled] .example-button-11{cursor:default;pointer-events:none;opacity:.5}.example-button-12{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-12:after{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-12:hover:after{color:inherit}.example-button-12:active:after{color:inherit}.example-button-12:focus,.example-button-12:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-12:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-12.disabled,.example-button-12[disabled],fieldset[disabled] .example-button-12{cursor:default;pointer-events:none;opacity:.5}.example-button-13{background-image:none;background:#f2f2f2;padding:7px 15px;width:100px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-13:focus,.example-button-13:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-13:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-13.disabled,.example-button-13[disabled],fieldset[disabled] .example-button-13{cursor:default;pointer-events:none;opacity:.5}.example-button-4{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-4:focus,.example-button-4:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4.disabled,.example-button-4[disabled],fieldset[disabled] .example-button-4{cursor:default;pointer-events:none;opacity:.5}.example-button-4:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-4.example-button-5{line-height:2.2rem;padding:7px 35px;font-size:1.8rem}.example-button-4.example-button-6{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;color:#fff}.example-button-4.example-button-6:hover,.example-button-4.example-button-6.active{color:#fff}.example-button-7{background-image:none;background:#f2f2f2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #1979c3 0, #006bb4 100%);background-image:linear-gradient(to bottom, #1979c3 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1979c3', endColorstr='#006bb4', GradientType=0);padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}.example-button-7:focus,.example-button-7:active{background:#e2e2e2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #006bb4 100%);background-image:linear-gradient(to bottom, #006bb4 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#006bb4', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7:hover{background:#e2e2e2;background-color:#1979c3;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #1979c3 100%);background-image:linear-gradient(to bottom, #006bb4 0, #1979c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#1979c3', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7.disabled,.example-button-7[disabled],fieldset[disabled] .example-button-7{cursor:default;pointer-events:none;opacity:.5}.example-button-7:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-8{background:0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;font-weight:400}.example-button-8:visited{color:#1979c3;text-decoration:none}.example-button-8:hover{color:#006bb4;text-decoration:underline}.example-button-8:active{color:#ff5501;text-decoration:underline}.example-button-8:hover{color:#006bb4}.example-button-8:hover,.example-button-8:active,.example-button-8:focus{background:0;border:0}.example-button-8.disabled,.example-button-8[disabled],fieldset[disabled] .example-button-8{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.example-button-8:active{box-shadow:none}.example-button-9{text-decoration:none;background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:0;vertical-align:middle;margin:3px;border-radius:3px;font-weight:700}.example-button-9:hover,.example-button-9:active,.example-button-9:focus{text-decoration:none}.example-button-9:focus,.example-button-9:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-9:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-9.disabled,.example-button-9[disabled],fieldset[disabled] .example-button-9{cursor:default;pointer-events:none;opacity:.5}.example-button-9:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-14{background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-14:focus,.example-button-14:active{background:0;border:0}.example-button-14:hover{background:0;border:0}.example-button-14.disabled,.example-button-14[disabled],fieldset[disabled] .example-button-14{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-15{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;vertical-align:middle;background:#f2f2f2;color:#333;border:1px solid #cdcdcd}.example-button-15:focus,.example-button-15:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15.disabled,.example-button-15[disabled],fieldset[disabled] .example-button-15{cursor:default;pointer-events:none;opacity:.5}.example-button-15:focus,.example-button-15:active{background:#e2e2e2;color:#333;border:1px solid #cdcdcd}.example-button-15:hover{background:#e2e2e2;color:#555;border:1px solid #cdcdcd}.example-button-17{line-height:2.2rem;padding:14px 17px;font-size:1.8rem;font-size:1.4rem;line-height:1.6rem;padding:7px 15px}.example-button-18{font-size:1rem;line-height:1.2rem;padding:4px 10px}.example-dropdown-1{display:inline-block;position:relative}.example-dropdown-1:before,.example-dropdown-1:after{content:"";display:table}.example-dropdown-1:after{clear:both}.example-dropdown-1 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle:hover:after{color:inherit}.example-dropdown-1 .action.toggle:active:after{color:inherit}.example-dropdown-1 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle.active:hover:after{color:inherit}.example-dropdown-1 .action.toggle.active:active:after{color:inherit}.example-dropdown-1 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-1 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-1 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-1 ul.dropdown:before,.example-dropdown-1 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-1 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-1 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-1 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-1 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-1.active{overflow:visible}.example-dropdown-1.active ul.dropdown{display:block}.example-dropdown-2{display:inline-block;position:relative}.example-dropdown-2:before,.example-dropdown-2:after{content:"";display:table}.example-dropdown-2:after{clear:both}.example-dropdown-2 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle:hover:after{color:inherit}.example-dropdown-2 .action.toggle:active:after{color:inherit}.example-dropdown-2 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle.active:hover:after{color:inherit}.example-dropdown-2 .action.toggle.active:active:after{color:inherit}.example-dropdown-2 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-2 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-2 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-2 ul.dropdown:before,.example-dropdown-2 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-2 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-2 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-2 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-2 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-2.active{overflow:visible}.example-dropdown-2.active ul.dropdown{display:block}.example-dropdown-3{display:inline-block;position:relative}.example-dropdown-3:before,.example-dropdown-3:after{content:"";display:table}.example-dropdown-3:after{clear:both}.example-dropdown-3 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle:hover:before{color:red}.example-dropdown-3 .action.toggle:active:before{color:inherit}.example-dropdown-3 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle.active:hover:before{color:red}.example-dropdown-3 .action.toggle.active:active:before{color:inherit}.example-dropdown-3 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-3 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-3 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-3 ul.dropdown:before,.example-dropdown-3 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-3 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-3 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-3 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-3 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-3.active{overflow:visible}.example-dropdown-3.active ul.dropdown{display:block}.example-dropdown-5{display:inline-block;position:relative}.example-dropdown-5:before,.example-dropdown-5:after{content:"";display:table}.example-dropdown-5:after{clear:both}.example-dropdown-5 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle:hover:after{color:inherit}.example-dropdown-5 .action.toggle:active:after{color:inherit}.example-dropdown-5 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle.active:hover:after{color:inherit}.example-dropdown-5 .action.toggle.active:active:after{color:inherit}.example-dropdown-5 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-5 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-5 ul.dropdown li:first-child{border:0}.example-dropdown-5 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-5.active{overflow:visible}.example-dropdown-5.active ul.dropdown{display:block}.example-dropdown-6{display:inline-block;position:relative}.example-dropdown-6:before,.example-dropdown-6:after{content:"";display:table}.example-dropdown-6:after{clear:both}.example-dropdown-6 .action.split{float:left;margin:0}.example-dropdown-6 .action.toggle{float:right;margin:0}.example-dropdown-6 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-6 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-6 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle:hover:after{color:inherit}.example-dropdown-6 .action.toggle:active:after{color:inherit}.example-dropdown-6 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle.active:hover:after{color:inherit}.example-dropdown-6 .action.toggle.active:active:after{color:inherit}.example-dropdown-6 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-6 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-6 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-6 ul.dropdown:before,.example-dropdown-6 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-6 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-6 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-6 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-6 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-6.active{overflow:visible}.example-dropdown-6.active ul.dropdown{display:block}.split.example-dropdown-7{display:inline-block;position:relative}.split.example-dropdown-7:before,.split.example-dropdown-7:after{content:"";display:table}.split.example-dropdown-7:after{clear:both}.split.example-dropdown-7 .action.split{float:left;margin:0}.split.example-dropdown-7 .action.toggle{float:right;margin:0}.split.example-dropdown-7 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle:active:after{color:inherit}.split.example-dropdown-7 .action.toggle.active{display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle.active:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle.active:active:after{color:inherit}.split.example-dropdown-7 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.split.example-dropdown-7 ul.dropdown li{margin:0;padding:3px 5px}.split.example-dropdown-7 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.split.example-dropdown-7 ul.dropdown:before,.split.example-dropdown-7 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.split.example-dropdown-7 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.split.example-dropdown-7 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.split.example-dropdown-7 ul.dropdown:before{top:-12px;right:10px}.split.example-dropdown-7 ul.dropdown:after{top:-14px;right:9px}.split.example-dropdown-7.active{overflow:visible}.split.example-dropdown-7.active ul.dropdown{display:block}.example-dropdown-8{display:inline-block;position:relative}.example-dropdown-8:before,.example-dropdown-8:after{content:"";display:table}.example-dropdown-8:after{clear:both}.example-dropdown-8 .action.split{float:left;margin:0}.example-dropdown-8 .action.toggle{float:right;margin:0}.example-dropdown-8 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-8 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-8 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle:hover:after{color:inherit}.example-dropdown-8 .action.toggle:active:after{color:inherit}.example-dropdown-8 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle.active:hover:after{color:inherit}.example-dropdown-8 .action.toggle.active:active:after{color:inherit}.example-dropdown-8 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-8 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-8 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-8 ul.dropdown:before,.example-dropdown-8 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-8 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-8 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-8 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-8 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-8.active{overflow:visible}.example-dropdown-8.active ul.dropdown{display:block}.example-dropdown-9{display:inline-block;position:relative}.example-dropdown-9 .action.split,.example-dropdown-9 .action.toggle{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-dropdown-9:before,.example-dropdown-9:after{content:"";display:table}.example-dropdown-9:after{clear:both}.example-dropdown-9 .action.split{float:left;margin:0}.example-dropdown-9 .action.toggle{float:right;margin:0}.example-dropdown-9 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-9 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-9 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle:hover:after{color:inherit}.example-dropdown-9 .action.toggle:active:after{color:inherit}.example-dropdown-9 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle.active:hover:after{color:inherit}.example-dropdown-9 .action.toggle.active:active:after{color:inherit}.example-dropdown-9 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-9 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-9 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-9 ul.dropdown:before,.example-dropdown-9 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-9 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-9 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-9 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-9 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-9.active{overflow:visible}.example-dropdown-9.active ul.dropdown{display:block}.example-dropdown-10{display:inline-block;position:relative}.example-dropdown-10 .action.split,.example-dropdown-10 .action.toggle{line-height:1.2rem;padding:5px 8px;font-size:1.1rem}.example-dropdown-10:before,.example-dropdown-10:after{content:"";display:table}.example-dropdown-10:after{clear:both}.example-dropdown-10 .action.split{float:left;margin:0}.example-dropdown-10 .action.toggle{float:right;margin:0}.example-dropdown-10 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-10 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-10 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle:hover:after{color:inherit}.example-dropdown-10 .action.toggle:active:after{color:inherit}.example-dropdown-10 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle.active:hover:after{color:inherit}.example-dropdown-10 .action.toggle.active:active:after{color:inherit}.example-dropdown-10 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-10 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-10 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-10 ul.dropdown:before,.example-dropdown-10 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-10 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-10 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-10 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-10 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-10.active{overflow:visible}.example-dropdown-10.active ul.dropdown{display:block}.example-dropdown-11{display:inline-block;position:relative}.example-dropdown-11:before,.example-dropdown-11:after{content:"";display:table}.example-dropdown-11:after{clear:both}.example-dropdown-11 .action.split{float:right;margin:0}.example-dropdown-11 .action.toggle{float:left;margin:0}.example-dropdown-11 button.action.split{border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-11 button+.action.toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-11 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle:hover:before{color:red}.example-dropdown-11 .action.toggle:active:before{color:inherit}.example-dropdown-11 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle.active:hover:before{color:red}.example-dropdown-11 .action.toggle.active:active:before{color:inherit}.example-dropdown-11 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-11 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-11 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-11 ul.dropdown:before,.example-dropdown-11 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-11 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-11 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-11 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-11 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-11.active{overflow:visible}.example-dropdown-11.active ul.dropdown{display:block}.example-dropdown-12{display:inline-block;position:relative}.example-dropdown-12:before,.example-dropdown-12:after{content:"";display:table}.example-dropdown-12:after{clear:both}.example-dropdown-12 .action.split{float:left;margin:0}.example-dropdown-12 .action.toggle{float:right;margin:0}.example-dropdown-12 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-12 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-12 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle:hover:after{color:inherit}.example-dropdown-12 .action.toggle:active:after{color:inherit}.example-dropdown-12 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle.active:hover:after{color:inherit}.example-dropdown-12 .action.toggle.active:active:after{color:inherit}.example-dropdown-12 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-12 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-12 ul.dropdown li:first-child{border:0}.example-dropdown-12 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-12.active{overflow:visible}.example-dropdown-12.active ul.dropdown{display:block}.example-form-1 .example-form-1-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-1 .example-form-1-fieldset>*{letter-spacing:normal}.example-form-1 .example-form-1-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-1 .example-form-1-fieldset:after{content:attr(data-hasrequired);display:block;font-size:1.2rem;color:#e02b27;margin:10px 0 0;letter-spacing:normal;word-spacing:normal}.example-form-1 .example-form-1-fieldset>.field{margin:0 0 20px}.example-form-1 .example-form-1-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-1 .example-form-1-fieldset>.field:last-child{margin-bottom:0}.example-form-1 .example-form-1-fieldset>.field>.label{font-weight:700}.example-form-1 .example-form-1-fieldset>.field>.label+br{display:none}.example-form-1 .example-form-1-fieldset>.field .choice input{vertical-align:top}.example-form-1 .example-form-1-fieldset>.field .fields.group:before,.example-form-1 .example-form-1-fieldset>.field .fields.group:after{content:"";display:table}.example-form-1 .example-form-1-fieldset>.field .fields.group:after{clear:both}.example-form-1 .example-form-1-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-1 .example-form-1-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-1 .example-form-1-fieldset>.field .addon textarea,.example-form-1 .example-form-1-fieldset>.field .addon select,.example-form-1 .example-form-1-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;box-shadow:none;display:inline-block;margin:0;width:auto}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore,.example-form-1 .example-form-1-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:disabled,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-1 .example-form-1-fieldset>.field .additional{margin-top:10px}.example-form-1 .example-form-1-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-1 .example-form-1-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-1 .example-form-1-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-form-2 .example-form-2-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-2 .example-form-2-fieldset>*{letter-spacing:normal}.example-form-2 .example-form-2-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-2 .example-form-2-fieldset>.field{margin:0 0 20px;box-sizing:border-box;display:inline-block;padding:0 12px 0 0;width:50%;vertical-align:top}.example-form-2 .example-form-2-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-2 .example-form-2-fieldset>.field:last-child{margin-bottom:0}.example-form-2 .example-form-2-fieldset>.field+.fieldset{clear:both}.example-form-2 .example-form-2-fieldset>.field>.label{font-weight:700}.example-form-2 .example-form-2-fieldset>.field>.label+br{display:none}.example-form-2 .example-form-2-fieldset>.field .choice input{vertical-align:top}.example-form-2 .example-form-2-fieldset>.field .fields.group:before,.example-form-2 .example-form-2-fieldset>.field .fields.group:after{content:"";display:table}.example-form-2 .example-form-2-fieldset>.field .fields.group:after{clear:both}.example-form-2 .example-form-2-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-2 .example-form-2-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-2 .example-form-2-fieldset>.field .addon textarea,.example-form-2 .example-form-2-fieldset>.field .addon select,.example-form-2 .example-form-2-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;box-shadow:none;display:inline-block;margin:0;width:auto}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore,.example-form-2 .example-form-2-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:disabled,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-2 .example-form-2-fieldset>.field .additional{margin-top:10px}.example-form-2 .example-form-2-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-2 .example-form-2-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-2 .example-form-2-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}input[type="text"],input[type="password"],input[type="url"],input[type="tel"],input[type="search"],input[type="number"],input[type="datetime"],input[type="email"]{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}input[type="text"]:disabled,input[type="password"]:disabled,input[type="url"]:disabled,input[type="tel"]:disabled,input[type="search"]:disabled,input[type="number"]:disabled,input[type="datetime"]:disabled,input[type="email"]:disabled{opacity:.5}input[type="text"]::-moz-placeholder,input[type="password"]::-moz-placeholder,input[type="url"]::-moz-placeholder,input[type="tel"]::-moz-placeholder,input[type="search"]::-moz-placeholder,input[type="number"]::-moz-placeholder,input[type="datetime"]::-moz-placeholder,input[type="email"]::-moz-placeholder{color:#c2c2c2}input[type="text"]::-webkit-input-placeholder,input[type="password"]::-webkit-input-placeholder,input[type="url"]::-webkit-input-placeholder,input[type="tel"]::-webkit-input-placeholder,input[type="search"]::-webkit-input-placeholder,input[type="number"]::-webkit-input-placeholder,input[type="datetime"]::-webkit-input-placeholder,input[type="email"]::-webkit-input-placeholder{color:#c2c2c2}input[type="text"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder,input[type="url"]:-ms-input-placeholder,input[type="tel"]:-ms-input-placeholder,input[type="search"]:-ms-input-placeholder,input[type="number"]:-ms-input-placeholder,input[type="datetime"]:-ms-input-placeholder,input[type="email"]:-ms-input-placeholder{color:#c2c2c2}select{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:5px 10px 4px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}select:disabled{opacity:.5}select[multiple="multiple"]{height:auto;margin-bottom:20px}textarea{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:auto;width:100%;padding:10px;margin:0;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;resize:vertical}textarea:disabled{opacity:.5}textarea::-moz-placeholder{color:#c2c2c2}textarea::-webkit-input-placeholder{color:#c2c2c2}textarea:-ms-input-placeholder{color:#c2c2c2}input[type="checkbox"]{margin:2px 5px 0 0}input[type="checkbox"]:disabled{opacity:.5}input[type="radio"]{margin:2px 5px 0 0}input[type="radio"]:disabled{opacity:.5}input.text-example-1,select.select-example-1,textarea.textarea-example-1{background:#fdf0d5;border-color:#fc0;color:#b30000}input.text-example-1:focus,select.select-example-1:focus,textarea.textarea-example-1:focus{border-color:#cff;color:#060}input.text-example-1:disabled,select.select-example-1:disabled,textarea.textarea-example-1:disabled{color:#fcc}input.text-example-1::-moz-placeholder,textarea.textarea-example-1::-moz-placeholder{color:#ccc}input.text-example-1::-webkit-input-placeholder,textarea.textarea-example-1::-webkit-input-placeholder{color:#ccc}input.text-example-1:-ms-input-placeholder,textarea.textarea-example-1:-ms-input-placeholder{color:#ccc}.number-example{-moz-appearance:textfield}.number-example::-webkit-inner-spin-button,.number-example::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.search-example{-webkit-appearance:none}.search-example::-webkit-search-cancel-button,.search-example::-webkit-search-decoration,.search-example::-webkit-search-results-button,.search-example::-webkit-search-results-decoration{-webkit-appearance:none}input,textarea,select{font-size:1.2rem;color:#e02b27}.example-icon-1{display:inline-block}.example-icon-1:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-2{display:inline-block}.example-icon-2:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -26px 0}.example-icon-3{display:inline-block}.example-icon-3>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-3:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -156px -52px}.example-icon-4{display:inline-block;text-decoration:none}.example-icon-4:before{font-family:'icons-blank-theme';content:'\e606';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-5{display:inline-block;text-decoration:none}.example-icon-5:after{font-family:'icons-blank-theme';content:'\e605';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-6{display:inline-block;text-decoration:none}.example-icon-6>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-6:before{font-family:'icons-blank-theme';content:'\e61b';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-7{display:inline-block}.example-icon-7:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8{display:inline-block}.example-icon-8:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8:before{background-position:-182px 0}.example-icon-9{display:inline-block}.example-icon-9:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-9:after{background-position:-52px -26px}.example-icon-10{display:inline-block}.example-icon-10:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-10:before{background-position:-104px 0}.example-icon-11{display:inline-block}.example-icon-11:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-11:before{width:30px;height:30px}.example-icon-11:after{width:30px;height:30px}.example-icon-11:before{background-color:#f1f1f1}.example-icon-12{display:inline-block;text-decoration:none}.example-icon-12:before{font-family:'icons-blank-theme';content:'\e612';font-size:28px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13{display:inline-block;text-decoration:none}.example-icon-13:before{font-family:'icons-blank-theme';content:'\e612';font-size:inherit;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13:before{font-size:26px;line-height:inherit}.example-icon-14{display:inline-block;text-decoration:none}.example-icon-14:before{font-family:'icons-blank-theme';content:'\e61d';font-size:26px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-14>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.icons-image-list{list-style:none;padding:0}.icons-image-list li{float:left;width:33%}.icons-image-list li>span{display:inline-block}.icons-image-list li>span:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.icons-image-list li .icon-search:before{background-position:0 0}.icons-image-list li .icon-cart:before{background-position:-26px 0}.icons-image-list li .icon-arrow-down:before{background-position:-52px 0}.icons-image-list li .icon-arrow-up:before{background-position:-78px 0}.icons-image-list li .icon-grid:before{background-position:-104px 0}.icons-image-list li .icon-list:before{background-position:-130px 0}.icons-image-list li .icon-remove:before{background-position:-156px 0}.icons-image-list li .icon-star:before{background-position:-182px 0}.icons-image-list li .icon-pointer-down:before{background-position:-208px 0}.icons-image-list li .icon-pointer-up:before{background-position:-234px 0}.icons-image-list li .icon-pointer-left:before{background-position:-260px 0}.icons-image-list li .icon-pointer-right:before{background-position:-286px 0}.icons-image-list li .icon-compare-empty:before{background-position:0 -26px}.icons-image-list li .icon-compare-full:before{background-position:-26px -26px}.icons-image-list li .icon-wishlist-empty:before{background-position:-52px -26px}.icons-image-list li .icon-wishlist-full:before{background-position:-78px -26px}.icons-image-list li .icon-update:before{background-position:-104px -26px}.icons-image-list li .icon-collapse:before{background-position:-130px -26px}.icons-image-list li .icon-expand:before{background-position:-156px -26px}.icons-image-list li .icon-menu:before{background-position:-182px -26px}.icons-image-list li .icon-prev:before{background-position:-208px -26px}.icons-image-list li .icon-next:before{background-position:-234px -26px}.icons-image-list li .icon-settings:before{background-position:-260px -26px}.icons-image-list li .icon-info:before{background-position:-286px -26px}.icons-image-list li .icon-checkmark:before{background-position:0 -52px}.icons-image-list li .icon-calendar:before{background-position:-26px -52px}.icons-image-list li .icon-comment:before{background-position:-52px -52px}.icons-image-list li .icon-comment-reflected:before{background-position:-78px -52px}.icons-image-list li .icon-envelope:before{background-position:-104px -52px}.icons-image-list li .icon-warning:before{background-position:-130px -52px}.icons-image-list li .icon-trash:before{background-position:-156px -52px}.icons-image-list li .icon-flag:before{background-position:-182px -52px}.icons-image-list li .icon-location:before{background-position:-208px -52px}.icons-image-list li .icon-up:before{background-position:-234px -52px}.icons-image-list li .icon-down:before{background-position:-260px -52px}.icons-font-list{list-style:none;padding:0}.icons-font-list li{float:left;width:25%;margin-bottom:35px;text-align:center}.icons-font-list li>span{display:inline-block;text-decoration:none}.icons-font-list li>span:before{font-family:'icons-blank-theme';font-size:34px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.icons-font-list li>span:before{content:attr(data-icon);margin:0 auto;display:block}.loader{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.5);z-index:9999}.loader:before{border-radius:5px;background:transparent url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%;box-sizing:border-box;content:'';position:absolute;top:0;right:0;left:0;bottom:0;margin:auto;width:160px;height:160px}.loading{position:relative}.loading:before{content:'';position:absolute;left:0;top:0;right:0;bottom:0;background:rgba(255,255,255,.5) url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%}.example-message-info{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-info a{color:#1979c3}.example-message-info a:hover{color:#006bb4}.example-message-info a:active{color:#006bb4}.example-message-warning{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-warning a{color:#1979c3}.example-message-warning a:hover{color:#006bb4}.example-message-warning a:active{color:#006bb4}.example-message-error{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27}.example-message-error a{color:#1979c3}.example-message-error a:hover{color:#006bb4}.example-message-error a:active{color:#006bb4}.example-message-success{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400}.example-message-success a{color:#1979c3}.example-message-success a:hover{color:#006bb4}.example-message-success a:active{color:#006bb4}.example-message-notice{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-notice a{color:#1979c3}.example-message-notice a:hover{color:#006bb4}.example-message-notice a:active{color:#006bb4}.example-message-1{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400;position:relative;padding-left:40px}.example-message-1 a{color:#1979c3}.example-message-1 a:hover{color:#006bb4}.example-message-1 a:active{color:#006bb4}.example-message-1>:first-child:before{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#c07600;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:40px}.example-message-2{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27;position:relative;padding-right:40px}.example-message-2 a{color:#1979c3}.example-message-2 a:hover{color:#006bb4}.example-message-2 a:active{color:#006bb4}.example-message-2:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#b30000}.example-message-2>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-2>:first-child:after{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-2:before{right:0}.example-message-2>:first-child:before{border:5px solid transparent;height:0;width:0;border-right-color:#b30000;right:30px}.example-message-2>:first-child:after{right:0}.example-message-3{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400;position:relative;padding-left:40px}.example-message-3 a{color:#1979c3}.example-message-3 a:hover{color:#006bb4}.example-message-3 a:active{color:#006bb4}.example-message-3:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#006400}.example-message-3>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-3>:first-child:after{font-family:'icons-blank-theme';content:'\e610';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-3:before{left:0}.example-message-3>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#006400;left:30px}.example-message-3>:first-child:after{left:0}.example-message-4{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fc0;border-color:#ffa500;color:#000;position:relative;padding-left:40px;border-width:4px;border-radius:10px}.example-message-4 a{color:#00f}.example-message-4 a:hover{color:#009}.example-message-4 a:active{color:#006}.example-message-4:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#green}.example-message-4>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-4>:first-child:after{font-family:'icons-blank-theme';content:'\e606';font-size:28px;line-height:28px;color:#000;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:15px;left:0;text-align:center;width:30px}.example-message-4:before{left:0}.example-message-4>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#green;left:30px}.example-message-4>:first-child:after{left:0}header.header{background-color:rgba(255,0,0,.2)}.column.main{background-color:rgba(255,255,0,.2)}.column.left{background-color:rgba(0,255,255,.2)}.column.right{background-color:rgba(0,0,255,.2)}footer.footer{background-color:rgba(0,0,0,.2)}.columns{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.columns:after{content:" ";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.columns>.column{padding-bottom:40px}@media (min-width: 600px){.page-layout-1column .column.main{ width:100%;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-3columns .column.main{width:66.66666667%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-left .column.main{width:83.33333333%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.main{width:83.33333333%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-left .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-right .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.right{width:16.66666667%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.page-layout-2columns-left .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}}.layout-example-3 .column.main{width:60%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3 .column.left{width:20%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.layout-example-3-1 .column.main{width:60%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3-1 .column.left{width:20%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3-1 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.pages>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.pages .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.pages .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.pages a.page:visited{color:#1979c3}.pages a.page:hover{color:#006bb4;text-decoration:none}.pages a.page:active{color:#ff5501}.pages strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.pages .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.pages .action:visited{color:#7d7d7d}.pages .action:hover{color:#7d7d7d;text-decoration:none}.pages .action:active{color:#7d7d7d}.pages .action.next{display:inline-block;text-decoration:none}.pages .action.next:visited:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.next:hover:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.previous{display:inline-block;text-decoration:none}.pages .action.previous:visited:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.pages .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.previous:hover:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.example-pages-1>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-1>.label:after{content:':'}.example-pages-1 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-1 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 3px;display:inline-block}.example-pages-1 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 a.page{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #b3b3b3;color:#333;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-1 a.page:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#1979c3}.example-pages-1 a.page:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);border:1px solid #999;color:#333;text-decoration:none}.example-pages-1 a.page:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#ff5501}.example-pages-1 strong.page{background:#1979c3;border:1px solid #135d96;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#f7b32e;display:inline-block;font-weight:700;padding:0 4px}.example-pages-1 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-1 .action:visited{color:#7d7d7d}.example-pages-1 .action:hover{color:#ff5501;text-decoration:none}.example-pages-1 .action:active{color:#7d7d7d}.example-pages-1 .action.next{display:inline-block;text-decoration:none}.example-pages-1 .action.next:visited:before{color:#7d7d7d}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.next:hover:before{color:#ff5501}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.previous{display:inline-block;text-decoration:none}.example-pages-1 .action.previous:visited:before{color:#7d7d7d}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-1 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.previous:hover:before{color:#ff5501}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-2>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-2>.label:after{content:':'}.example-pages-2 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-2 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-2 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-2 a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-2 a.page:visited{color:#1979c3}.example-pages-2 a.page:hover{color:#006bb4;text-decoration:none}.example-pages-2 a.page:active{color:#ff5501}.example-pages-2 strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.example-pages-2 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-2 .action:visited{color:#7d7d7d}.example-pages-2 .action:hover{color:#7d7d7d;text-decoration:none}.example-pages-2 .action:active{color:#7d7d7d}.example-pages-3>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-3 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-3 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 a.page{background:#1979c3;color:#fff;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-3 a.page:visited{background:#1979c3;color:#fff}.example-pages-3 a.page:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 a.page:active{background:#ff5501;color:#fff}.example-pages-3 strong.page{background:#1979c3;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#fff;display:inline-block;font-weight:700;padding:0 4px}.example-pages-3 .action{background:#1979c3;border:1px solid #d1d1d1;color:#fff;display:inline-block;padding:0;text-decoration:none}.example-pages-3 .action:visited{background:#1979c3;color:#7d7d7d}.example-pages-3 .action:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 .action:active{background:#ff5501;color:#fff}.example-pages-3 .action.next{display:inline-block;text-decoration:none}.example-pages-3 .action.next:visited:before{color:#7d7d7d}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.next:hover:before{color:#fff}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.previous{display:inline-block;text-decoration:none}.example-pages-3 .action.previous:visited:before{color:#7d7d7d}.example-pages-3 .action.previous:active:before{color:#fff}.example-pages-3 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.previous:hover:before{color:#fff}.example-pages-3 .action.previous:active:before{color:#fff}.window.popup.popup-example{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:focus,.window.popup.popup-example .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example .popup-actions .action.close.disabled,.window.popup.popup-example .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example.active{opacity:1}.window.popup.popup-example-1{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-1 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-1 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-1 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-1 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-1 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-1 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:focus,.window.popup.popup-example-1 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close.disabled,.window.popup.popup-example-1 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-1 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-1.active{opacity:1}.window.overlay{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#000;z-index:1000;opacity:0}.window.overlay.active{opacity:.5;filter:alpha(opacity=50)}.window.popup.popup-example-2{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;overflow-y:auto;max-height:200px;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-2 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-2 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-2 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-2 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-2 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-2 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:focus,.window.popup.popup-example-2 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close.disabled,.window.popup.popup-example-2 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-2 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-2.active{opacity:1}.window.popup.popup-example-3{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-3 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-3 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-3 .popup-content{overflow-y:auto;max-height:200px}.window.popup.popup-example-3 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-3 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-3 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-3 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:focus,.window.popup.popup-example-3 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close.disabled,.window.popup.popup-example-3 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-3 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-3.active{opacity:1}.window.popup.popup-example-4{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-4 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-4 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-4 .popup-content{margin:0 0 20px}.window.popup.popup-example-4 .popup-footer{margin:0 20px}.window.popup.popup-example-4 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-4 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-4 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-4 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:focus,.window.popup.popup-example-4 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close.disabled,.window.popup.popup-example-4 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-4 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-4.active{opacity:1}.window.popup.popup-example-5{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-5 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-5 .popup-header .title{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.window.popup.popup-example-5 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-5 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-5 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-5 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:focus,.window.popup.popup-example-5 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close.disabled,.window.popup.popup-example-5 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-5 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-5.active{opacity:1}.window.popup.popup-example-6{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-6 .popup-footer .actions.toolbar{text-align:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar:before,.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{content:"";display:table}.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{clear:both}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{float:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary a.action,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary .action{margin:0 5px 0 0}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{margin-top:6px}.window.popup.popup-example-6 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-6 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-6 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-6 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-6 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-6 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:focus,.window.popup.popup-example-6 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close.disabled,.window.popup.popup-example-6 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-6 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-6.active{opacity:1}.window.popup.popup-example-7{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-7 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-7 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-7 .popup-actions .action.close{position:absolute;top:10px;right:10px}.window.popup.popup-example-7.active{opacity:1}.window.popup.popup-example-8{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-8 .popup-header{margin:0 0 25px;padding-right:30px}.window.popup.popup-example-8 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-8 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-8 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e613';font-size:30px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:0}.window.popup.popup-example-8 .popup-actions .action.close:hover:before{color:#090}.window.popup.popup-example-8 .popup-actions .action.close:active:before{color:#00f}.window.popup.popup-example-8 .popup-actions .action.close:focus,.window.popup.popup-example-8 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close.disabled,.window.popup.popup-example-8 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-8 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-8.active{opacity:1}.window.popup.popup-example-9{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-9 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-9 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-9 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-9 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-9 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-9 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:focus,.window.popup.popup-example-9 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close.disabled,.window.popup.popup-example-9 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-9 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-9.active{opacity:1}.window.overlay.example-overlay-1.active{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#0f5293;z-index:1000;opacity:0}.window.overlay.example-overlay-1.active.active{opacity:.8;filter:alpha(opacity=80)}.example-ratings-1{overflow:hidden}.example-ratings-1:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-1 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 input[type="radio"]:focus+label:before,.example-ratings-1 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-1 label{position:absolute;display:block;cursor:pointer}.example-ratings-1 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-1 label:hover:before{opacity:1}.example-ratings-1 label:hover~label:before{opacity:0}.example-ratings-1 .rating-5{z-index:2}.example-ratings-1 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-4{z-index:3}.example-ratings-1 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-3{z-index:4}.example-ratings-1 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-1 .rating-2{z-index:5}.example-ratings-1 .rating-2:before{content:'\e605' '\e605'}.example-ratings-1 .rating-1{z-index:6}.example-ratings-1 .rating-1:before{content:'\e605'}.example-ratings-2{overflow:hidden}.example-ratings-2:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-2 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 input[type="radio"]:focus+label:before,.example-ratings-2 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-2 label{position:absolute;display:block;cursor:pointer}.example-ratings-2 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-2 label:hover:before{opacity:1}.example-ratings-2 label:hover~label:before{opacity:0}.example-ratings-2 .rating-8{z-index:2}.example-ratings-2 .rating-8:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-7{z-index:3}.example-ratings-2 .rating-7:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-6{z-index:4}.example-ratings-2 .rating-6:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-5{z-index:5}.example-ratings-2 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-4{z-index:6}.example-ratings-2 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-3{z-index:7}.example-ratings-2 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-2 .rating-2{z-index:8}.example-ratings-2 .rating-2:before{content:'\e605' '\e605'}.example-ratings-2 .rating-1{z-index:9}.example-ratings-2 .rating-1:before{content:'\e605'}.example-ratings-3{overflow:hidden}.example-ratings-3:before{color:#aff5e3;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-3 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 input[type="radio"]:focus+label:before,.example-ratings-3 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-3 label{position:absolute;display:block;cursor:pointer}.example-ratings-3 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 label:before{color:#0a6767;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-3 label:hover:before{opacity:1}.example-ratings-3 label:hover~label:before{opacity:0}.example-ratings-3 .rating-5{z-index:2}.example-ratings-3 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-4{z-index:3}.example-ratings-3 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-3{z-index:4}.example-ratings-3 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-3 .rating-2{z-index:5}.example-ratings-3 .rating-2:before{content:'\e605' '\e605'}.example-ratings-3 .rating-1{z-index:6}.example-ratings-3 .rating-1:before{content:'\e605'}.example-ratings-4{overflow:hidden}.example-ratings-4:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e600' '\e600' '\e600' '\e600' '\e600';position:absolute;z-index:1;display:block}.example-ratings-4 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 input[type="radio"]:focus+label:before,.example-ratings-4 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-4 label{position:absolute;display:block;cursor:pointer}.example-ratings-4 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-4 label:hover:before{opacity:1}.example-ratings-4 label:hover~label:before{opacity:0}.example-ratings-4 .rating-5{z-index:2}.example-ratings-4 .rating-5:before{content:'\e600' '\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-4{z-index:3}.example-ratings-4 .rating-4:before{content:'\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-3{z-index:4}.example-ratings-4 .rating-3:before{content:'\e600' '\e600' '\e600'}.example-ratings-4 .rating-2{z-index:5}.example-ratings-4 .rating-2:before{content:'\e600' '\e600'}.example-ratings-4 .rating-1{z-index:6}.example-ratings-4 .rating-1:before{content:'\e600'}.exapmle-ratings-5 .control.rating.vote{overflow:hidden}.exapmle-ratings-5 .control.rating.vote:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.exapmle-ratings-5 .control.rating.vote input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote input[type="radio"]:focus+label:before,.exapmle-ratings-5 .control.rating.vote input[type="radio"]:checked+label:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label{position:absolute;display:block;cursor:pointer}.exapmle-ratings-5 .control.rating.vote label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.exapmle-ratings-5 .control.rating.vote label:hover:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label:hover~label:before{opacity:0}.exapmle-ratings-5 .control.rating.vote .rating-5{z-index:2}.exapmle-ratings-5 .control.rating.vote .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-4{z-index:3}.exapmle-ratings-5 .control.rating.vote .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-3{z-index:4}.exapmle-ratings-5 .control.rating.vote .rating-3:before{content:'\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-2{z-index:5}.exapmle-ratings-5 .control.rating.vote .rating-2:before{content:'\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-1{z-index:6}.exapmle-ratings-5 .control.rating.vote .rating-1:before{content:'\e605'}.example-rating-summary-1{white-space:nowrap;overflow:hidden}.example-rating-summary-1 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-1 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-1 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-2{white-space:nowrap;overflow:hidden}.example-rating-summary-2 .rating-result{width:154px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-2 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-2 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-3{white-space:nowrap;overflow:hidden}.example-rating-summary-3 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-3 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#aff5e3;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-3 .rating-result>span:before{position:relative;z-index:2;color:#0a6767;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-4{white-space:nowrap;overflow:hidden}.example-rating-summary-4 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-4 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-4 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5{white-space:nowrap;overflow:hidden}.example-rating-summary-5 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-5 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-5 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-6 .rating-summary{white-space:nowrap;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-6 .rating-summary .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span{display:block;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7{white-space:nowrap;overflow:hidden}.example-rating-summary-7 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-7 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-7 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-responsive-block{padding:10px}.example-sections-1{position:relative;z-index:1}.example-sections-1:before,.example-sections-1:after{content:"";display:table}.example-sections-1:after{clear:both}.example-sections-1>.item.title{float:left;width:auto}.example-sections-1>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-1>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-1>.item.content:before,.example-sections-1>.item.content:after{content:"";display:table}.example-sections-1>.item.content:after{clear:both}.example-sections-1>.item.content.active{display:block}.example-sections-1>.item.title{margin:0 5px 0 0}.example-sections-1>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-1>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-1>.item.title:not(.disabled)>.switch:focus,.example-sections-1>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-1>.item.title:not(.disabled)>.switch:active,.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-1>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}.example-sections-2{position:relative;z-index:1}.example-sections-2:before,.example-sections-2:after{content:"";display:table}.example-sections-2:after{clear:both}.example-sections-2>.item.title{float:left;width:auto}.example-sections-2>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-2>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-2>.item.content:before,.example-sections-2>.item.content:after{content:"";display:table}.example-sections-2>.item.content:after{clear:both}.example-sections-2>.item.content.active{display:block}.example-sections-2>.item.title{margin:0 5px 0 0}.example-sections-2>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-2>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-2>.item.title:not(.disabled)>.switch:focus,.example-sections-2>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-2>.item.title:not(.disabled)>.switch:active,.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-2>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:0;border-top:1px solid #d1d1d1}.example-sections-3{margin:0;padding:0}.example-sections-3>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-3>.item.title>.switch{display:block}.example-sections-3>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-3>.item.content:before,.example-sections-3>.item.content:after{content:"";display:table}.example-sections-3>.item.content:after{clear:both}.example-sections-3>.item.content.active{display:block}.example-sections-3>.item.title{margin:0 0 5px}.example-sections-3>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-3>.item.title:not(.disabled)>.switch:focus,.example-sections-3>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-3>.item.title:not(.disabled)>.switch:active,.example-sections-3>.item.title.active>.switch,.example-sections-3>.item.title.active>.switch:focus,.example-sections-3>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-3>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}@media only screen and (max-width: 99999px){.example-sections-4{ position:relative;z-index:1}.example-sections-4:before,.example-sections-4:after{content:"";display:table}.example-sections-4:after{clear:both}.example-sections-4>.item.title{float:left;width:auto}.example-sections-4>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-4>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 5px 0 0}.example-sections-4>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-4>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}}@media only screen and (max-width: 768px){.example-sections-4{ margin:0;padding:0}.example-sections-4>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-4>.item.title>.switch{display:block}.example-sections-4>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 0 5px}.example-sections-4>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-4>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}}.example-sections-5{position:relative;z-index:1}.example-sections-5:before,.example-sections-5:after{content:"";display:table}.example-sections-5:after{clear:both}.example-sections-5>.item.title{float:left;width:auto}.example-sections-5>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-5>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-5>.item.content:before,.example-sections-5>.item.content:after{content:"";display:table}.example-sections-5>.item.content:after{clear:both}.example-sections-5>.item.content.active{display:block}.example-sections-6{margin:0;padding:0}.example-sections-6>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-6>.item.title>.switch{display:block}.example-sections-6>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-6>.item.content:before,.example-sections-6>.item.content:after{content:"";display:table}.example-sections-6>.item.content:after{clear:both}.example-sections-6>.item.content.active{display:block}.example-table-1{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-1 th{text-align:left}.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{vertical-align:top}.example-table-1>thead>tr>th,.example-table-1>thead>tr>td{vertical-align:bottom}.example-table-1>thead>tr>th,.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>thead>tr>td,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{padding:8px 10px}.example-table-2>thead>tr>th,.example-table-2>tbody>tr>th,.example-table-2>tfoot>tr>th{color:#111;font-weight:700}.example-table-3{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-3 th{text-align:left}.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{vertical-align:top}.example-table-3>thead>tr>th,.example-table-3>thead>tr>td{vertical-align:bottom}.example-table-3>thead>tr>th,.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>thead>tr>td,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{padding:8px 10px}.example-table-3>caption{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-table-4{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-4 th{text-align:left}.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{vertical-align:top}.example-table-4>thead>tr>th,.example-table-4>thead>tr>td{vertical-align:bottom}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:8px 10px}.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:15px 25px 5px 0}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th{padding:15px 25px 10px 0}.example-table-5{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;background:#fff}.example-table-5 th{text-align:left}.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{vertical-align:top}.example-table-5>thead>tr>th,.example-table-5>thead>tr>td{vertical-align:bottom}.example-table-5>thead>tr>th,.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>thead>tr>td,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{padding:8px 10px}.example-table-5>thead{background:#ccf}.example-table-5>tfoot{background:#cff}.example-table-5>tbody>tr>td{background:#fcc}.example-table-5>tbody>tr>th{background:#ffc}.example-table-6{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-6 th{text-align:left}.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{vertical-align:top}.example-table-6>thead>tr>th,.example-table-6>thead>tr>td{vertical-align:bottom}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{padding:8px 10px}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-7{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-7 th{text-align:left}.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{vertical-align:top}.example-table-7>thead>tr>th,.example-table-7>thead>tr>td{vertical-align:bottom}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{padding:8px 10px}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{border-top:1px solid #d1d1d1}.example-table-7>caption+thead>tr:first-child>th,.example-table-7>colgroup+thead>tr:first-child>th,.example-table-7>thead:first-child>tr:first-child>th,.example-table-7>caption+thead>tr:first-child>td,.example-table-7>colgroup+thead>tr:first-child>td,.example-table-7>thead:first-child>tr:first-child>td{border-top:0}.example-table-7>tbody+tbody{border-top:1px solid #d1d1d1}.example-table-8{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-8 th{text-align:left}.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{vertical-align:top}.example-table-8>thead>tr>th,.example-table-8>thead>tr>td{vertical-align:bottom}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{padding:8px 10px}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{border-left:1px solid #d1d1d1}.example-table-8>thead>tr>th:first-child,.example-table-8>tbody>tr>th:first-child,.example-table-8>tfoot>tr>th:first-child,.example-table-8>thead>tr>td:first-child,.example-table-8>tbody>tr>td:first-child,.example-table-8>tfoot>tr>td:first-child{border-left:0}.example-table-9{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-9 th{text-align:left}.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{vertical-align:top}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{vertical-align:bottom}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{padding:8px 10px}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{border:0}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{border-bottom:1px solid #d1d1d1}.example-table-10{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-10 th{text-align:left}.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{vertical-align:top}.example-table-10>thead>tr>th,.example-table-10>thead>tr>td{vertical-align:bottom}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{padding:8px 10px}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{border:0}.example-table-11{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-11 th{text-align:left}.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{vertical-align:top}.example-table-11>thead>tr>th,.example-table-11>thead>tr>td{vertical-align:bottom}.example-table-11>thead>tr>th,.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>thead>tr>td,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{padding:8px 10px}.example-table-11>tbody>tr:nth-child(even)>td,.example-table-11>tbody>tr:nth-child(even)>th{background:#ffc;color:#000}.example-table-12{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-12 th{text-align:left}.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{vertical-align:top}.example-table-12>thead>tr>th,.example-table-12>thead>tr>td{vertical-align:bottom}.example-table-12>thead>tr>th,.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>thead>tr>td,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{padding:8px 10px}.example-table-12>tbody>tr:nth-child(even):hover>td,.example-table-12>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-12>tbody>tr:nth-child(odd):hover>td,.example-table-12>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}.example-table-13{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-13 th{text-align:left}.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{vertical-align:top}.example-table-13>thead>tr>th,.example-table-13>thead>tr>td{vertical-align:bottom}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{padding:8px 10px}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-13>tbody>tr:nth-child(odd)>td,.example-table-13>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-13>tbody>tr:nth-child(even):hover>td,.example-table-13>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-13>tbody>tr:nth-child(odd):hover>td,.example-table-13>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-14{ width:100%;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}}.example-table-15{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-15 th{text-align:left}.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{vertical-align:top}.example-table-15>thead>tr>th,.example-table-15>thead>tr>td{vertical-align:bottom}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{padding:8px 10px}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-15{ border:0;display:block;background:#cff}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#cff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#cff}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#cff}.example-table-15>thead>tr>th{display:none}.example-table-15>tbody{display:block}.example-table-15>tbody>tr{display:block}.example-table-15>tbody>tr td,.example-table-15>tbody>tr th{border-bottom:0;display:block;padding:5px 0}.example-table-15>tbody>tr td:before,.example-table-15>tbody>tr th:before{content:attr(data-th) ":";display:inline-block;padding-right:10px;color:#111;font-weight:700}.example-table-15>tbody>tr td{background:#cff}.example-table-15>tbody>tr>th{background-color:#ffc!important}}.example-tooltip-bottom{position:relative}.example-tooltip-bottom .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;top:100%;left:0;margin-top:5px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-bottom .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-bottom .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{bottom:100%}.example-tooltip-bottom .tooltip-content:after{border-bottom-color:#fff;margin-left:-5px;left:15px}.example-tooltip-bottom .tooltip-content:before{border-bottom-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-bottom .tooltip-toggle{cursor:help}.example-tooltip-bottom .tooltip-toggle:hover+.tooltip-content,.example-tooltip-bottom .tooltip-toggle:focus+.tooltip-content,.example-tooltip-bottom:hover .tooltip-content{display:block}.example-tooltip-left{position:relative}.example-tooltip-left .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;right:100%;top:0;margin-right:5px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-left .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-left .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{left:100%}.example-tooltip-left .tooltip-content:after{border-left-color:#fff;margin-top:-5px;top:15px}.example-tooltip-left .tooltip-content:before{border-left-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-left .tooltip-toggle{cursor:help}.example-tooltip-left .tooltip-toggle:hover+.tooltip-content,.example-tooltip-left .tooltip-toggle:focus+.tooltip-content,.example-tooltip-left:hover .tooltip-content{display:block}.example-tooltip-right{position:relative}.example-tooltip-right .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;left:100%;top:0;margin-left:5px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-right .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-right .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{right:100%}.example-tooltip-right .tooltip-content:after{border-right-color:#fff;margin-top:-5px;top:15px}.example-tooltip-right .tooltip-content:before{border-right-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-right .tooltip-toggle{cursor:help}.example-tooltip-right .tooltip-toggle:hover+.tooltip-content,.example-tooltip-right .tooltip-toggle:focus+.tooltip-content,.example-tooltip-right:hover .tooltip-content{display:block}.example-tooltip-top{position:relative}.example-tooltip-top .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;bottom:100%;left:0;margin-bottom:5px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-top .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-top .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{top:100%}.example-tooltip-top .tooltip-content:after{border-top-color:#fff;margin-left:-5px;left:15px}.example-tooltip-top .tooltip-content:before{border-top-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-top .tooltip-toggle{cursor:help}.example-tooltip-top .tooltip-toggle:hover+.tooltip-content,.example-tooltip-top .tooltip-toggle:focus+.tooltip-content,.example-tooltip-top:hover .tooltip-content{display:block}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{font-size:71.42857143%;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-break:break-all;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-line-height{line-height:3rem}.example-word-wrap{word-break:break-all;word-break:break-word;word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;background:#ccc;width:120px}.example-text-overflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:#ccc;width:120px}.example-text-hide{background-color:transparent;border:0;font:0/0 a;color:transparent;text-shadow:none}.example-hyphens{word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.example-hyphens-none{word-wrap:break-word;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.example-typography{color:#fc0;font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-weight:500;font-style:italic;line-height:1.2}.example-list-reset-styles{margin:0;padding:0;list-style:none none}.example-list-inline{margin:0;padding:0;list-style:none none}.example-list-inline>li{display:inline-block;vertical-align:top}.example-link-default{color:#1979c3;text-decoration:none}.example-link-default:visited{color:#1979c3;text-decoration:none}.example-link-default:hover{color:#006bb4;text-decoration:underline}.example-link-default:active{color:#ff5501;text-decoration:underline}.example-link{color:#008000;text-decoration:none}.example-link:visited{color:#1979c3;text-decoration:none}.example-link:hover{color:#ffa500;text-decoration:none}.example-link:active{color:#ff5501;text-decoration:underline}.example-heading{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.example-heading-2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{font-size:71.42857143%;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-break:break-all;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-clearfix-container-1{border:1px solid red}.example-clearfix-container-2{border:1px solid #0f0}.example-clearfix-container-2:before,.example-clearfix-container-2:after{content:"";display:table}.example-clearfix-container-2:after{clear:both}.example-clearfix-item.left{float:left}.example-clearfix-item.right{float:right}.example-visibility-hidden{height:0;visibility:hidden}.example-visually-hidden-1{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{background:#fdf0d5;padding:5px;border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.example-css-container{padding:20px;background:#e8e8e8}.example-rotate{background:red;position:absolute;height:20px;width:40px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.example-placeholder::-webkit-input-placeholder{color:#808080;font-weight:700}.example-placeholder:-moz-placeholder{color:#808080;font-weight:700}.example-placeholder::-moz-placeholder{color:#808080;font-weight:700}.example-placeholder:-ms-input-placeholder{color:#808080;font-weight:700}.example-background-gradient-1{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #cff 0, #ccf 100%);background-image:linear-gradient(to bottom, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=0)}.example-background-gradient-2{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop( #cff 0),color-stop( #ccf 100%));background-image:linear-gradient(to right, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=1)}.example-background-gradient-3-wrapper{background:#ffc;padding:10px}.example-background-gradient-3{background-color:rgba(255,255,255,0);background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(rgba(255,255,255,0) 0),color-stop( #ccf 100%));background-image:linear-gradient(to right,rgba(255,255,255,0) 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='rgba(255, 255, 255, 0)',endColorstr='#ccccff',GradientType=1)}body{padding:15px;background-image:none}</style></head><body><nav class="bar top cf"><div class="container"><a href="index.html" class="brand">Magento UI Library</a><ul class="menu"><li><a href="#" data-toggle="dropdown-1" unselectable="on" class="dropdown-toggle">files</a><ul id="dropdown-1" hidden class="dropdown"><li><a href="actions-toolbar.html">actions-toolbar</a></li><li><a href="breadcrumbs.html">breadcrumbs</a></li><li><a href="buttons.html">buttons</a></li><li><a href="docs.html">docs</a></li><li><a href="dropdowns.html">dropdowns</a></li><li><a href="forms.html">forms</a></li><li><a href="icons.html">icons</a></li><li><a href="layout.html">layout</a></li><li><a href="lib.html">lib</a></li><li><a href="loaders.html">loaders</a></li><li><a href="messages.html">messages</a></li><li><a href="pages.html">pages</a></li><li><a href="popups.html">popups</a></li><li><a href="rating.html">rating</a></li><li><a href="resets.html">resets</a></li><li><a href="responsive.html">responsive</a></li><li><a href="sections.html">sections</a></li><li><a href="tables.html">tables</a></li><li><a href="tooltips.html">tooltips</a></li><li><a href="typography.html">typography</a></li><li><a href="utilities.html">utilities</a></li><li><a href="variables.html">variables</a></li></ul></li></ul><div class="nav"><button title="Table of Contents" data-toggle="nav-toc"><svg viewBox="0 0 512 512" height="22" width="22" class="icon"><path d="M108.9,403.1V462H50v-58.9H108.9z M108.9,285.4H50v58.9h58.9V285.4zM108.9,50H50v58.9h58.9V50z M108.9,167.7H50v58.9h58.9V167.7z M167.7,344.3H462v-58.9H167.7V344.3zM167.7,50v58.9H462V50H167.7z M167.7,462H462v-58.9H167.7V462z M167.7,226.6H462v-58.9H167.7V226.6z"></path></svg></button><input type="search" placeholder="Search" class="search"></div></div></nav><section class="container"><article id="icons" class="section"><div class="docs"><a href="#icons" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icons">Icons</h1> +</title><meta charset="utf-8"><style>*{-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;border:0}body{padding:60px 0 40px;background-color:hsl(207,10%,90%);color:hsl(207,5%,30%)}.container{max-width:1300px;margin:0 auto;padding:0 20px}.section{position:relative;margin-bottom:20px}.docs{position:relative;z-index:2;width:68%;min-height:200px;background-color:hsl(207,0%,100%);background-clip:padding-box;border:1px solid hsla(207,5%,5%,.1);border-radius:5px;box-shadow:0 0 3px hsla(207,5%,5%,.1)}.code{position:absolute;top:5px;bottom:5px;right:0;z-index:1;width:33%;padding:10px 10px 10px 20px;border-radius:0 5px 5px 0;border:1px solid hsla(207,20%,10%,.1);background-color:hsla(207,20%,95%,.9);background-clip:padding-box;opacity:.5;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.code:hover{opacity:1}.preview{background:hsl(207,0%,100%);border-top:1px solid hsl(207,30%,95%);position:relative;z-index:1}.preview-code+.preview{margin-top:0;border-top:0}.preview iframe{display:block;width:100%;height:100%;overflow:hidden}.preview-code{position:relative;z-index:2;display:block;width:100%;color:hsl(207,9%,37%);max-height:200px;padding:10px 20px;overflow-y:auto;background:hsl(207,30%,95%);border:1px solid hsl(207,30%,85%);border-left:0;border-right;box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1);line-height:1.1!important;resize:none}.preview-code:focus{outline:0;background:hsl(207,30%,97%);box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1),0 0 5px hsla(207,75%,75%,.9)}.preview-code:last-child{border-bottom:0;border-radius:0 0 5px 5px}.resizeable{padding:15px;overflow:auto;background:hsl(207,0%,100%);box-shadow:0 0 2px hsla(207,10%,20%,.2);resize:both}.preview-code,pre{white-space:pre-wrap;word-wrap:break-word;overflow-y:auto}.code pre{height:100%;margin-top:0}.bar{position:fixed;left:0;right:0;z-index:1010;min-height:40px;line-height:40px;background-image:-webkit-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-moz-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-o-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92))}.bar.top{top:0;box-shadow:0 1px 2px hsla(207,5%,0%,.2)}.bar.bottom{bottom:0;box-shadow:0 -1px 2px hsla(207,5%,0%,.2)}.bar ul{margin:0!important}.bar li{display:block;list-style:none}.bar .icon path{fill:hsla(27,10%,75%,.75)}.docs .icon path{fill:hsla(207,10%,75%,.5)}.docs .permalink:hover .icon path{fill:hsl(207,10%,75%)}.bar button{color:hsla(27,10%,75%,.75)}.bar button:hover .icon path,.bar button.is-active .icon path{fill:hsl(27,10%,85%)}.bar button:hover,.bar button.is-active{color:hsl(27,10%,85%)}.bar .icon{vertical-align:middle;display:inline-block}.bar,.bar a,.bar a:visited{color:hsl(27,10%,85%);text-shadow:1px 1px 0 hsla(27,5%,0%,.5)}.bar a:hover,.bar a.is-active{color:hsl(27,10%,95%);text-shadow:1px 1px 0 hsla(27,5%,0%,1);text-decoration:none}.brand{float:left;margin-right:20px;font-weight:700;font-size:16px;text-decoration:none}.brand,a.brand,a.brand:visited{color:hsl(27,5%,5%);text-shadow:1px 1px 0 hsla(27,5%,100%,.2)}.brand:hover,a.brand:hover{color:hsl(27,5%,0%);text-shadow:1px 1px 0 hsla(27,5%,100%,.3);text-decoration:none}.menu{font-size:12px}.menu>li{float:left;position:relative}.menu a{display:block;margin-right:15px}.dropdown-toggle{position:relative;padding-right:15px}.dropdown-toggle:after{display:block;position:absolute;right:0;top:18px;content:'';border:4px solid;border-left-color:transparent;border-right-color:transparent;border-bottom-color:transparent}.nav-results,.dropdown{position:absolute;z-index:1020;top:32px;left:-16px;width:175px;max-height:500px;padding:10px 0;overflow-y:auto;word-wrap:break-word;font-size:11px;line-height:20px;background-color:hsla(207,10%,25%,.97);border:1px solid hsla(207,5%,70%,.3);border-radius:3px;box-shadow:0 0 3px hsla(207,5%,0%,.2)}.toc-list{width:200px}.nav-results{right:0;width:200px;left:auto;padding:5px 0}.nav-results-filename{display:block;font-size:10px;opacity:.75}.nav-results a{display:block;line-height:15px;padding:5px 10px}.nav-results li:not([hidden])~li a{border-top:1px solid hsla(27,10%,90%,.1)}.dropdown a{padding:0 15px}.dropdown li:hover{background-color:hsl(207,10%,22%)}.nav{float:right;position:relative}.nav input[type="search"]{padding:2px 4px;color:#fff;width:150px;border:1px solid hsla(207,5%,0%,.3);background:hsla(207,12%,40%,.9);box-shadow:inset 1px 1px 3px hsla(207,5%,0%,.05),1px 1px 0 hsla(207,5%,100%,.05);border-radius:10px;-webkit-appearance:textfield}.nav input[type="search"]:focus{outline:0;background:hsla(207,7%,45%,.9)}.settings{text-align:center}.bar button{display:inline-block;vertical-align:middle;padding:0 5px;margin:0 3px;background:transparent}.bar button:first-child{margin-left:0}.settings .auto{line-height:32px;font-size:11px;font-weight:700;letter-spacing:-1px;text-shadow:none;text-transform:uppercase}body{font-family:sans-serif;font-size:14px;line-height:1.618}.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-left:20px;margin-right:20px}.preview,.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-top:10px}ul ul,ol ol,ul ol,ol ul,blockquote p:last-child{margin-top:0}ul,ol{padding-left:1.5em}p:last-child,ol:last-child,ul:last-child,dl:last-child{margin-bottom:20px}hr,h1,h2,h3,h4,h5,h6{margin:1em 20px .5em}h1:first-of-type{margin-top:20px}h1,h2,h3,h4,h5,h6{line-height:1.2;color:hsl(207,10%,50%)}h1 a,h1 a:hover,h1 a:visited{color:inherit;text-decoration:inherit}h1{font-size:3.052em;font-weight:400;color:hsl(207,10%,45%)}h2{font-size:1.953em}h3{font-size:1.536em}h1,h2,h3{letter-spacing:-.025em}h4{font-size:1.25em}h5{font-size:1em;text-transform:uppercase}h6{font-size:1em}.permalink{position:absolute;top:15px;right:15px}a{color:hsl(207,90%,50%);text-decoration:none}a:hover{color:hsl(207,95%,40%);text-decoration:underline}a:visited{color:hsl(207,100%,35%)}.preview-code,pre,code,var{font-style:normal;font-family:"Ubuntu Mono","Andale Mono","DejaVu Sans Mono","Monaco","Bitstream Vera Sans Mono","Consolas","Lucida Console",monospace;font-size:12px}.docs pre,code,var{padding:.1em 3px;background:hsla(207,5%,0%,.025);border:1px solid hsla(207,5%,0%,.05);border-radius:3px}.code pre{line-height:1.1!important}pre code{padding:0;background:transparent;border:0}.cf:before,.cf:after{content:'';display:table}.cf:after{clear:both}[unselectable="on"]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[hidden]{display:none!important}small{font-size:85%;opacity:.9}.docs .vars_list{width:100%}.docs .vars_list th,.docs .vars_list td{width:33%}.docs pre th{text-align:left}.docs pre table{border-collapse:collapse;margin:0}.docs th,.docs td{border:0;padding:9px 10px 9px 0;vertical-align:top}.docs tr th:last-child,.docs tr td:last-child{padding-right:0}.docs pre th{font-weight:400}.docs pre th.vars_head{border-bottom:1px solid #e5e5e5;color:#707070;white-space:nowrap}.docs pre th.vars_section{border-bottom:1px solid #e5e5e5;color:#333;font-size:18px;padding-top:30px}.vars_value{color:#338bb8}.docs li p{margin:0 0 20px}.dropdown a{text-transform:capitalize}#default-button #default-button-big+.preview+.preview-code{display:block}#actions-toolbar-alignment .preview-code,#reverse-primary-and-secondary-blocks .preview-code,#actions-toolbar-indents-customizations .preview-code,#actionstoolbarclearfloats-mixin .preview-code,#responsive-actions-toolbar .preview-code,#button-with-gradient-background .preview-code,#primary-button .preview-code,#button-as-an-icon .preview-code,#button-with-an-icon-on-the-left-or-right-side-of-the-text .preview-code,#button-with-fixed-width .preview-code,#button-as-a-link .preview-code,#link-as-a-button .preview-code,#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol .preview-code,#breadcrumbs-with-solid-background .preview-code,#pagination-without-label-with-solid-background .preview-code,#pagination-with-label-and-text-previousnext-links .preview-code,#pagination-with-label-and-gradient-background-on-links .preview-code,#fixed-height-popup .preview-code,#fixed-content-height-popup .preview-code,#margins-for-header-content-and-footer-block-in-popup .preview-code,#popup-titles-with-styled-as-theme-headings .preview-code,#popup-action-toolbar .preview-code,#popup-close-button-without-an-icon .preview-code,#modify-icon-of-popup-close-button .preview-code,#modify-overlay-styles .preview-code,#rating-summary-multiple-ratings .preview-code,#rating-summary-hide-label .preview-code,#rating-summary-icons-symbol .preview-code,#rating-summary-icons-color .preview-code,#rating-summary-set-number-of-icons .preview-code,#rating-summary .preview-code,#rating-with-vote-icon-symbol .preview-code,#rating-with-vote-setup-icons-colors .preview-code,#rating-with-vote-setup-number-of-icons .preview-code,#tabs-with-content-top-border .preview-code,#accordion-mixin-variables .preview-code,#tabs-base .preview-code,#accordion-base .preview-code,#warning-message .preview-code,#error-message .preview-code,#success-message .preview-code,#notice-message .preview-code,#message-with-inner-icon .preview-code,#message-with-lateral-icon .preview-code,#custom-message-style .preview-code,#modify-dropdown-list-styles .preview-code,#dropdown-with-icon-customization .preview-code,#split-button-button-styling .preview-code,#split-button-icon-customization .preview-code,#split-button-dropdown-list-customization .preview-code,#table-cells-resize .preview-code,#table-caption .preview-code,#table-typography .preview-code,#table-background-customization .preview-code,#table-borders-customization .preview-code,#table-without-borders .preview-code,#table-with-horizontal-borders .preview-code,#table-with-vertical-borders .preview-code,#striped-table .preview-code,#responsive-table-technics-1 .preview-code,#responsive-table-technics-2 .preview-code,#fontsize-mixin .preview-code,#word-breaking-mixin .preview-code,#word-breaking-mixin .preview-code,#text-overflow-mixin .preview-code,#text-hide .preview-code,#hyphens .preview-code,#font-style-and-color .preview-code,#reset-list-styles .preview-code,#inlineblock-list-item-styling .preview-code,#link-styling-mixin .preview-code,#heading-styling-mixin .preview-code,#icon-with-image-or-sprite .preview-code,#change-the-size-of-font-icon .preview-code,#sprite-and-font-icons-for-blank-theme .preview-code,#icon-position-for-an-icon-with-image-or-sprite .preview-code{display:none}article[id$="-variables"] .docs,#resets .docs,#ratings .docs,#tabs-and-accordions .docs,#messages .docs,#dropdown-and-split-buttons-mixins .docs,#font-face-mixin .docs,#layout .docs,#forms-mixins .docs,#including-magento-ui-library-to-your-theme .docs,#global-forms-elements-customization .docs,#mobile-off-canvas-navigation .docs,#desktop-navigation .docs,#utilities .docs,#layout-width .docs,#responsive-breakpoints .docs,#responsive-mixins-usage .docs{width:100%}article[id$="-variables"] .code{display:none}article[id$="-variables"] .docs pre{background:#fff;border:0;margin-top:0}</style><script type="text/preview">(function(){"use strict";var a=function(a){return Array.prototype.slice.call(a)},b=document.getElementsByTagName("body")[0],c=["link","visited","hover","active","focus","target","enabled","disabled","checked"],d=new RegExp(":(("+c.join(")|(")+"))","gi"),e=a(document.styleSheets).map(function(b){return a(b.cssRules).filter(function(a){return a.selectorText&&a.selectorText.match(d)}).map(function(a){return a.cssText.replace(d,".\\3A $1")}).join("")}).join("");if(e.length){var f=document.createElement("style");f.innerText=e;var g=document.getElementsByTagName("style")[0];g.parentNode.insertBefore(f,g)}var h=function(){var a=window.getComputedStyle(b,null);return function(){if(b.childElementCount===0)return b.offsetHeight;var c=b.getElementsByTagName("*"),d=[];for(var e=0,f=c.length;e<f;e++)d.push(c[e].offsetTop+c[e].offsetHeight+parseInt(window.getComputedStyle(c[e],null).getPropertyValue("margin-bottom")));var g=Math.max.apply(Math,d);return g+=parseInt(a.getPropertyValue("padding-bottom"),10),Math.max(g,b.offsetHeight)}}(),i={getHeight:function(){window.parent.postMessage({height:h()},"*")}};window.addEventListener("message",function(a){if(a.data==null)return;typeof a.data=="string"&&i[a.data]()},!1)})()</script><style type="text/preview">.actions-toolbar:before,.actions-toolbar:after{content:"";display:table}.actions-toolbar:after{clear:both}.actions-toolbar .primary{float:left}.actions-toolbar .secondary{float:right}.actions-toolbar .primary,.actions-toolbar .secondary{display:inline-block}.actions-toolbar .primary a.action,.actions-toolbar .secondary a.action{display:inline-block}.actions-toolbar .primary .action{margin:0 5px 0 0}.actions-toolbar .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-2:before,.example-actions-toolbar-2:after{content:"";display:table}.example-actions-toolbar-2:after{clear:both}.example-actions-toolbar-2 .primary{float:left}.example-actions-toolbar-2 .secondary{float:right}.example-actions-toolbar-2 .primary,.example-actions-toolbar-2 .secondary{display:inline-block}.example-actions-toolbar-2 .primary a.action,.example-actions-toolbar-2 .secondary a.action{display:inline-block}.example-actions-toolbar-2 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-2 .secondary a.action{margin-top:6px}.example-actions-toolbar-3{text-align:left}.example-actions-toolbar-3:before,.example-actions-toolbar-3:after{content:"";display:table}.example-actions-toolbar-3:after{clear:both}.example-actions-toolbar-3 .primary{float:left}.example-actions-toolbar-3 .primary,.example-actions-toolbar-3 .secondary{display:inline-block}.example-actions-toolbar-3 .primary a.action,.example-actions-toolbar-3 .secondary a.action{display:inline-block}.example-actions-toolbar-3 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-3 .secondary a.action{margin-top:6px}.example-actions-toolbar-4{text-align:right}.example-actions-toolbar-4:before,.example-actions-toolbar-4:after{content:"";display:table}.example-actions-toolbar-4:after{clear:both}.example-actions-toolbar-4 .secondary{float:right}.example-actions-toolbar-4 .primary,.example-actions-toolbar-4 .secondary{display:inline-block}.example-actions-toolbar-4 .primary a.action,.example-actions-toolbar-4 .secondary a.action{display:inline-block}.example-actions-toolbar-4 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-4 .secondary a.action{margin-top:6px}.example-actions-toolbar-5{text-align:center}.example-actions-toolbar-5:before,.example-actions-toolbar-5:after{content:"";display:table}.example-actions-toolbar-5:after{clear:both}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{vertical-align:top}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{display:inline-block}.example-actions-toolbar-5 .primary a.action,.example-actions-toolbar-5 .secondary a.action{display:inline-block}.example-actions-toolbar-5 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-5 .secondary a.action{margin-top:6px}.example-actions-toolbar-6:before,.example-actions-toolbar-6:after{content:"";display:table}.example-actions-toolbar-6:after{clear:both}.example-actions-toolbar-6 .primary{float:right}.example-actions-toolbar-6 .secondary{float:left}.example-actions-toolbar-6 .primary,.example-actions-toolbar-6 .secondary{display:inline-block}.example-actions-toolbar-6 .primary a.action,.example-actions-toolbar-6 .secondary a.action{display:inline-block}.example-actions-toolbar-6 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-6 .secondary a.action{margin-top:6px}.example-actions-toolbar-7{text-align:left}.example-actions-toolbar-7:before,.example-actions-toolbar-7:after{content:"";display:table}.example-actions-toolbar-7:after{clear:both}.example-actions-toolbar-7 .secondary{float:left}.example-actions-toolbar-7 .primary,.example-actions-toolbar-7 .secondary{display:inline-block}.example-actions-toolbar-7 .primary a.action,.example-actions-toolbar-7 .secondary a.action{display:inline-block}.example-actions-toolbar-7 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-7 .secondary a.action{margin-top:6px}.example-actions-toolbar-8{text-align:right}.example-actions-toolbar-8:before,.example-actions-toolbar-8:after{content:"";display:table}.example-actions-toolbar-8:after{clear:both}.example-actions-toolbar-8 .primary{float:right}.example-actions-toolbar-8 .primary,.example-actions-toolbar-8 .secondary{display:inline-block}.example-actions-toolbar-8 .primary a.action,.example-actions-toolbar-8 .secondary a.action{display:inline-block}.example-actions-toolbar-8 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-8 .secondary a.action{margin-top:6px}.example-actions-toolbar-9{margin:10px;padding:10px}.example-actions-toolbar-9:before,.example-actions-toolbar-9:after{content:"";display:table}.example-actions-toolbar-9:after{clear:both}.example-actions-toolbar-9 .primary{float:left}.example-actions-toolbar-9 .secondary{float:right}.example-actions-toolbar-9 .primary,.example-actions-toolbar-9 .secondary{display:inline-block}.example-actions-toolbar-9 .primary a.action,.example-actions-toolbar-9 .secondary a.action{display:inline-block}.example-actions-toolbar-9 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-9 .secondary a.action{margin-top:6px}.example-actions-toolbar-10{text-align:left}.example-actions-toolbar-10:before,.example-actions-toolbar-10:after{content:"";display:table}.example-actions-toolbar-10:after{clear:both}.example-actions-toolbar-10 .primary{float:left}.example-actions-toolbar-10 .primary,.example-actions-toolbar-10 .secondary{display:inline-block}.example-actions-toolbar-10 .primary a.action,.example-actions-toolbar-10 .secondary a.action{display:inline-block}.example-actions-toolbar-10 .primary .action{margin:0 50px 0 0}.example-actions-toolbar-10 .secondary a.action{margin-top:6px}.example-actions-toolbar-11{text-align:left}.example-actions-toolbar-11:before,.example-actions-toolbar-11:after{content:"";display:table}.example-actions-toolbar-11:after{clear:both}.example-actions-toolbar-11 .primary{float:left}.example-actions-toolbar-11 .primary,.example-actions-toolbar-11 .secondary{display:inline-block}.example-actions-toolbar-11 .primary a.action,.example-actions-toolbar-11 .secondary a.action{display:inline-block}.example-actions-toolbar-11 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-11 .secondary .action{margin:0 50px 0 0}.example-actions-toolbar-11 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}@media only screen and (max-width: 768px){.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{ display:block;float:none}}.example-breadcrumbs-1{margin:0 0 20px}.example-breadcrumbs-1 .items{font-size:1.2rem;color:#a3a3a3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-1 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-1 .item{margin:0}.example-breadcrumbs-1 a{color:#333;text-decoration:none}.example-breadcrumbs-1 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-1 a:hover{color:#333;text-decoration:underline}.example-breadcrumbs-1 a:active{color:#333;text-decoration:none}.example-breadcrumbs-1 strong{font-weight:400}.example-breadcrumbs-1 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-1 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-2{margin:0 0 20px}.example-breadcrumbs-2 .items{font-size:1.2rem;color:#1979c3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-2 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-2 .item{margin:0}.example-breadcrumbs-2 a{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #ccc;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-2 a:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 strong{background-color:#ff5501;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f7b32e 0, #ff5501 100%);background-image:linear-gradient(to bottom, #f7b32e 0, #ff5501 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7b32e', endColorstr='#ff5501', GradientType=0);border:1px solid #d04b0a;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-2 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-2 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3{margin:0 0 20px}.example-breadcrumbs-3 .items{font-size:1.2rem;color:#333;margin:0;padding:0;list-style:none none}.example-breadcrumbs-3 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-3 .item{margin:0}.example-breadcrumbs-3 a{background:#f4f4f4;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-3 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-3 a:hover{background:#ccc;color:#333;text-decoration:none}.example-breadcrumbs-3 a:active{color:#333;text-decoration:none}.example-breadcrumbs-3 strong{background:#e7e7e7;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-3 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-3 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3 .item a{position:relative;margin:0 11px 0 0}.example-breadcrumbs-3 .item a:after{border:12px solid transparent;height:0;width:0;border-left-color:#f4f4f4;content:"";position:absolute;display:block;top:0;right:-23px}.example-breadcrumbs-3 .item a:hover:after{border-color:transparent transparent transparent #ccc}button{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}button:focus,button:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}button:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}button.disabled,button[disabled],fieldset[disabled] button{cursor:default;pointer-events:none;opacity:.5}button:active,button:focus{box-shadow:inset 0 2px 1px rgba(0,0,0,.12)}.example-button-1.example-button-2{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-button-1.example-button-3{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;border-radius:0;color:#000}.example-button-1.example-button-3:hover,.example-button-1.example-button-3.active{color:#000}.example-button-10{background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-10>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-button-10:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-10:hover:before{color:inherit}.example-button-10:active:before{color:inherit}.example-button-10:focus,.example-button-10:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-10:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:default;pointer-events:none;opacity:.5}.example-button-10:focus,.example-button-10:active{background:0;border:0}.example-button-10:hover{background:0;border:0}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-11{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-11:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-11:hover:before{color:inherit}.example-button-11:active:before{color:inherit}.example-button-11:focus,.example-button-11:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-11:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-11.disabled,.example-button-11[disabled],fieldset[disabled] .example-button-11{cursor:default;pointer-events:none;opacity:.5}.example-button-12{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-12:after{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-12:hover:after{color:inherit}.example-button-12:active:after{color:inherit}.example-button-12:focus,.example-button-12:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-12:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-12.disabled,.example-button-12[disabled],fieldset[disabled] .example-button-12{cursor:default;pointer-events:none;opacity:.5}.example-button-13{background-image:none;background:#f2f2f2;padding:7px 15px;width:100px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-13:focus,.example-button-13:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-13:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-13.disabled,.example-button-13[disabled],fieldset[disabled] .example-button-13{cursor:default;pointer-events:none;opacity:.5}.example-button-4{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-4:focus,.example-button-4:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4.disabled,.example-button-4[disabled],fieldset[disabled] .example-button-4{cursor:default;pointer-events:none;opacity:.5}.example-button-4:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-4.example-button-5{line-height:2.2rem;padding:7px 35px;font-size:1.8rem}.example-button-4.example-button-6{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;color:#fff}.example-button-4.example-button-6:hover,.example-button-4.example-button-6.active{color:#fff}.example-button-7{background-image:none;background:#f2f2f2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #1979c3 0, #006bb4 100%);background-image:linear-gradient(to bottom, #1979c3 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1979c3', endColorstr='#006bb4', GradientType=0);padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}.example-button-7:focus,.example-button-7:active{background:#e2e2e2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #006bb4 100%);background-image:linear-gradient(to bottom, #006bb4 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#006bb4', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7:hover{background:#e2e2e2;background-color:#1979c3;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #1979c3 100%);background-image:linear-gradient(to bottom, #006bb4 0, #1979c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#1979c3', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7.disabled,.example-button-7[disabled],fieldset[disabled] .example-button-7{cursor:default;pointer-events:none;opacity:.5}.example-button-7:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-8{background:0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;font-weight:400}.example-button-8:visited{color:#1979c3;text-decoration:none}.example-button-8:hover{color:#006bb4;text-decoration:underline}.example-button-8:active{color:#ff5501;text-decoration:underline}.example-button-8:hover{color:#006bb4}.example-button-8:hover,.example-button-8:active,.example-button-8:focus{background:0;border:0}.example-button-8.disabled,.example-button-8[disabled],fieldset[disabled] .example-button-8{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.example-button-8:active{box-shadow:none}.example-button-9{text-decoration:none;background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:0;vertical-align:middle;margin:3px;border-radius:3px;font-weight:700}.example-button-9:hover,.example-button-9:active,.example-button-9:focus{text-decoration:none}.example-button-9:focus,.example-button-9:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-9:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-9.disabled,.example-button-9[disabled],fieldset[disabled] .example-button-9{cursor:default;pointer-events:none;opacity:.5}.example-button-9:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-14{background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-14:focus,.example-button-14:active{background:0;border:0}.example-button-14:hover{background:0;border:0}.example-button-14.disabled,.example-button-14[disabled],fieldset[disabled] .example-button-14{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-15{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;vertical-align:middle;background:#f2f2f2;color:#333;border:1px solid #cdcdcd}.example-button-15:focus,.example-button-15:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15.disabled,.example-button-15[disabled],fieldset[disabled] .example-button-15{cursor:default;pointer-events:none;opacity:.5}.example-button-15:focus,.example-button-15:active{background:#e2e2e2;color:#333;border:1px solid #cdcdcd}.example-button-15:hover{background:#e2e2e2;color:#555;border:1px solid #cdcdcd}.example-button-17{line-height:2.2rem;padding:14px 17px;font-size:1.8rem;font-size:1.4rem;line-height:1.6rem;padding:7px 15px}.example-button-18{font-size:1rem;line-height:1.2rem;padding:4px 10px}.example-dropdown-1{display:inline-block;position:relative}.example-dropdown-1:before,.example-dropdown-1:after{content:"";display:table}.example-dropdown-1:after{clear:both}.example-dropdown-1 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle:hover:after{color:inherit}.example-dropdown-1 .action.toggle:active:after{color:inherit}.example-dropdown-1 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle.active:hover:after{color:inherit}.example-dropdown-1 .action.toggle.active:active:after{color:inherit}.example-dropdown-1 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-1 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-1 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-1 ul.dropdown:before,.example-dropdown-1 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-1 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-1 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-1 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-1 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-1.active{overflow:visible}.example-dropdown-1.active ul.dropdown{display:block}.example-dropdown-2{display:inline-block;position:relative}.example-dropdown-2:before,.example-dropdown-2:after{content:"";display:table}.example-dropdown-2:after{clear:both}.example-dropdown-2 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle:hover:after{color:inherit}.example-dropdown-2 .action.toggle:active:after{color:inherit}.example-dropdown-2 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle.active:hover:after{color:inherit}.example-dropdown-2 .action.toggle.active:active:after{color:inherit}.example-dropdown-2 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-2 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-2 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-2 ul.dropdown:before,.example-dropdown-2 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-2 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-2 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-2 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-2 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-2.active{overflow:visible}.example-dropdown-2.active ul.dropdown{display:block}.example-dropdown-3{display:inline-block;position:relative}.example-dropdown-3:before,.example-dropdown-3:after{content:"";display:table}.example-dropdown-3:after{clear:both}.example-dropdown-3 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle:hover:before{color:red}.example-dropdown-3 .action.toggle:active:before{color:inherit}.example-dropdown-3 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle.active:hover:before{color:red}.example-dropdown-3 .action.toggle.active:active:before{color:inherit}.example-dropdown-3 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-3 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-3 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-3 ul.dropdown:before,.example-dropdown-3 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-3 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-3 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-3 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-3 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-3.active{overflow:visible}.example-dropdown-3.active ul.dropdown{display:block}.example-dropdown-5{display:inline-block;position:relative}.example-dropdown-5:before,.example-dropdown-5:after{content:"";display:table}.example-dropdown-5:after{clear:both}.example-dropdown-5 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle:hover:after{color:inherit}.example-dropdown-5 .action.toggle:active:after{color:inherit}.example-dropdown-5 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle.active:hover:after{color:inherit}.example-dropdown-5 .action.toggle.active:active:after{color:inherit}.example-dropdown-5 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-5 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-5 ul.dropdown li:first-child{border:0}.example-dropdown-5 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-5.active{overflow:visible}.example-dropdown-5.active ul.dropdown{display:block}.example-dropdown-6{display:inline-block;position:relative}.example-dropdown-6:before,.example-dropdown-6:after{content:"";display:table}.example-dropdown-6:after{clear:both}.example-dropdown-6 .action.split{float:left;margin:0}.example-dropdown-6 .action.toggle{float:right;margin:0}.example-dropdown-6 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-6 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-6 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle:hover:after{color:inherit}.example-dropdown-6 .action.toggle:active:after{color:inherit}.example-dropdown-6 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle.active:hover:after{color:inherit}.example-dropdown-6 .action.toggle.active:active:after{color:inherit}.example-dropdown-6 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-6 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-6 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-6 ul.dropdown:before,.example-dropdown-6 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-6 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-6 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-6 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-6 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-6.active{overflow:visible}.example-dropdown-6.active ul.dropdown{display:block}.split.example-dropdown-7{display:inline-block;position:relative}.split.example-dropdown-7:before,.split.example-dropdown-7:after{content:"";display:table}.split.example-dropdown-7:after{clear:both}.split.example-dropdown-7 .action.split{float:left;margin:0}.split.example-dropdown-7 .action.toggle{float:right;margin:0}.split.example-dropdown-7 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle:active:after{color:inherit}.split.example-dropdown-7 .action.toggle.active{display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle.active:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle.active:active:after{color:inherit}.split.example-dropdown-7 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.split.example-dropdown-7 ul.dropdown li{margin:0;padding:3px 5px}.split.example-dropdown-7 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.split.example-dropdown-7 ul.dropdown:before,.split.example-dropdown-7 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.split.example-dropdown-7 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.split.example-dropdown-7 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.split.example-dropdown-7 ul.dropdown:before{top:-12px;right:10px}.split.example-dropdown-7 ul.dropdown:after{top:-14px;right:9px}.split.example-dropdown-7.active{overflow:visible}.split.example-dropdown-7.active ul.dropdown{display:block}.example-dropdown-8{display:inline-block;position:relative}.example-dropdown-8:before,.example-dropdown-8:after{content:"";display:table}.example-dropdown-8:after{clear:both}.example-dropdown-8 .action.split{float:left;margin:0}.example-dropdown-8 .action.toggle{float:right;margin:0}.example-dropdown-8 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-8 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-8 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle:hover:after{color:inherit}.example-dropdown-8 .action.toggle:active:after{color:inherit}.example-dropdown-8 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle.active:hover:after{color:inherit}.example-dropdown-8 .action.toggle.active:active:after{color:inherit}.example-dropdown-8 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-8 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-8 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-8 ul.dropdown:before,.example-dropdown-8 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-8 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-8 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-8 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-8 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-8.active{overflow:visible}.example-dropdown-8.active ul.dropdown{display:block}.example-dropdown-9{display:inline-block;position:relative}.example-dropdown-9 .action.split,.example-dropdown-9 .action.toggle{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-dropdown-9:before,.example-dropdown-9:after{content:"";display:table}.example-dropdown-9:after{clear:both}.example-dropdown-9 .action.split{float:left;margin:0}.example-dropdown-9 .action.toggle{float:right;margin:0}.example-dropdown-9 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-9 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-9 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle:hover:after{color:inherit}.example-dropdown-9 .action.toggle:active:after{color:inherit}.example-dropdown-9 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle.active:hover:after{color:inherit}.example-dropdown-9 .action.toggle.active:active:after{color:inherit}.example-dropdown-9 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-9 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-9 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-9 ul.dropdown:before,.example-dropdown-9 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-9 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-9 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-9 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-9 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-9.active{overflow:visible}.example-dropdown-9.active ul.dropdown{display:block}.example-dropdown-10{display:inline-block;position:relative}.example-dropdown-10 .action.split,.example-dropdown-10 .action.toggle{line-height:1.2rem;padding:5px 8px;font-size:1.1rem}.example-dropdown-10:before,.example-dropdown-10:after{content:"";display:table}.example-dropdown-10:after{clear:both}.example-dropdown-10 .action.split{float:left;margin:0}.example-dropdown-10 .action.toggle{float:right;margin:0}.example-dropdown-10 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-10 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-10 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle:hover:after{color:inherit}.example-dropdown-10 .action.toggle:active:after{color:inherit}.example-dropdown-10 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle.active:hover:after{color:inherit}.example-dropdown-10 .action.toggle.active:active:after{color:inherit}.example-dropdown-10 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-10 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-10 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-10 ul.dropdown:before,.example-dropdown-10 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-10 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-10 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-10 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-10 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-10.active{overflow:visible}.example-dropdown-10.active ul.dropdown{display:block}.example-dropdown-11{display:inline-block;position:relative}.example-dropdown-11:before,.example-dropdown-11:after{content:"";display:table}.example-dropdown-11:after{clear:both}.example-dropdown-11 .action.split{float:right;margin:0}.example-dropdown-11 .action.toggle{float:left;margin:0}.example-dropdown-11 button.action.split{border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-11 button+.action.toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-11 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle:hover:before{color:red}.example-dropdown-11 .action.toggle:active:before{color:inherit}.example-dropdown-11 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle.active:hover:before{color:red}.example-dropdown-11 .action.toggle.active:active:before{color:inherit}.example-dropdown-11 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-11 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-11 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-11 ul.dropdown:before,.example-dropdown-11 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-11 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-11 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-11 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-11 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-11.active{overflow:visible}.example-dropdown-11.active ul.dropdown{display:block}.example-dropdown-12{display:inline-block;position:relative}.example-dropdown-12:before,.example-dropdown-12:after{content:"";display:table}.example-dropdown-12:after{clear:both}.example-dropdown-12 .action.split{float:left;margin:0}.example-dropdown-12 .action.toggle{float:right;margin:0}.example-dropdown-12 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-12 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-12 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle:hover:after{color:inherit}.example-dropdown-12 .action.toggle:active:after{color:inherit}.example-dropdown-12 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle.active:hover:after{color:inherit}.example-dropdown-12 .action.toggle.active:active:after{color:inherit}.example-dropdown-12 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-12 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-12 ul.dropdown li:first-child{border:0}.example-dropdown-12 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-12.active{overflow:visible}.example-dropdown-12.active ul.dropdown{display:block}.example-form-1 .example-form-1-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-1 .example-form-1-fieldset>*{letter-spacing:normal}.example-form-1 .example-form-1-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-1 .example-form-1-fieldset:after{content:attr(data-hasrequired);display:block;font-size:1.2rem;color:#e02b27;margin:10px 0 0;letter-spacing:normal;word-spacing:normal}.example-form-1 .example-form-1-fieldset>.field{margin:0 0 20px}.example-form-1 .example-form-1-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-1 .example-form-1-fieldset>.field:last-child{margin-bottom:0}.example-form-1 .example-form-1-fieldset>.field>.label{font-weight:700}.example-form-1 .example-form-1-fieldset>.field>.label+br{display:none}.example-form-1 .example-form-1-fieldset>.field .choice input{vertical-align:top}.example-form-1 .example-form-1-fieldset>.field .fields.group:before,.example-form-1 .example-form-1-fieldset>.field .fields.group:after{content:"";display:table}.example-form-1 .example-form-1-fieldset>.field .fields.group:after{clear:both}.example-form-1 .example-form-1-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-1 .example-form-1-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-1 .example-form-1-fieldset>.field .addon textarea,.example-form-1 .example-form-1-fieldset>.field .addon select,.example-form-1 .example-form-1-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;display:inline-block;margin:0;width:auto}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore,.example-form-1 .example-form-1-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:disabled,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-1 .example-form-1-fieldset>.field .additional{margin-top:10px}.example-form-1 .example-form-1-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-1 .example-form-1-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-1 .example-form-1-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-form-2 .example-form-2-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-2 .example-form-2-fieldset>*{letter-spacing:normal}.example-form-2 .example-form-2-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-2 .example-form-2-fieldset>.field{margin:0 0 20px;box-sizing:border-box;display:inline-block;padding:0 12px 0 0;width:50%;vertical-align:top}.example-form-2 .example-form-2-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-2 .example-form-2-fieldset>.field:last-child{margin-bottom:0}.example-form-2 .example-form-2-fieldset>.field+.fieldset{clear:both}.example-form-2 .example-form-2-fieldset>.field>.label{font-weight:700}.example-form-2 .example-form-2-fieldset>.field>.label+br{display:none}.example-form-2 .example-form-2-fieldset>.field .choice input{vertical-align:top}.example-form-2 .example-form-2-fieldset>.field .fields.group:before,.example-form-2 .example-form-2-fieldset>.field .fields.group:after{content:"";display:table}.example-form-2 .example-form-2-fieldset>.field .fields.group:after{clear:both}.example-form-2 .example-form-2-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-2 .example-form-2-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-2 .example-form-2-fieldset>.field .addon textarea,.example-form-2 .example-form-2-fieldset>.field .addon select,.example-form-2 .example-form-2-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;display:inline-block;margin:0;width:auto}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore,.example-form-2 .example-form-2-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:disabled,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-2 .example-form-2-fieldset>.field .additional{margin-top:10px}.example-form-2 .example-form-2-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-2 .example-form-2-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-2 .example-form-2-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}input[type="text"],input[type="password"],input[type="url"],input[type="tel"],input[type="search"],input[type="number"],input[type="datetime"],input[type="email"]{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}input[type="text"]:disabled,input[type="password"]:disabled,input[type="url"]:disabled,input[type="tel"]:disabled,input[type="search"]:disabled,input[type="number"]:disabled,input[type="datetime"]:disabled,input[type="email"]:disabled{opacity:.5}input[type="text"]::-moz-placeholder,input[type="password"]::-moz-placeholder,input[type="url"]::-moz-placeholder,input[type="tel"]::-moz-placeholder,input[type="search"]::-moz-placeholder,input[type="number"]::-moz-placeholder,input[type="datetime"]::-moz-placeholder,input[type="email"]::-moz-placeholder{color:#c2c2c2}input[type="text"]::-webkit-input-placeholder,input[type="password"]::-webkit-input-placeholder,input[type="url"]::-webkit-input-placeholder,input[type="tel"]::-webkit-input-placeholder,input[type="search"]::-webkit-input-placeholder,input[type="number"]::-webkit-input-placeholder,input[type="datetime"]::-webkit-input-placeholder,input[type="email"]::-webkit-input-placeholder{color:#c2c2c2}input[type="text"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder,input[type="url"]:-ms-input-placeholder,input[type="tel"]:-ms-input-placeholder,input[type="search"]:-ms-input-placeholder,input[type="number"]:-ms-input-placeholder,input[type="datetime"]:-ms-input-placeholder,input[type="email"]:-ms-input-placeholder{color:#c2c2c2}select{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:5px 10px 4px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}select:disabled{opacity:.5}select[multiple="multiple"]{height:auto;margin-bottom:20px}textarea{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:auto;width:100%;padding:10px;margin:0;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;resize:vertical}textarea:disabled{opacity:.5}textarea::-moz-placeholder{color:#c2c2c2}textarea::-webkit-input-placeholder{color:#c2c2c2}textarea:-ms-input-placeholder{color:#c2c2c2}input[type="checkbox"]{margin:2px 5px 0 0}input[type="checkbox"]:disabled{opacity:.5}input[type="radio"]{margin:2px 5px 0 0}input[type="radio"]:disabled{opacity:.5}input.text-example-1,select.select-example-1,textarea.textarea-example-1{background:#fdf0d5;border-color:#fc0;color:#b30000}input.text-example-1:focus,select.select-example-1:focus,textarea.textarea-example-1:focus{border-color:#cff;color:#060}input.text-example-1:disabled,select.select-example-1:disabled,textarea.textarea-example-1:disabled{color:#fcc}input.text-example-1::-moz-placeholder,textarea.textarea-example-1::-moz-placeholder{color:#ccc}input.text-example-1::-webkit-input-placeholder,textarea.textarea-example-1::-webkit-input-placeholder{color:#ccc}input.text-example-1:-ms-input-placeholder,textarea.textarea-example-1:-ms-input-placeholder{color:#ccc}.number-example{-moz-appearance:textfield}.number-example::-webkit-inner-spin-button,.number-example::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.search-example{-webkit-appearance:none}.search-example::-webkit-search-cancel-button,.search-example::-webkit-search-decoration,.search-example::-webkit-search-results-button,.search-example::-webkit-search-results-decoration{-webkit-appearance:none}input,textarea,select{font-size:1.2rem;color:#e02b27}.example-icon-1{display:inline-block}.example-icon-1:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-2{display:inline-block}.example-icon-2:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -26px 0}.example-icon-3{display:inline-block}.example-icon-3>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-3:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -156px -52px}.example-icon-4{display:inline-block;text-decoration:none}.example-icon-4:before{font-family:'icons-blank-theme';content:'\e606';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-5{display:inline-block;text-decoration:none}.example-icon-5:after{font-family:'icons-blank-theme';content:'\e605';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-6{display:inline-block;text-decoration:none}.example-icon-6>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-6:before{font-family:'icons-blank-theme';content:'\e61b';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-7{display:inline-block}.example-icon-7:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8{display:inline-block}.example-icon-8:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8:before{background-position:-182px 0}.example-icon-9{display:inline-block}.example-icon-9:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-9:after{background-position:-52px -26px}.example-icon-10{display:inline-block}.example-icon-10:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-10:before{background-position:-104px 0}.example-icon-11{display:inline-block}.example-icon-11:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-11:before{width:30px;height:30px}.example-icon-11:after{width:30px;height:30px}.example-icon-11:before{background-color:#f1f1f1}.example-icon-12{display:inline-block;text-decoration:none}.example-icon-12:before{font-family:'icons-blank-theme';content:'\e612';font-size:28px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13{display:inline-block;text-decoration:none}.example-icon-13:before{font-family:'icons-blank-theme';content:'\e612';font-size:inherit;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13:before{font-size:26px;line-height:inherit}.example-icon-14{display:inline-block;text-decoration:none}.example-icon-14:before{font-family:'icons-blank-theme';content:'\e61d';font-size:26px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-14>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.icons-image-list{list-style:none;padding:0}.icons-image-list li{float:left;width:33%}.icons-image-list li>span{display:inline-block}.icons-image-list li>span:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.icons-image-list li .icon-search:before{background-position:0 0}.icons-image-list li .icon-cart:before{background-position:-26px 0}.icons-image-list li .icon-arrow-down:before{background-position:-52px 0}.icons-image-list li .icon-arrow-up:before{background-position:-78px 0}.icons-image-list li .icon-grid:before{background-position:-104px 0}.icons-image-list li .icon-list:before{background-position:-130px 0}.icons-image-list li .icon-remove:before{background-position:-156px 0}.icons-image-list li .icon-star:before{background-position:-182px 0}.icons-image-list li .icon-pointer-down:before{background-position:-208px 0}.icons-image-list li .icon-pointer-up:before{background-position:-234px 0}.icons-image-list li .icon-pointer-left:before{background-position:-260px 0}.icons-image-list li .icon-pointer-right:before{background-position:-286px 0}.icons-image-list li .icon-compare-empty:before{background-position:0 -26px}.icons-image-list li .icon-compare-full:before{background-position:-26px -26px}.icons-image-list li .icon-wishlist-empty:before{background-position:-52px -26px}.icons-image-list li .icon-wishlist-full:before{background-position:-78px -26px}.icons-image-list li .icon-update:before{background-position:-104px -26px}.icons-image-list li .icon-collapse:before{background-position:-130px -26px}.icons-image-list li .icon-expand:before{background-position:-156px -26px}.icons-image-list li .icon-menu:before{background-position:-182px -26px}.icons-image-list li .icon-prev:before{background-position:-208px -26px}.icons-image-list li .icon-next:before{background-position:-234px -26px}.icons-image-list li .icon-settings:before{background-position:-260px -26px}.icons-image-list li .icon-info:before{background-position:-286px -26px}.icons-image-list li .icon-checkmark:before{background-position:0 -52px}.icons-image-list li .icon-calendar:before{background-position:-26px -52px}.icons-image-list li .icon-comment:before{background-position:-52px -52px}.icons-image-list li .icon-comment-reflected:before{background-position:-78px -52px}.icons-image-list li .icon-envelope:before{background-position:-104px -52px}.icons-image-list li .icon-warning:before{background-position:-130px -52px}.icons-image-list li .icon-trash:before{background-position:-156px -52px}.icons-image-list li .icon-flag:before{background-position:-182px -52px}.icons-image-list li .icon-location:before{background-position:-208px -52px}.icons-image-list li .icon-up:before{background-position:-234px -52px}.icons-image-list li .icon-down:before{background-position:-260px -52px}.icons-font-list{list-style:none;padding:0}.icons-font-list li{float:left;width:25%;margin-bottom:35px;text-align:center}.icons-font-list li>span{display:inline-block;text-decoration:none}.icons-font-list li>span:before{font-family:'icons-blank-theme';font-size:34px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.icons-font-list li>span:before{content:attr(data-icon);margin:0 auto;display:block}.loader{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.5);z-index:9999}.loader:before{border-radius:5px;background:transparent url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%;box-sizing:border-box;content:'';position:absolute;top:0;right:0;left:0;bottom:0;margin:auto;width:160px;height:160px}.loading{position:relative}.loading:before{content:'';position:absolute;left:0;top:0;right:0;bottom:0;background:rgba(255,255,255,.5) url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%}.example-message-info{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-info a{color:#1979c3}.example-message-info a:hover{color:#006bb4}.example-message-info a:active{color:#006bb4}.example-message-warning{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-warning a{color:#1979c3}.example-message-warning a:hover{color:#006bb4}.example-message-warning a:active{color:#006bb4}.example-message-error{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27}.example-message-error a{color:#1979c3}.example-message-error a:hover{color:#006bb4}.example-message-error a:active{color:#006bb4}.example-message-success{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400}.example-message-success a{color:#1979c3}.example-message-success a:hover{color:#006bb4}.example-message-success a:active{color:#006bb4}.example-message-notice{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-notice a{color:#1979c3}.example-message-notice a:hover{color:#006bb4}.example-message-notice a:active{color:#006bb4}.example-message-1{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400;position:relative;padding-left:40px}.example-message-1 a{color:#1979c3}.example-message-1 a:hover{color:#006bb4}.example-message-1 a:active{color:#006bb4}.example-message-1>:first-child:before{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#c07600;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:40px}.example-message-2{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27;position:relative;padding-right:40px}.example-message-2 a{color:#1979c3}.example-message-2 a:hover{color:#006bb4}.example-message-2 a:active{color:#006bb4}.example-message-2:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#b30000}.example-message-2>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-2>:first-child:after{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-2:before{right:0}.example-message-2>:first-child:before{border:5px solid transparent;height:0;width:0;border-right-color:#b30000;right:30px}.example-message-2>:first-child:after{right:0}.example-message-3{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400;position:relative;padding-left:40px}.example-message-3 a{color:#1979c3}.example-message-3 a:hover{color:#006bb4}.example-message-3 a:active{color:#006bb4}.example-message-3:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#006400}.example-message-3>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-3>:first-child:after{font-family:'icons-blank-theme';content:'\e610';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-3:before{left:0}.example-message-3>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#006400;left:30px}.example-message-3>:first-child:after{left:0}.example-message-4{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fc0;border-color:#ffa500;color:#000;position:relative;padding-left:40px;border-width:4px;border-radius:10px}.example-message-4 a{color:#00f}.example-message-4 a:hover{color:#009}.example-message-4 a:active{color:#006}.example-message-4:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#green}.example-message-4>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-4>:first-child:after{font-family:'icons-blank-theme';content:'\e606';font-size:28px;line-height:28px;color:#000;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:15px;left:0;text-align:center;width:30px}.example-message-4:before{left:0}.example-message-4>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#green;left:30px}.example-message-4>:first-child:after{left:0}header.header{background-color:rgba(255,0,0,.2)}.column.main{background-color:rgba(255,255,0,.2)}.column.left{background-color:rgba(0,255,255,.2)}.column.right{background-color:rgba(0,0,255,.2)}footer.footer{background-color:rgba(0,0,0,.2)}.columns{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.columns:after{content:" ";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.columns>.column{padding-bottom:40px}@media (min-width: 600px){.page-layout-1column .column.main{ width:100%;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-3columns .column.main{width:66.66666667%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-left .column.main{width:83.33333333%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.main{width:83.33333333%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-left .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-right .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.right{width:16.66666667%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.page-layout-2columns-left .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}}.layout-example-3 .column.main{width:60%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3 .column.left{width:20%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.layout-example-3-1 .column.main{width:60%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3-1 .column.left{width:20%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3-1 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.pages>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.pages .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.pages .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.pages a.page:visited{color:#1979c3}.pages a.page:hover{color:#006bb4;text-decoration:none}.pages a.page:active{color:#ff5501}.pages strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.pages .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.pages .action:visited{color:#7d7d7d}.pages .action:hover{color:#7d7d7d;text-decoration:none}.pages .action:active{color:#7d7d7d}.pages .action.next{display:inline-block;text-decoration:none}.pages .action.next:visited:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.next:hover:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.previous{display:inline-block;text-decoration:none}.pages .action.previous:visited:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.pages .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.previous:hover:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.example-pages-1>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-1>.label:after{content:':'}.example-pages-1 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-1 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 3px;display:inline-block}.example-pages-1 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 a.page{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #b3b3b3;color:#333;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-1 a.page:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#1979c3}.example-pages-1 a.page:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);border:1px solid #999;color:#333;text-decoration:none}.example-pages-1 a.page:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#ff5501}.example-pages-1 strong.page{background:#1979c3;border:1px solid #135d96;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#f7b32e;display:inline-block;font-weight:700;padding:0 4px}.example-pages-1 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-1 .action:visited{color:#7d7d7d}.example-pages-1 .action:hover{color:#ff5501;text-decoration:none}.example-pages-1 .action:active{color:#7d7d7d}.example-pages-1 .action.next{display:inline-block;text-decoration:none}.example-pages-1 .action.next:visited:before{color:#7d7d7d}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.next:hover:before{color:#ff5501}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.previous{display:inline-block;text-decoration:none}.example-pages-1 .action.previous:visited:before{color:#7d7d7d}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-1 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.previous:hover:before{color:#ff5501}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-2>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-2>.label:after{content:':'}.example-pages-2 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-2 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-2 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-2 a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-2 a.page:visited{color:#1979c3}.example-pages-2 a.page:hover{color:#006bb4;text-decoration:none}.example-pages-2 a.page:active{color:#ff5501}.example-pages-2 strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.example-pages-2 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-2 .action:visited{color:#7d7d7d}.example-pages-2 .action:hover{color:#7d7d7d;text-decoration:none}.example-pages-2 .action:active{color:#7d7d7d}.example-pages-3>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-3 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-3 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 a.page{background:#1979c3;color:#fff;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-3 a.page:visited{background:#1979c3;color:#fff}.example-pages-3 a.page:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 a.page:active{background:#ff5501;color:#fff}.example-pages-3 strong.page{background:#1979c3;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#fff;display:inline-block;font-weight:700;padding:0 4px}.example-pages-3 .action{background:#1979c3;border:1px solid #d1d1d1;color:#fff;display:inline-block;padding:0;text-decoration:none}.example-pages-3 .action:visited{background:#1979c3;color:#7d7d7d}.example-pages-3 .action:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 .action:active{background:#ff5501;color:#fff}.example-pages-3 .action.next{display:inline-block;text-decoration:none}.example-pages-3 .action.next:visited:before{color:#7d7d7d}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.next:hover:before{color:#fff}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.previous{display:inline-block;text-decoration:none}.example-pages-3 .action.previous:visited:before{color:#7d7d7d}.example-pages-3 .action.previous:active:before{color:#fff}.example-pages-3 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.previous:hover:before{color:#fff}.example-pages-3 .action.previous:active:before{color:#fff}.window.popup.popup-example{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:focus,.window.popup.popup-example .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example .popup-actions .action.close.disabled,.window.popup.popup-example .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example.active{opacity:1}.window.popup.popup-example-1{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-1 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-1 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-1 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-1 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-1 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-1 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:focus,.window.popup.popup-example-1 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close.disabled,.window.popup.popup-example-1 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-1 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-1.active{opacity:1}.window.overlay{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#000;z-index:1000;opacity:0}.window.overlay.active{opacity:.5;filter:alpha(opacity=50)}.window.popup.popup-example-2{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;overflow-y:auto;max-height:200px;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-2 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-2 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-2 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-2 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-2 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-2 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:focus,.window.popup.popup-example-2 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close.disabled,.window.popup.popup-example-2 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-2 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-2.active{opacity:1}.window.popup.popup-example-3{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-3 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-3 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-3 .popup-content{overflow-y:auto;max-height:200px}.window.popup.popup-example-3 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-3 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-3 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-3 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:focus,.window.popup.popup-example-3 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close.disabled,.window.popup.popup-example-3 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-3 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-3.active{opacity:1}.window.popup.popup-example-4{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-4 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-4 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-4 .popup-content{margin:0 0 20px}.window.popup.popup-example-4 .popup-footer{margin:0 20px}.window.popup.popup-example-4 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-4 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-4 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-4 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:focus,.window.popup.popup-example-4 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close.disabled,.window.popup.popup-example-4 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-4 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-4.active{opacity:1}.window.popup.popup-example-5{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-5 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-5 .popup-header .title{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.window.popup.popup-example-5 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-5 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-5 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-5 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:focus,.window.popup.popup-example-5 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close.disabled,.window.popup.popup-example-5 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-5 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-5.active{opacity:1}.window.popup.popup-example-6{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-6 .popup-footer .actions.toolbar{text-align:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar:before,.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{content:"";display:table}.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{clear:both}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{float:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary a.action,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary .action{margin:0 5px 0 0}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{margin-top:6px}.window.popup.popup-example-6 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-6 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-6 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-6 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-6 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-6 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:focus,.window.popup.popup-example-6 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close.disabled,.window.popup.popup-example-6 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-6 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-6.active{opacity:1}.window.popup.popup-example-7{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-7 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-7 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-7 .popup-actions .action.close{position:absolute;top:10px;right:10px}.window.popup.popup-example-7.active{opacity:1}.window.popup.popup-example-8{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-8 .popup-header{margin:0 0 25px;padding-right:30px}.window.popup.popup-example-8 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-8 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-8 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e613';font-size:30px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:0}.window.popup.popup-example-8 .popup-actions .action.close:hover:before{color:#090}.window.popup.popup-example-8 .popup-actions .action.close:active:before{color:#00f}.window.popup.popup-example-8 .popup-actions .action.close:focus,.window.popup.popup-example-8 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close.disabled,.window.popup.popup-example-8 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-8 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-8.active{opacity:1}.window.popup.popup-example-9{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-9 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-9 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-9 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-9 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-9 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-9 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:focus,.window.popup.popup-example-9 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close.disabled,.window.popup.popup-example-9 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-9 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-9.active{opacity:1}.window.overlay.example-overlay-1.active{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#0f5293;z-index:1000;opacity:0}.window.overlay.example-overlay-1.active.active{opacity:.8;filter:alpha(opacity=80)}.example-ratings-1{overflow:hidden}.example-ratings-1:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-1 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 input[type="radio"]:focus+label:before,.example-ratings-1 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-1 label{position:absolute;display:block;cursor:pointer}.example-ratings-1 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-1 label:hover:before{opacity:1}.example-ratings-1 label:hover~label:before{opacity:0}.example-ratings-1 .rating-5{z-index:2}.example-ratings-1 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-4{z-index:3}.example-ratings-1 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-3{z-index:4}.example-ratings-1 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-1 .rating-2{z-index:5}.example-ratings-1 .rating-2:before{content:'\e605' '\e605'}.example-ratings-1 .rating-1{z-index:6}.example-ratings-1 .rating-1:before{content:'\e605'}.example-ratings-2{overflow:hidden}.example-ratings-2:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-2 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 input[type="radio"]:focus+label:before,.example-ratings-2 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-2 label{position:absolute;display:block;cursor:pointer}.example-ratings-2 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-2 label:hover:before{opacity:1}.example-ratings-2 label:hover~label:before{opacity:0}.example-ratings-2 .rating-8{z-index:2}.example-ratings-2 .rating-8:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-7{z-index:3}.example-ratings-2 .rating-7:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-6{z-index:4}.example-ratings-2 .rating-6:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-5{z-index:5}.example-ratings-2 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-4{z-index:6}.example-ratings-2 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-3{z-index:7}.example-ratings-2 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-2 .rating-2{z-index:8}.example-ratings-2 .rating-2:before{content:'\e605' '\e605'}.example-ratings-2 .rating-1{z-index:9}.example-ratings-2 .rating-1:before{content:'\e605'}.example-ratings-3{overflow:hidden}.example-ratings-3:before{color:#aff5e3;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-3 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 input[type="radio"]:focus+label:before,.example-ratings-3 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-3 label{position:absolute;display:block;cursor:pointer}.example-ratings-3 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 label:before{color:#0a6767;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-3 label:hover:before{opacity:1}.example-ratings-3 label:hover~label:before{opacity:0}.example-ratings-3 .rating-5{z-index:2}.example-ratings-3 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-4{z-index:3}.example-ratings-3 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-3{z-index:4}.example-ratings-3 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-3 .rating-2{z-index:5}.example-ratings-3 .rating-2:before{content:'\e605' '\e605'}.example-ratings-3 .rating-1{z-index:6}.example-ratings-3 .rating-1:before{content:'\e605'}.example-ratings-4{overflow:hidden}.example-ratings-4:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e600' '\e600' '\e600' '\e600' '\e600';position:absolute;z-index:1;display:block}.example-ratings-4 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 input[type="radio"]:focus+label:before,.example-ratings-4 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-4 label{position:absolute;display:block;cursor:pointer}.example-ratings-4 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-4 label:hover:before{opacity:1}.example-ratings-4 label:hover~label:before{opacity:0}.example-ratings-4 .rating-5{z-index:2}.example-ratings-4 .rating-5:before{content:'\e600' '\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-4{z-index:3}.example-ratings-4 .rating-4:before{content:'\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-3{z-index:4}.example-ratings-4 .rating-3:before{content:'\e600' '\e600' '\e600'}.example-ratings-4 .rating-2{z-index:5}.example-ratings-4 .rating-2:before{content:'\e600' '\e600'}.example-ratings-4 .rating-1{z-index:6}.example-ratings-4 .rating-1:before{content:'\e600'}.exapmle-ratings-5 .control.rating.vote{overflow:hidden}.exapmle-ratings-5 .control.rating.vote:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.exapmle-ratings-5 .control.rating.vote input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote input[type="radio"]:focus+label:before,.exapmle-ratings-5 .control.rating.vote input[type="radio"]:checked+label:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label{position:absolute;display:block;cursor:pointer}.exapmle-ratings-5 .control.rating.vote label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.exapmle-ratings-5 .control.rating.vote label:hover:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label:hover~label:before{opacity:0}.exapmle-ratings-5 .control.rating.vote .rating-5{z-index:2}.exapmle-ratings-5 .control.rating.vote .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-4{z-index:3}.exapmle-ratings-5 .control.rating.vote .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-3{z-index:4}.exapmle-ratings-5 .control.rating.vote .rating-3:before{content:'\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-2{z-index:5}.exapmle-ratings-5 .control.rating.vote .rating-2:before{content:'\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-1{z-index:6}.exapmle-ratings-5 .control.rating.vote .rating-1:before{content:'\e605'}.example-rating-summary-1{white-space:nowrap;overflow:hidden}.example-rating-summary-1 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-1 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-1 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-2{white-space:nowrap;overflow:hidden}.example-rating-summary-2 .rating-result{width:154px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-2 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-2 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-3{white-space:nowrap;overflow:hidden}.example-rating-summary-3 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-3 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#aff5e3;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-3 .rating-result>span:before{position:relative;z-index:2;color:#0a6767;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-4{white-space:nowrap;overflow:hidden}.example-rating-summary-4 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-4 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-4 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5{white-space:nowrap;overflow:hidden}.example-rating-summary-5 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-5 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-5 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-6 .rating-summary{white-space:nowrap;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-6 .rating-summary .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span{display:block;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7{white-space:nowrap;overflow:hidden}.example-rating-summary-7 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-7 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-7 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-responsive-block{padding:10px}.example-sections-1{position:relative;z-index:1}.example-sections-1:before,.example-sections-1:after{content:"";display:table}.example-sections-1:after{clear:both}.example-sections-1>.item.title{float:left;width:auto}.example-sections-1>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-1>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-1>.item.content:before,.example-sections-1>.item.content:after{content:"";display:table}.example-sections-1>.item.content:after{clear:both}.example-sections-1>.item.content.active{display:block}.example-sections-1>.item.title{margin:0 5px 0 0}.example-sections-1>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-1>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-1>.item.title:not(.disabled)>.switch:focus,.example-sections-1>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-1>.item.title:not(.disabled)>.switch:active,.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-1>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}.example-sections-2{position:relative;z-index:1}.example-sections-2:before,.example-sections-2:after{content:"";display:table}.example-sections-2:after{clear:both}.example-sections-2>.item.title{float:left;width:auto}.example-sections-2>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-2>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-2>.item.content:before,.example-sections-2>.item.content:after{content:"";display:table}.example-sections-2>.item.content:after{clear:both}.example-sections-2>.item.content.active{display:block}.example-sections-2>.item.title{margin:0 5px 0 0}.example-sections-2>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-2>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-2>.item.title:not(.disabled)>.switch:focus,.example-sections-2>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-2>.item.title:not(.disabled)>.switch:active,.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-2>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:0;border-top:1px solid #d1d1d1}.example-sections-3{margin:0;padding:0}.example-sections-3>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-3>.item.title>.switch{display:block}.example-sections-3>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-3>.item.content:before,.example-sections-3>.item.content:after{content:"";display:table}.example-sections-3>.item.content:after{clear:both}.example-sections-3>.item.content.active{display:block}.example-sections-3>.item.title{margin:0 0 5px}.example-sections-3>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-3>.item.title:not(.disabled)>.switch:focus,.example-sections-3>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-3>.item.title:not(.disabled)>.switch:active,.example-sections-3>.item.title.active>.switch,.example-sections-3>.item.title.active>.switch:focus,.example-sections-3>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-3>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}@media only screen and (max-width: 99999px){.example-sections-4{ position:relative;z-index:1}.example-sections-4:before,.example-sections-4:after{content:"";display:table}.example-sections-4:after{clear:both}.example-sections-4>.item.title{float:left;width:auto}.example-sections-4>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-4>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 5px 0 0}.example-sections-4>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-4>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}}@media only screen and (max-width: 768px){.example-sections-4{ margin:0;padding:0}.example-sections-4>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-4>.item.title>.switch{display:block}.example-sections-4>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 0 5px}.example-sections-4>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-4>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}}.example-sections-5{position:relative;z-index:1}.example-sections-5:before,.example-sections-5:after{content:"";display:table}.example-sections-5:after{clear:both}.example-sections-5>.item.title{float:left;width:auto}.example-sections-5>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-5>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-5>.item.content:before,.example-sections-5>.item.content:after{content:"";display:table}.example-sections-5>.item.content:after{clear:both}.example-sections-5>.item.content.active{display:block}.example-sections-6{margin:0;padding:0}.example-sections-6>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-6>.item.title>.switch{display:block}.example-sections-6>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-6>.item.content:before,.example-sections-6>.item.content:after{content:"";display:table}.example-sections-6>.item.content:after{clear:both}.example-sections-6>.item.content.active{display:block}.example-table-1{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-1 th{text-align:left}.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{vertical-align:top}.example-table-1>thead>tr>th,.example-table-1>thead>tr>td{vertical-align:bottom}.example-table-1>thead>tr>th,.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>thead>tr>td,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{padding:8px 10px}.example-table-2>thead>tr>th,.example-table-2>tbody>tr>th,.example-table-2>tfoot>tr>th{color:#111;font-weight:700}.example-table-3{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-3 th{text-align:left}.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{vertical-align:top}.example-table-3>thead>tr>th,.example-table-3>thead>tr>td{vertical-align:bottom}.example-table-3>thead>tr>th,.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>thead>tr>td,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{padding:8px 10px}.example-table-3>caption{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-table-4{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-4 th{text-align:left}.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{vertical-align:top}.example-table-4>thead>tr>th,.example-table-4>thead>tr>td{vertical-align:bottom}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:8px 10px}.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:15px 25px 5px 0}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th{padding:15px 25px 10px 0}.example-table-5{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;background:#fff}.example-table-5 th{text-align:left}.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{vertical-align:top}.example-table-5>thead>tr>th,.example-table-5>thead>tr>td{vertical-align:bottom}.example-table-5>thead>tr>th,.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>thead>tr>td,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{padding:8px 10px}.example-table-5>thead{background:#ccf}.example-table-5>tfoot{background:#cff}.example-table-5>tbody>tr>td{background:#fcc}.example-table-5>tbody>tr>th{background:#ffc}.example-table-6{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-6 th{text-align:left}.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{vertical-align:top}.example-table-6>thead>tr>th,.example-table-6>thead>tr>td{vertical-align:bottom}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{padding:8px 10px}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-7{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-7 th{text-align:left}.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{vertical-align:top}.example-table-7>thead>tr>th,.example-table-7>thead>tr>td{vertical-align:bottom}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{padding:8px 10px}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{border-top:1px solid #d1d1d1}.example-table-7>caption+thead>tr:first-child>th,.example-table-7>colgroup+thead>tr:first-child>th,.example-table-7>thead:first-child>tr:first-child>th,.example-table-7>caption+thead>tr:first-child>td,.example-table-7>colgroup+thead>tr:first-child>td,.example-table-7>thead:first-child>tr:first-child>td{border-top:0}.example-table-7>tbody+tbody{border-top:1px solid #d1d1d1}.example-table-8{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-8 th{text-align:left}.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{vertical-align:top}.example-table-8>thead>tr>th,.example-table-8>thead>tr>td{vertical-align:bottom}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{padding:8px 10px}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{border-left:1px solid #d1d1d1}.example-table-8>thead>tr>th:first-child,.example-table-8>tbody>tr>th:first-child,.example-table-8>tfoot>tr>th:first-child,.example-table-8>thead>tr>td:first-child,.example-table-8>tbody>tr>td:first-child,.example-table-8>tfoot>tr>td:first-child{border-left:0}.example-table-9{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-9 th{text-align:left}.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{vertical-align:top}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{vertical-align:bottom}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{padding:8px 10px}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{border:0}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{border-bottom:1px solid #d1d1d1}.example-table-10{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-10 th{text-align:left}.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{vertical-align:top}.example-table-10>thead>tr>th,.example-table-10>thead>tr>td{vertical-align:bottom}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{padding:8px 10px}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{border:0}.example-table-11{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-11 th{text-align:left}.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{vertical-align:top}.example-table-11>thead>tr>th,.example-table-11>thead>tr>td{vertical-align:bottom}.example-table-11>thead>tr>th,.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>thead>tr>td,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{padding:8px 10px}.example-table-11>tbody>tr:nth-child(even)>td,.example-table-11>tbody>tr:nth-child(even)>th{background:#ffc;color:#000}.example-table-12{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-12 th{text-align:left}.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{vertical-align:top}.example-table-12>thead>tr>th,.example-table-12>thead>tr>td{vertical-align:bottom}.example-table-12>thead>tr>th,.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>thead>tr>td,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{padding:8px 10px}.example-table-12>tbody>tr:nth-child(even):hover>td,.example-table-12>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-12>tbody>tr:nth-child(odd):hover>td,.example-table-12>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}.example-table-13{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-13 th{text-align:left}.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{vertical-align:top}.example-table-13>thead>tr>th,.example-table-13>thead>tr>td{vertical-align:bottom}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{padding:8px 10px}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-13>tbody>tr:nth-child(odd)>td,.example-table-13>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-13>tbody>tr:nth-child(even):hover>td,.example-table-13>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-13>tbody>tr:nth-child(odd):hover>td,.example-table-13>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-14{ width:100%;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}}.example-table-15{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-15 th{text-align:left}.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{vertical-align:top}.example-table-15>thead>tr>th,.example-table-15>thead>tr>td{vertical-align:bottom}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{padding:8px 10px}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-15{ border:0;display:block;background:#cff}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#cff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#cff}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#cff}.example-table-15>thead>tr>th{display:none}.example-table-15>tbody{display:block}.example-table-15>tbody>tr{display:block}.example-table-15>tbody>tr td,.example-table-15>tbody>tr th{border-bottom:0;display:block;padding:5px 0}.example-table-15>tbody>tr td:before,.example-table-15>tbody>tr th:before{content:attr(data-th) ":";display:inline-block;padding-right:10px;color:#111;font-weight:700}.example-table-15>tbody>tr td{background:#cff}.example-table-15>tbody>tr>th{background-color:#ffc!important}}.example-tooltip-bottom{position:relative}.example-tooltip-bottom .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;top:100%;left:0;margin-top:5px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-bottom .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-bottom .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{bottom:100%}.example-tooltip-bottom .tooltip-content:after{border-bottom-color:#fff;margin-left:-5px;left:15px}.example-tooltip-bottom .tooltip-content:before{border-bottom-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-bottom .tooltip-toggle{cursor:help}.example-tooltip-bottom .tooltip-toggle:hover+.tooltip-content,.example-tooltip-bottom .tooltip-toggle:focus+.tooltip-content,.example-tooltip-bottom:hover .tooltip-content{display:block}.example-tooltip-left{position:relative}.example-tooltip-left .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;right:100%;top:0;margin-right:5px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-left .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-left .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{left:100%}.example-tooltip-left .tooltip-content:after{border-left-color:#fff;margin-top:-5px;top:15px}.example-tooltip-left .tooltip-content:before{border-left-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-left .tooltip-toggle{cursor:help}.example-tooltip-left .tooltip-toggle:hover+.tooltip-content,.example-tooltip-left .tooltip-toggle:focus+.tooltip-content,.example-tooltip-left:hover .tooltip-content{display:block}.example-tooltip-right{position:relative}.example-tooltip-right .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;left:100%;top:0;margin-left:5px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-right .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-right .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{right:100%}.example-tooltip-right .tooltip-content:after{border-right-color:#fff;margin-top:-5px;top:15px}.example-tooltip-right .tooltip-content:before{border-right-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-right .tooltip-toggle{cursor:help}.example-tooltip-right .tooltip-toggle:hover+.tooltip-content,.example-tooltip-right .tooltip-toggle:focus+.tooltip-content,.example-tooltip-right:hover .tooltip-content{display:block}.example-tooltip-top{position:relative}.example-tooltip-top .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;bottom:100%;left:0;margin-bottom:5px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-top .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-top .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{top:100%}.example-tooltip-top .tooltip-content:after{border-top-color:#fff;margin-left:-5px;left:15px}.example-tooltip-top .tooltip-content:before{border-top-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-top .tooltip-toggle{cursor:help}.example-tooltip-top .tooltip-toggle:hover+.tooltip-content,.example-tooltip-top .tooltip-toggle:focus+.tooltip-content,.example-tooltip-top:hover .tooltip-content{display:block}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example{font-size:2.5rem}.example-line-height{line-height:3rem}.example-word-wrap{word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;background:#ccc;width:120px}.example-text-overflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:#ccc;width:120px}.example-text-hide{background-color:transparent;border:0;font:0/0 a;color:transparent;text-shadow:none}.example-hyphens{word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.example-hyphens-none{word-wrap:break-word;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.example-typography{font-size:3rem;color:#fc0;font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-weight:500;font-style:italic;line-height:1.2}.example-list-reset-styles{margin:0;padding:0;list-style:none none}.example-list-inline{margin:0;padding:0;list-style:none none}.example-list-inline>li{display:inline-block;vertical-align:top}.example-link-default{color:#1979c3;text-decoration:none}.example-link-default:visited{color:#1979c3;text-decoration:none}.example-link-default:hover{color:#006bb4;text-decoration:underline}.example-link-default:active{color:#ff5501;text-decoration:underline}.example-link{color:#008000;text-decoration:none}.example-link:visited{color:#1979c3;text-decoration:none}.example-link:hover{color:#ffa500;text-decoration:none}.example-link:active{color:#ff5501;text-decoration:underline}.example-heading{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.example-heading-2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-clearfix-container-1{border:1px solid red}.example-clearfix-container-2{border:1px solid #0f0}.example-clearfix-container-2:before,.example-clearfix-container-2:after{content:"";display:table}.example-clearfix-container-2:after{clear:both}.example-clearfix-item.left{float:left}.example-clearfix-item.right{float:right}.example-visibility-hidden{height:0;visibility:hidden}.example-visually-hidden-1{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{background:#fdf0d5;padding:5px;border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.example-css-container{padding:20px;background:#e8e8e8}.example-rotate{background:red;position:absolute;height:20px;width:40px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.example-placeholder::-webkit-input-placeholder{color:#808080;font-weight:700}.example-placeholder:-moz-placeholder{color:#808080;font-weight:700}.example-placeholder::-moz-placeholder{color:#808080;font-weight:700}.example-placeholder:-ms-input-placeholder{color:#808080;font-weight:700}.example-background-gradient-1{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #cff 0, #ccf 100%);background-image:linear-gradient(to bottom, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=0)}.example-background-gradient-2{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop( #cff 0),color-stop( #ccf 100%));background-image:linear-gradient(to right, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=1)}.example-background-gradient-3-wrapper{background:#ffc;padding:10px}.example-background-gradient-3{background-color:rgba(255,255,255,0);background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(rgba(255,255,255,0) 0),color-stop( #ccf 100%));background-image:linear-gradient(to right,rgba(255,255,255,0) 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='rgba(255, 255, 255, 0)',endColorstr='#ccccff',GradientType=1)}body{padding:15px;background-image:none}</style></head><body><nav class="bar top cf"><div class="container"><a href="index.html" class="brand">Magento UI Library</a><ul class="menu"><li><a href="#" data-toggle="dropdown-1" unselectable="on" class="dropdown-toggle">files</a><ul id="dropdown-1" hidden class="dropdown"><li><a href="actions-toolbar.html">actions-toolbar</a></li><li><a href="breadcrumbs.html">breadcrumbs</a></li><li><a href="buttons.html">buttons</a></li><li><a href="docs.html">docs</a></li><li><a href="dropdowns.html">dropdowns</a></li><li><a href="forms.html">forms</a></li><li><a href="icons.html">icons</a></li><li><a href="layout.html">layout</a></li><li><a href="lib.html">lib</a></li><li><a href="loaders.html">loaders</a></li><li><a href="messages.html">messages</a></li><li><a href="pages.html">pages</a></li><li><a href="popups.html">popups</a></li><li><a href="rating.html">rating</a></li><li><a href="resets.html">resets</a></li><li><a href="responsive.html">responsive</a></li><li><a href="sections.html">sections</a></li><li><a href="tables.html">tables</a></li><li><a href="tooltips.html">tooltips</a></li><li><a href="typography.html">typography</a></li><li><a href="utilities.html">utilities</a></li><li><a href="variables.html">variables</a></li></ul></li></ul><div class="nav"><button title="Table of Contents" data-toggle="nav-toc"><svg viewBox="0 0 512 512" height="22" width="22" class="icon"><path d="M108.9,403.1V462H50v-58.9H108.9z M108.9,285.4H50v58.9h58.9V285.4zM108.9,50H50v58.9h58.9V50z M108.9,167.7H50v58.9h58.9V167.7z M167.7,344.3H462v-58.9H167.7V344.3zM167.7,50v58.9H462V50H167.7z M167.7,462H462v-58.9H167.7V462z M167.7,226.6H462v-58.9H167.7V226.6z"></path></svg></button><input type="search" placeholder="Search" class="search"></div></div></nav><section class="container"><article id="icons" class="section"><div class="docs"><a href="#icons" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icons">Icons</h1> <p> Icons can be represented by using the fonts, images, or sprites.</p> <p> An icon can be added to any HTML tag. For this purpose you need to use additional <code><span></code> tag within your tag. This additional tag serves for displaying an icon without visible text, thus following the <strong>accessibility requirements</strong>. Then you need to apply appropriate <code>icon</code> mixin for this tag's class. Icon can be added both before and after element's text. Also, icon can be displayed instead of element's text (in this case the text is hidden).</p> <p> There are two ways to insert icon: first you can use <strong>sprite or image</strong>, second you can use <strong>an icon font</strong>. Magento UI library provides mixins for both of them.</p> @@ -21,59 +21,55 @@ <a href="#" class="example-icon-5"><span>font icon after the text</span></a> <br> <a href="#" class="example-icon-6" title="font icon instead of the text"><span>icon instead of the text</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-1 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); -} - -.example-icon-2 { - .icon-image( - @_icon-image: '@{baseDir}images/blank-theme-icons.png', - @_icon-image-position-x: -26px, - @_icon-image-position-y: 0, - @_icon-image-position: after - ); -} - -.example-icon-3 { - .icon-image( - @_icon-image: '@{baseDir}images/blank-theme-icons.png', - @_icon-image-position-x: -156px, - @_icon-image-position-y: -52px, - @_icon-image-text-hide: true - ); -} - -.example-icon-4 { - .icon-font( - @_icon-font-content: @icon-settings, - @_icon-font-size: 24px - ); -} - -.example-icon-5 { - .icon-font( - @_icon-font-content: @icon-star, - @_icon-font-size: 24px, - @_icon-font-position: after - ); -} - -.example-icon-6 { - .icon-font( - @_icon-font-content: @icon-flag, - @_icon-font-size: 24px, - @_icon-font-text-hide: true - ); -} - </code></pre></div></article><article id="icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite">Icon with image or sprite</h1> +</div><div class="code"><pre><code>.example-icon-1 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); +} + +.example-icon-2 { + .icon-image( + @_icon-image: '@{baseDir}images/blank-theme-icons.png', + @_icon-image-position-x: -26px, + @_icon-image-position-y: 0, + @_icon-image-position: after + ); +} + +.example-icon-3 { + .icon-image( + @_icon-image: '@{baseDir}images/blank-theme-icons.png', + @_icon-image-position-x: -156px, + @_icon-image-position-y: -52px, + @_icon-image-text-hide: true + ); +} + +.example-icon-4 { + .icon-font( + @_icon-font-content: @icon-settings, + @_icon-font-size: 24px + ); +} + +.example-icon-5 { + .icon-font( + @_icon-font-content: @icon-star, + @_icon-font-size: 24px, + @_icon-font-position: after + ); +} + +.example-icon-6 { + .icon-font( + @_icon-font-content: @icon-flag, + @_icon-font-size: 24px, + @_icon-font-text-hide: true + ); +}</code></pre></div></article><article id="icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite">Icon with image or sprite</h1> <p> the <code>.icon-image()</code> mixin is used to create icons using single image or sprite. It has one mandatory parameter - <code>@_icon-image</code>. This parameter accepts the path to an image or sprite.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-7"><span>icon-search</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-7 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); -} - </code></pre></div></article><article id="icon-with-image-or-sprite-variables" class="section"><div class="docs"><a href="#icon-with-image-or-sprite-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite-variables">Icon with image or sprite variables</h1> +</div><div class="code"><pre><code>.example-icon-7 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); +}</code></pre></div></article><article id="icon-with-image-or-sprite-variables" class="section"><div class="docs"><a href="#icon-with-image-or-sprite-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite-variables">Icon with image or sprite variables</h1> <pre> <table> <tr> @@ -138,28 +134,26 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="icon-position-for-an-icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-position-for-an-icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-position-for-an-icon-with-image-or-sprite">Icon position for an icon with image or sprite</h1> +</div></article><article id="icon-position-for-an-icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-position-for-an-icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-position-for-an-icon-with-image-or-sprite">Icon position for an icon with image or sprite</h1> <p> To change the position for icons with image the <code>.icon-image-position()</code> mixin is used. By managing its <code>@_icon-image-position-x</code> and <code>@_icon-image-position-y</code> variables you can move the image on element's background. The <code>@_icon-image-position</code> variable is used to define the position of icon (before or after the element).</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-8"><span>icon-star</span></a> <br> <a href="#" class="example-icon-9"><span>icon-heart</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-8 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - .icon-image-position( - @_icon-image-position-x: -182px - ); -} - -.example-icon-9 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png', @_icon-image-position: after); - .icon-image-position( - @_icon-image-position-x: -52px, - @_icon-image-position-y: -26px, - @_icon-image-position: after - ); -} - </code></pre></div></article><article id="position-for-icon-with-image-or-sprite-mixin-variables" class="section"><div class="docs"><a href="#position-for-icon-with-image-or-sprite-mixin-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="position-for-icon-with-image-or-sprite-mixin-variables">Position for icon with image or sprite mixin variables</h1> +</div><div class="code"><pre><code>.example-icon-8 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + .icon-image-position( + @_icon-image-position-x: -182px + ); +} + +.example-icon-9 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png', @_icon-image-position: after); + .icon-image-position( + @_icon-image-position-x: -52px, + @_icon-image-position-y: -26px, + @_icon-image-position: after + ); +}</code></pre></div></article><article id="position-for-icon-with-image-or-sprite-mixin-variables" class="section"><div class="docs"><a href="#position-for-icon-with-image-or-sprite-mixin-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="position-for-icon-with-image-or-sprite-mixin-variables">Position for icon with image or sprite mixin variables</h1> <pre> <table> <tr> @@ -188,15 +182,13 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="icon-sprite-position-with-grid" class="section"><div class="docs"><a href="#icon-sprite-position-with-grid" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-with-grid">Icon sprite position (with grid)</h1> +</div></article><article id="icon-sprite-position-with-grid" class="section"><div class="docs"><a href="#icon-sprite-position-with-grid" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-with-grid">Icon sprite position (with grid)</h1> <p> Mixin <code>.icon-sprite-position()</code> is used to manage the position of sprite background image. It assumes the use of a single sprite image with individual images <strong>placed on a regular grid</strong>.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-10"><span>icon text</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-10 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - .icon-sprite-position(4, 0); -} - </code></pre></div></article><article id="icon-sprite-position-variables" class="section"><div class="docs"><a href="#icon-sprite-position-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-variables">Icon sprite position variables</h1> +</div><div class="code"><pre><code>.example-icon-10 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + .icon-sprite-position(4, 0); +}</code></pre></div></article><article id="icon-sprite-position-variables" class="section"><div class="docs"><a href="#icon-sprite-position-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-variables">Icon sprite position variables</h1> <pre> <table> <tr> @@ -231,18 +223,16 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="imagesprite-icon-size" class="section"><div class="docs"><a href="#imagesprite-icon-size" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size">Image/sprite icon size</h1> +</div></article><article id="imagesprite-icon-size" class="section"><div class="docs"><a href="#imagesprite-icon-size" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size">Image/sprite icon size</h1> <p> Mixin <code>.icon-image-size()</code> is used to change the image/sprite icon size</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-11"><span>icon-search</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-11 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - .icon-image-size(30px, 30px); - &:before { - background-color: #f1f1f1; - } -} - </code></pre></div></article><article id="imagesprite-icon-size-variables" class="section"><div class="docs"><a href="#imagesprite-icon-size-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size-variables">Image/sprite icon size variables</h1> +</div><div class="code"><pre><code>.example-icon-11 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + .icon-image-size(30px, 30px); + &:before { + background-color: #f1f1f1; + } +}</code></pre></div></article><article id="imagesprite-icon-size-variables" class="section"><div class="docs"><a href="#imagesprite-icon-size-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size-variables">Image/sprite icon size variables</h1> <pre> <table> <tr> @@ -274,14 +264,12 @@ </div></article><article id="font-icon" class="section"><div class="docs"><a href="#font-icon" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="font-icon">Font icon</h1> <p> The <code>.icon-font()</code> mixin is used to create icons using font icons. It has one mandatory parameter - <code>@_icon-font-content</code>. This parameter accepts the font icon code.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-12"><span>icon-calendar</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-12 { - .icon-font( - @icon-calendar, - @_icon-font-size: 28px - ); -} - </code></pre></div></article><article id="font-icon-variables" class="section"><div class="docs"><a href="#font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="font-icon-variables">Font icon variables</h1> +</div><div class="code"><pre><code>.example-icon-12 { + .icon-font( + @icon-calendar, + @_icon-font-size: 28px + ); +}</code></pre></div></article><article id="font-icon-variables" class="section"><div class="docs"><a href="#font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="font-icon-variables">Font icon variables</h1> <pre> <table> <tr> @@ -364,17 +352,15 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="change-the-size-of-font-icon" class="section"><div class="docs"><a href="#change-the-size-of-font-icon" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon">Change the size of font icon</h1> +</div></article><article id="change-the-size-of-font-icon" class="section"><div class="docs"><a href="#change-the-size-of-font-icon" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon">Change the size of font icon</h1> <p> The <code>.icon-font-size()</code> mixin is used to change size of the font icon which is already defined. The mixin generates only new font size and line height without any other options. @_icon-font-position variable is used to define the position of icon (before or after the element) which we want to set font size of.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-13"><span>icon-calendar</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-13 { - .icon-font(@icon-calendar); - .icon-font-size( - @_icon-font-size: 26px - ); -} - </code></pre></div></article><article id="change-the-size-of-font-icon-variables" class="section"><div class="docs"><a href="#change-the-size-of-font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon-variables">Change the size of font icon variables</h1> +</div><div class="code"><pre><code>.example-icon-13 { + .icon-font(@icon-calendar); + .icon-font-size( + @_icon-font-size: 26px + ); +}</code></pre></div></article><article id="change-the-size-of-font-icon-variables" class="section"><div class="docs"><a href="#change-the-size-of-font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon-variables">Change the size of font icon variables</h1> <pre> <table> <tr> @@ -406,15 +392,13 @@ </div></article><article id="hide-icon-text" class="section"><div class="docs"><a href="#hide-icon-text" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="hide-icon-text">Hide icon text</h1> <p> The <code>.icon-text-hide()</code> mixin can be used separately to hide text of an element that has an icon text. This mixin accepts no variables.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-14"><span>icon-calendar</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-14 { - .icon-font( - @icon-envelope, - @_icon-font-size: 26px - ); - .icon-text-hide(); -} - </code></pre></div></article><article id="sprite-and-font-icons-for-blank-theme" class="section"><div class="docs"><a href="#sprite-and-font-icons-for-blank-theme" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="sprite-and-font-icons-for-blank-theme">Sprite and font icons for Blank theme</h1> +</div><div class="code"><pre><code>.example-icon-14 { + .icon-font( + @icon-envelope, + @_icon-font-size: 26px + ); + .icon-text-hide(); +}</code></pre></div></article><article id="sprite-and-font-icons-for-blank-theme" class="section"><div class="docs"><a href="#sprite-and-font-icons-for-blank-theme" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="sprite-and-font-icons-for-blank-theme">Sprite and font icons for Blank theme</h1> <p> You can use the icons designed to our Blank theme, which are also available in two variants: sprite and font</p> <h2 id="icons-using-sprite">Icons using sprite</h2> <textarea class="preview-code" spellcheck="false"> <ul class="icons-image-list"> @@ -642,180 +626,185 @@ <li> <span class="icon-arrow-down-thin" data-icon=""><span>@icon-arrow-down-thin</span></span> </li> + <li> + <span class="icon-arrow-left-thin" data-icon=""><span>@icon-gift-registry</span></span> + </li> + <li> + <span class="icon-arrow-down-thin" data-icon=""><span>@icon-present</span></span> + </li> </ul></textarea> -</div><div class="code"><pre><code> -.icons-image-list { - list-style: none; - padding: 0; - li { - float: left; - width: 33%; - > span { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - } - .icon-search { - .icon-sprite-position(0, 0); - } - .icon-cart { - .icon-sprite-position(1, 0); - } - .icon-arrow-down { - .icon-sprite-position(2, 0); - } - .icon-arrow-up { - .icon-sprite-position(3, 0); - } - .icon-grid { - .icon-sprite-position(4, 0); - } - .icon-list { - .icon-sprite-position(5, 0); - } - .icon-remove { - .icon-sprite-position(6, 0); - } - .icon-star { - .icon-sprite-position(7, 0); - } - .icon-pointer-down { - .icon-sprite-position(8, 0); - } - .icon-pointer-up { - .icon-sprite-position(9, 0); - } - .icon-pointer-left { - .icon-sprite-position(10, 0); - } - .icon-pointer-right { - .icon-sprite-position(11, 0); - } - .icon-compare-empty { - .icon-sprite-position(0, 1); - } - .icon-compare-full { - .icon-sprite-position(1, 1); - } - .icon-wishlist-empty { - .icon-sprite-position(2, 1); - } - .icon-wishlist-full { - .icon-sprite-position(3, 1); - } - .icon-update { - .icon-sprite-position(4, 1); - } - .icon-collapse { - .icon-sprite-position(5, 1); - } - .icon-expand { - .icon-sprite-position(6, 1); - } - .icon-menu { - .icon-sprite-position(7, 1); - } - .icon-prev { - .icon-sprite-position(8, 1); - } - .icon-next { - .icon-sprite-position(9, 1); - } - .icon-settings { - .icon-sprite-position(10, 1); - } - .icon-info { - .icon-sprite-position(11, 1); - } - .icon-checkmark { - .icon-sprite-position(0, 2); - } - .icon-calendar { - .icon-sprite-position(1, 2); - } - .icon-comment { - .icon-sprite-position(2, 2); - } - .icon-comment-reflected { - .icon-sprite-position(3, 2); - } - .icon-envelope { - .icon-sprite-position(4, 2); - } - .icon-warning { - .icon-sprite-position(5, 2); - } - .icon-trash { - .icon-sprite-position(6, 2); - } - .icon-flag { - .icon-sprite-position(7, 2); - } - .icon-location { - .icon-sprite-position(8, 2); - } - .icon-up { - .icon-sprite-position(9, 2); - } - .icon-down { - .icon-sprite-position(10, 2); - } - } -} - -@icon-wishlist-full: '\e600'; -@icon-wishlist-empty: '\e601'; -@icon-warning: '\e602'; -@icon-update: '\e603'; -@icon-trash: '\e604'; -@icon-star: '\e605'; -@icon-settings: '\e606'; -@icon-pointer-down: '\e607'; -@icon-next: '\e608'; -@icon-menu: '\e609'; -@icon-location: '\e60a'; -@icon-list: '\e60b'; -@icon-info: '\e60c'; -@icon-grid: '\e60d'; -@icon-comment-reflected: '\e60e'; -@icon-collapse: '\e60f'; -@icon-checkmark: '\e610'; -@icon-cart: '\e611'; -@icon-calendar: '\e612'; -@icon-arrow-up: '\e613'; -@icon-arrow-down: '\e614'; -@icon-search: '\e615'; -@icon-remove: '\e616'; -@icon-prev: '\e617'; -@icon-pointer-up: '\e618'; -@icon-pointer-right: '\e619'; -@icon-pointer-left: '\e61a'; -@icon-flag: '\e61b'; -@icon-expand: '\e61c'; -@icon-envelope: '\e61d'; -@icon-compare-full: '\e61e'; -@icon-compare-empty: '\e61f'; -@icon-comment: '\e620'; -@icon-up: '\e621'; -@icon-down: '\e622'; -@icon-arrow-up-thin: '\e623'; -@icon-arrow-right-thin: '\e624'; -@icon-arrow-left-thin: '\e625'; -@icon-arrow-down-thin: '\e626'; - -.icons-font-list { - list-style: none; - padding: 0; - li { - float: left; - width: 25%; - margin-bottom: 35px; - text-align: center; - > span { - .icon-font('', @_icon-font-size: 34px); - &:before { - content: attr(data-icon); - margin: 0 auto; - display: block; - } - } - } -} </code></pre></div></article></section><div class="bar bottom"><div hidden class="settings container"><!-- Icons from http://iconmonstr.com--><button title="Desktop (1280)" data-width='1280'><svg viewBox="0 0 412 386" height="24" width="26" class="icon"><path d="m147.6,343.9c-4.5,15.9-26.2,37.6-42.1,42.1h201c-15.3,-4-38.1,-26.8-42.1,-42.1H147.6zM387,0.5H25c-13.8,0-25,11.2-25,25V294c0,13.8 11.2,25 25,25h362c13.8,0 25,-11.2 25,-25V25.5C412,11.7 400.8,0.5 387,0.5zM369.9,238.2H42.1L42.1,42.6 369.9,42.6V238.2z"></path></svg></button><button title="Laptop (1024)" data-width='1024'><svg viewBox="0 0 384 312" height="23" width="28" class="icon"><path d="m349.2,20.5c0,-11-9,-20-20,-20H53.6c-11,0-20,9-20,20v194H349.2v-194zm-27,167H60.6V27.5H322.2v160zm28,42H32.6L2.6,282.1c-3.5,6.2-3.5,13.8 0.1,19.9 3.6,6.2 10.2,9.9 17.3,9.9H363.1c7.1,0 13.7,-3.8 17.3,-10 3.6,-6.2 3.6,-13.8 0,-20l-30.2,-52.5zm-196.9,54 8,-23.5h60.5l8,23.5h-76.5z"></path></svg></button><button title="Tablet (768)" data-width='768'><svg viewBox="0 0 317 412" height="24" width="18" class="icon"><path d="M 316.5,380 V 32 c 0,-17.7 -14.3,-32 -32,-32 H 32 C 14.3,0 0,14.3 0,32 v 348 c 0,17.7 14.3,32 32,32 h 252.5 c 17.7,0 32,-14.3 32,-32 z M 40,367 V 45 H 276.5 V 367 H 40 z m 109.8,22.7 c 0,-4.7 3.8,-8.5 8.5,-8.5 4.7,0 8.5,3.8 8.5,8.5 0,4.7 -3.8,8.5 -8.5,8.5 -4.7,0 -8.5,-3.8 -8.5,-8.5 z"></path></svg></button><button title="Smart phone (320)" data-width='320'><svg viewBox="0 0 224 412" height="24" width="13" class="icon"><path d="M 190.7,0 H 33 C 14.8,0 0,14.8 0,33 v 346 c 0,18.2 14.8,33 33,33 h 157.7 c 18.2,0 33,-14.8 33,-33 V 33 c 0,-18.2 -14.8,-33 -33,-33 z M 94.3,30.2 h 37 c 2.2,0 4,1.8 4,4 0,2.2 -1.8,4 -4,4 h -37 c -2.2,0 -4,-1.8 -4,-4 0,-2.2 1.8,-4 4,-4 z m 18.5,362.8 c -8.8,0 -16,-7.2 -16,-16 0,-8.8 7.2,-16 16,-16 8.8,0 16,7.2 16,16 0,8.8 -7.2,16 -16,16 z M 198.6,343.8 H 25.1 V 68.2 h 173.5 v 275.5 z"></path></svg></button><button title="Feature phone (240)" data-width='240'><svg viewBox="0 0 201 412" height="24" width="12" class="icon"><path d="M 165.5,0.2 V 45 H 25 c -13.8,0 -25,11.2 -25,25 V 387 c 0,13.8 11.2,25 25,25 h 150.5 c 13.8,0 25,-11.2 25,-25 V 0.2 h -35 z M 65.2,366.5 H 34.2 v -24.5 h 31 v 24.5 z m 0,-44.3 H 34.2 v -24.5 h 31 v 24.5 z m 50.5,44.3 H 84.7 v -24.5 h 31 v 24.5 z m 0,-44.3 H 84.7 v -24.5 h 31 v 24.5 z m 50.5,44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-59.3 h -132 V 95.4 h 132 V 262.9 z"></path></svg></button><button title="Auto (100%)" data-width="auto" class="auto is-active">Auto</button></div></div><script>(function(){var a=[{title:"actions-toolbar",filename:"actions-toolbar",url:"actions-toolbar.html"},{title:"Actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar"},{title:"Actions toolbar mixin variables",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-mixin-variables"},{title:"Actions toolbar alignment",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-alignment"},{title:"Reverse primary and secondary blocks",filename:"actions-toolbar",url:"actions-toolbar.html#reverse-primary-and-secondary-blocks"},{title:"Actions toolbar indents customizations",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-indents-customizations"},{title:"Responsive actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#responsive-actions-toolbar"},{title:"breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html"},{title:"Breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs"},{title:"Breadcrumbs variables",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-variables"},{title:"Button-styled breadcrumbs with gradient background, border, and no separating symbol",filename:"breadcrumbs",url:"breadcrumbs.html#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol"},{title:"Breadcrumbs with solid background",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-with-solid-background"},{title:"buttons",filename:"buttons",url:"buttons.html"},{title:"Default button",filename:"buttons",url:"buttons.html#default-button"},{title:"Button variables",filename:"buttons",url:"buttons.html#button-variables"},{title:"Button as an icon",filename:"buttons",url:"buttons.html#button-as-an-icon"},{title:"Button with an icon on the left or right side of the text",filename:"buttons",url:"buttons.html#button-with-an-icon-on-the-left-or-right-side-of-the-text"},{title:"Button with fixed width",filename:"buttons",url:"buttons.html#button-with-fixed-width"},{title:"Primary button",filename:"buttons",url:"buttons.html#primary-button"},{title:"Primary button variables",filename:"buttons",url:"buttons.html#primary-button-variables"},{title:"Button with gradient background",filename:"buttons",url:"buttons.html#button-with-gradient-background"},{title:"Button as a link",filename:"buttons",url:"buttons.html#button-as-a-link"},{title:"Link as a button",filename:"buttons",url:"buttons.html#link-as-a-button"},{title:"Button reset",filename:"buttons",url:"buttons.html#button-reset"},{title:"Button revert secondary color",filename:"buttons",url:"buttons.html#button-revert-secondary-color"},{title:"Button revert secondary color variables",filename:"buttons",url:"buttons.html#button-revert-secondary-color-variables"},{title:"Button revert secondary size",filename:"buttons",url:"buttons.html#button-revert-secondary-size"},{title:"Button revert secondary size variables",filename:"buttons",url:"buttons.html#button-revert-secondary-size-variables"},{title:"docs",filename:"docs",url:"docs.html"},{title:"Documentation",filename:"docs",url:"docs.html#documentation"},{title:"dropdowns",filename:"dropdowns",url:"dropdowns.html"},{title:"Drop-down and split buttons mixins",filename:"dropdowns",url:"dropdowns.html#dropdown-and-split-buttons-mixins"},{title:"Drop-down",filename:"dropdowns",url:"dropdowns.html#dropdown"},{title:"Drop-down variables",filename:"dropdowns",url:"dropdowns.html#dropdown-variables"},{title:"Drop-down with icon customization",filename:"dropdowns",url:"dropdowns.html#dropdown-with-icon-customization"},{title:"Modify dropdown list styles",filename:"dropdowns",url:"dropdowns.html#modify-dropdown-list-styles"},{title:"Split button",filename:"dropdowns",url:"dropdowns.html#split-button"},{title:"Split button variables",filename:"dropdowns",url:"dropdowns.html#split-button-variables"},{title:"Split button - button styling",filename:"dropdowns",url:"dropdowns.html#split-button-button-styling"},{title:"Split button icon customization",filename:"dropdowns",url:"dropdowns.html#split-button-icon-customization"},{title:"Split button drop-down list customization",filename:"dropdowns",url:"dropdowns.html#split-button-dropdown-list-customization"},{title:"forms",filename:"forms",url:"forms.html"},{title:"Forms mixins",filename:"forms",url:"forms.html#forms-mixins"},{title:"Global forms elements customization",filename:"forms",url:"forms.html#global-forms-elements-customization"},{title:"Fieldsets & fields customization",filename:"forms",url:"forms.html#fieldsets-fields-customization"},{title:"Fieldset and legend customization variables",filename:"forms",url:"forms.html#fieldset-and-legend-customization-variables"},{title:"Fields customization variables",filename:"forms",url:"forms.html#fields-customization-variables"},{title:"Required fields message customization variables",filename:"forms",url:"forms.html#required-fields-message-customization-variables"},{title:"Form element inputs customization",filename:"forms",url:"forms.html#form-element-inputs-customization"},{title:"Form element inputs customization variables",filename:"forms",url:"forms.html#form-element-inputs-customization-variables"},{title:"Form element choice",filename:"forms",url:"forms.html#form-element-choice"},{title:"Form element choice variables",filename:"forms",url:"forms.html#form-element-choice-variables"},{title:"Custom color",filename:"forms",url:"forms.html#custom-color"},{title:"Input number - input-text view",filename:"forms",url:"forms.html#input-number-inputtext-view"},{title:"Input search - input-text view",filename:"forms",url:"forms.html#input-search-inputtext-view"},{title:"Form validation",filename:"forms",url:"forms.html#form-validation"},{title:"Form validation variables// <pre>",filename:"forms",url:"forms.html#form-validation-variables-pre"},{title:"icons",filename:"icons",url:"icons.html"},{title:"Icons",filename:"icons",url:"icons.html#icons"},{title:"Icon with image or sprite",filename:"icons",url:"icons.html#icon-with-image-or-sprite"},{title:"Icon with image or sprite variables",filename:"icons",url:"icons.html#icon-with-image-or-sprite-variables"},{title:"Icon position for an icon with image or sprite",filename:"icons",url:"icons.html#icon-position-for-an-icon-with-image-or-sprite"},{title:"Position for icon with image or sprite mixin variables",filename:"icons",url:"icons.html#position-for-icon-with-image-or-sprite-mixin-variables"},{title:"Icon sprite position (with grid)",filename:"icons",url:"icons.html#icon-sprite-position-with-grid"},{title:"Icon sprite position variables",filename:"icons",url:"icons.html#icon-sprite-position-variables"},{title:"Image/sprite icon size",filename:"icons",url:"icons.html#imagesprite-icon-size"},{title:"Image/sprite icon size variables",filename:"icons",url:"icons.html#imagesprite-icon-size-variables"},{title:"Font icon",filename:"icons",url:"icons.html#font-icon"},{title:"Font icon variables",filename:"icons",url:"icons.html#font-icon-variables"},{title:"Change the size of font icon",filename:"icons",url:"icons.html#change-the-size-of-font-icon"},{title:"Change the size of font icon variables",filename:"icons",url:"icons.html#change-the-size-of-font-icon-variables"},{title:"Hide icon text",filename:"icons",url:"icons.html#hide-icon-text"},{title:"Sprite and font icons for Blank theme",filename:"icons",url:"icons.html#sprite-and-font-icons-for-blank-theme"},{title:"layout",filename:"layout",url:"layout.html"},{title:"Layout",filename:"layout",url:"layout.html#layout"},{title:"Layout global variables",filename:"layout",url:"layout.html#layout-global-variables"},{title:"Page layouts",filename:"layout",url:"layout.html#page-layouts"},{title:"Layout column",filename:"layout",url:"layout.html#layout-column"},{title:"Layout column variables",filename:"layout",url:"layout.html#layout-column-variables"},{title:"Layout width",filename:"layout",url:"layout.html#layout-width"},{title:"Layout width variables",filename:"layout",url:"layout.html#layout-width-variables"},{title:"lib",filename:"lib",url:"lib.html"},{title:"Including Magento UI library to your theme",filename:"lib",url:"lib.html#including-magento-ui-library-to-your-theme"},{title:"loaders",filename:"loaders",url:"loaders.html"},{title:"Loaders",filename:"loaders",url:"loaders.html#loaders"},{title:"Default loader variables",filename:"loaders",url:"loaders.html#default-loader-variables"},{title:"Loading",filename:"loaders",url:"loaders.html#loading"},{title:"Loading default variables",filename:"loaders",url:"loaders.html#loading-default-variables"},{title:"messages",filename:"messages",url:"messages.html"},{title:"Messages",filename:"messages",url:"messages.html#messages"},{title:"Information message",filename:"messages",url:"messages.html#information-message"},{title:"Warning message",filename:"messages",url:"messages.html#warning-message"},{title:"Error message",filename:"messages",url:"messages.html#error-message"},{title:"Success message",filename:"messages",url:"messages.html#success-message"},{title:"Notice message",filename:"messages",url:"messages.html#notice-message"},{title:"Message with inner icon",filename:"messages",url:"messages.html#message-with-inner-icon"},{title:"Message with lateral icon",filename:"messages",url:"messages.html#message-with-lateral-icon"},{title:"Custom message style",filename:"messages",url:"messages.html#custom-message-style"},{title:"Messages global variables",filename:"messages",url:"messages.html#messages-global-variables"},{title:"pages",filename:"pages",url:"pages.html"},{title:"Pagination HTML markup",filename:"pages",url:"pages.html#pagination-html-markup"},{title:"Pagination variables",filename:"pages",url:"pages.html#pagination-variables"},{title:"Pagination with label and gradient background on links",filename:"pages",url:"pages.html#pagination-with-label-and-gradient-background-on-links"},{title:'Pagination with "previous"..."next" text links and label',filename:"pages",url:"pages.html#pagination-with-previousnext-text-links-and-label"},{title:"Pagination without label, with solid background",filename:"pages",url:"pages.html#pagination-without-label-with-solid-background"},{title:"popups",filename:"popups",url:"popups.html"},{title:"Popups",filename:"popups",url:"popups.html#popups"},{title:"Popup variables",filename:"popups",url:"popups.html#popup-variables"},{title:"Window overlay mixin variables",filename:"popups",url:"popups.html#window-overlay-mixin-variables"},{title:"Fixed height popup",filename:"popups",url:"popups.html#fixed-height-popup"},{title:"Fixed content height popup",filename:"popups",url:"popups.html#fixed-content-height-popup"},{title:"Margins for header, content and footer block in popup",filename:"popups",url:"popups.html#margins-for-header-content-and-footer-block-in-popup"},{title:"Popup titles styled as theme headings",filename:"popups",url:"popups.html#popup-titles-styled-as-theme-headings"},{title:"Popup action toolbar",filename:"popups",url:"popups.html#popup-action-toolbar"},{title:"Popup Close button without an icon",filename:"popups",url:"popups.html#popup-close-button-without-an-icon"},{title:"Modify the icon of popup Close button",filename:"popups",url:"popups.html#modify-the-icon-of-popup-close-button"},{title:"Modify overlay styles",filename:"popups",url:"popups.html#modify-overlay-styles"},{title:"rating",filename:"rating",url:"rating.html"},{title:"Ratings",filename:"rating",url:"rating.html#ratings"},{title:"Global rating variables",filename:"rating",url:"rating.html#global-rating-variables"},{title:"Rating with vote",filename:"rating",url:"rating.html#rating-with-vote"},{title:"Rating with vote icons number customization",filename:"rating",url:"rating.html#rating-with-vote-icons-number-customization"},{title:"Rating with vote icons colors customization",filename:"rating",url:"rating.html#rating-with-vote-icons-colors-customization"},{title:"Rating with vote icons symbol customization",filename:"rating",url:"rating.html#rating-with-vote-icons-symbol-customization"},{title:"Accessible rating with vote",filename:"rating",url:"rating.html#accessible-rating-with-vote"},{title:"Rating summary",filename:"rating",url:"rating.html#rating-summary"},{title:"Rating summary icons number customization",filename:"rating",url:"rating.html#rating-summary-icons-number-customization"},{title:"Rating summary icons color customization",filename:"rating",url:"rating.html#rating-summary-icons-color-customization"},{title:"Rating summary icons symbol customization",filename:"rating",url:"rating.html#rating-summary-icons-symbol-customization"},{title:"Rating summary hide label",filename:"rating",url:"rating.html#rating-summary-hide-label"},{title:"Rating summary multiple ratings",filename:"rating",url:"rating.html#rating-summary-multiple-ratings"},{title:"Rating hide label mixin",filename:"rating",url:"rating.html#rating-hide-label-mixin"},{title:"resets",filename:"resets",url:"resets.html"},{title:"Resets",filename:"resets",url:"resets.html#resets"},{title:"responsive",filename:"responsive",url:"responsive.html"},{title:"Responsive",filename:"responsive",url:"responsive.html#responsive"},{title:"Responsive mixins usage",filename:"responsive",url:"responsive.html#responsive-mixins-usage"},{title:"Media query style groups separation variables",filename:"responsive",url:"responsive.html#media-query-style-groups-separation-variables"},{title:"Responsive breakpoints",filename:"responsive",url:"responsive.html#responsive-breakpoints"},{title:"sections",filename:"sections",url:"sections.html"},{title:"Tabs and accordions",filename:"sections",url:"sections.html#tabs-and-accordions"},{title:"Tabs",filename:"sections",url:"sections.html#tabs"},{title:"Tabs mixin variables",filename:"sections",url:"sections.html#tabs-mixin-variables"},{title:"Tabs with content top border",filename:"sections",url:"sections.html#tabs-with-content-top-border"},{title:"Accordion",filename:"sections",url:"sections.html#accordion"},{title:"Accordion mixin variables",filename:"sections",url:"sections.html#accordion-mixin-variables"},{title:"Responsive tabs",filename:"sections",url:"sections.html#responsive-tabs"},{title:"Tabs Base",filename:"sections",url:"sections.html#tabs-base"},{title:"Accordion Base",filename:"sections",url:"sections.html#accordion-base"},{title:"tables",filename:"tables",url:"tables.html"},{title:"Tables",filename:"tables",url:"tables.html#tables"},{title:"Table mixin variables",filename:"tables",url:"tables.html#table-mixin-variables"},{title:"Table typography",filename:"tables",url:"tables.html#table-typography"},{title:"Table typography mixin variables",filename:"tables",url:"tables.html#table-typography-mixin-variables"},{title:"Table caption",filename:"tables",url:"tables.html#table-caption"},{title:"Table caption mixin variables",filename:"tables",url:"tables.html#table-caption-mixin-variables"},{title:"Table cells resize",filename:"tables",url:"tables.html#table-cells-resize"},{title:"Table cells resize variables",filename:"tables",url:"tables.html#table-cells-resize-variables"},{title:"Table background customization",filename:"tables",url:"tables.html#table-background-customization"},{title:"Table background mixin variables",filename:"tables",url:"tables.html#table-background-mixin-variables"},{title:"Table borders customization",filename:"tables",url:"tables.html#table-borders-customization"},{title:"Table borders mixin variables",filename:"tables",url:"tables.html#table-borders-mixin-variables"},{title:"Table with horizontal borders",filename:"tables",url:"tables.html#table-with-horizontal-borders"},{title:"Table with vertical borders",filename:"tables",url:"tables.html#table-with-vertical-borders"},{title:"Table with light borders",filename:"tables",url:"tables.html#table-with-light-borders"},{title:"Table without borders",filename:"tables",url:"tables.html#table-without-borders"},{title:"Striped table",filename:"tables",url:"tables.html#striped-table"},{title:"Striped table mixin variables",filename:"tables",url:"tables.html#striped-table-mixin-variables"},{title:"Table with rows hover",filename:"tables",url:"tables.html#table-with-rows-hover"},{title:"Table with rows hover mixin variables",filename:"tables",url:"tables.html#table-with-rows-hover-mixin-variables"},{title:"Responsive table technics #1",filename:"tables",url:"tables.html#responsive-table-technics-1"},{title:"Responsive table technics #2",filename:"tables",url:"tables.html#responsive-table-technics-2"},{title:"Responsive table technics #2 mixin variables",filename:"tables",url:"tables.html#responsive-table-technics-2-mixin-variables"},{title:"tooltips",filename:"tooltips",url:"tooltips.html"},{title:"Tooltips",filename:"tooltips",url:"tooltips.html#tooltips"},{title:"Tooltips variables",filename:"tooltips",url:"tooltips.html#tooltips-variables"},{title:"typography",filename:"typography",url:"typography.html"},{title:"Typogrphy",filename:"typography",url:"typography.html#typogrphy"},{title:"Typography variables",filename:"typography",url:"typography.html#typography-variables"},{title:"Font-size mixin",filename:"typography",url:"typography.html#fontsize-mixin"},{title:"Line-height mixin",filename:"typography",url:"typography.html#lineheight-mixin"},{title:"Word breaking mixin",filename:"typography",url:"typography.html#word-breaking-mixin"},{title:"Font face mixin",filename:"typography",url:"typography.html#font-face-mixin"},{title:"Text overflow mixin",filename:"typography",url:"typography.html#text-overflow-mixin"},{title:"Text hide",filename:"typography",url:"typography.html#text-hide"},{title:"Hyphens",filename:"typography",url:"typography.html#hyphens"},{title:"Font style and color",filename:"typography",url:"typography.html#font-style-and-color"},{title:"Font style mixin variables",filename:"typography",url:"typography.html#font-style-mixin-variables"},{title:"Reset list styles",filename:"typography",url:"typography.html#reset-list-styles"},{title:"Reset list styles variables",filename:"typography",url:"typography.html#reset-list-styles-variables"},{title:"Inline-block list item styling",filename:"typography",url:"typography.html#inlineblock-list-item-styling"},{title:"Link styling mixin",filename:"typography",url:"typography.html#link-styling-mixin"},{title:"Link styling mixin variables",filename:"typography",url:"typography.html#link-styling-mixin-variables"},{title:"Heading styling mixin",filename:"typography",url:"typography.html#heading-styling-mixin"},{title:"Base typography mixins",filename:"typography",url:"typography.html#base-typography-mixins"},{title:"Headings typography mixin",filename:"typography",url:"typography.html#headings-typography-mixin"},{title:"Typography links mixin",filename:"typography",url:"typography.html#typography-links-mixin"},{title:"Typography lists mixin",filename:"typography",url:"typography.html#typography-lists-mixin"},{title:"Typography code elements mixin",filename:"typography",url:"typography.html#typography-code-elements-mixin"},{title:"Typography blockquote",filename:"typography",url:"typography.html#typography-blockquote"},{title:"utilities",filename:"utilities",url:"utilities.html"},{title:"Utilities",filename:"utilities",url:"utilities.html#utilities"},{title:".clearfix()",filename:"utilities",url:"utilities.html#clearfix"},{title:".visibility-hidden()",filename:"utilities",url:"utilities.html#visibilityhidden"},{title:".visually-hidden()",filename:"utilities",url:"utilities.html#visuallyhidden"},{title:".visually-hidden-reset()",filename:"utilities",url:"utilities.html#visuallyhiddenreset"},{title:".css()",filename:"utilities",url:"utilities.html#css"},{title:".css() variables",filename:"utilities",url:"utilities.html#css-variables"},{title:".rotate()",filename:"utilities",url:"utilities.html#rotate"},{title:".rotate() variables",filename:"utilities",url:"utilities.html#rotate-variables"},{title:".input-placeholder()",filename:"utilities",url:"utilities.html#inputplaceholder"},{title:".input-placeholder() variables",filename:"utilities",url:"utilities.html#inputplaceholder-variables"},{title:".background-gradient()",filename:"utilities",url:"utilities.html#backgroundgradient"},{title:".background-gradient() variables",filename:"utilities",url:"utilities.html#backgroundgradient-variables"},{title:"variables",filename:"variables",url:"variables.html"},{title:"List of Global Variables",filename:"variables",url:"variables.html#list-of-global-variables"},{title:"Table with rows hover mixin variables",filename:"variables",url:"variables.html#table-with-rows-hover-mixin-variables"}];(function(){"use strict";var b=function(a,b){return Array.prototype.indexOf.call(a,b)!==-1},c=function(a,b){return Array.prototype.filter.call(a,b)},d=function(a,b){return Array.prototype.forEach.call(a,b)},e=document.getElementsByTagName("body")[0];e.addEventListener("click",function(a){var b=a.target;b.tagName.toLowerCase()==="svg"&&(b=b.parentNode);var c=!1;b.dataset.toggle!=null&&(a.preventDefault(),b.classList.contains("is-active")||(c=!0)),d(e.querySelectorAll("[data-toggle]"),function(a){a.classList.remove("is-active"),document.getElementById(a.dataset.toggle).hidden=!0}),c&&(b.classList.add("is-active"),document.getElementById(b.dataset.toggle).hidden=!1)}),function(){var f=e.getElementsByClassName("nav")[0];if(!f)return;var g=document.createElement("ul");g.className="nav-results",g.id="nav-search",g.hidden=!0,d(a,function(a){var b,c,d;b=document.createElement("li"),b._title=a.title.toLowerCase(),b.hidden=!0,b.appendChild(c=document.createElement("a")),c.href=a.url,c.innerHTML=a.title,c.appendChild(d=document.createElement("span")),d.innerHTML=a.filename,d.className="nav-results-filename",g.appendChild(b)}),f.appendChild(g);var h=g.children,i=function(a){d(h,function(a){a.hidden=!0});var b=this.value.toLowerCase(),e=[];b!==""&&(e=c(h,function(a){return a._title.indexOf(b)!==-1})),e.length>0?(d(e,function(a){a.hidden=!1}),g.hidden=!1):g.hidden=!0},j=f.querySelector('input[type="search"]');j.addEventListener("keyup",i),j.addEventListener("focus",i),e.addEventListener("click",function(a){if(a.target.classList&&a.target.classList.contains("search"))return;g.hidden=!0}),g.addEventListener("click",function(a){j.value=""});var k=document.createElement("ul");k.id="nav-toc",k.hidden=!0,k.className="nav-results toc-list",c(e.getElementsByTagName("*"),function(a){return b(["h1","h2","h3"],a.tagName.toLowerCase())}).map(function(a){var b=document.createElement("li"),c=document.createElement("a"),d=a.tagName.toLowerCase()[1];c.classList.add("level-"+d),b.appendChild(c),c.href="#"+a.id,c.innerHTML=a.innerHTML,k.appendChild(b)}),f.appendChild(k)}()})(),function(){"use strict";if(location.hash==="#__preview__"||location.protocol==="data:")return;var a=function(a,b){return Array.prototype.forEach.call(a,b)},b=function(a,b){var e=Array.prototype.slice.call(arguments,2);return d(a,function(a){return(c(b)?b||a:a[b]).apply(a,e)})},c=function(a){return Object.prototype.toString.call(a)==="[object Function]"},d=function(a,b){return Array.prototype.map.call(a,b)},e=function(a,b){return d(a,function(a){return a[b]})},f=function(a){var b={},c=a.split(";");for(var d=0;c.length>d;d++){var e=c[d].trim().split("=");b[e[0]]=e[1]}return b},g=function(a,c){return b(e(a,"classList"),"remove",c)},h=function(a,b){a.contentDocument.defaultView.postMessage(b,"*")},i=document.getElementsByTagName("head")[0],j=document.getElementsByTagName("body")[0],k=e(i.querySelectorAll('style[type="text/preview"]'),"innerHTML").join(""),l=e(i.querySelectorAll('script[type="text/preview"]'),"innerHTML").join(""),m=location.href.split("#")[0]+"#__preview__",n=document.createElement("iframe");n.src="data:text/html,",j.appendChild(n),n.addEventListener("load",function(){var b={sameOriginDataUri:!0};try{this.contentDocument,this.contentDocument||(b.sameOriginDataUri=!1)}catch(c){b.sameOriginDataUri=!1}this.parentNode.removeChild(this),a(j.getElementsByTagName("textarea"),function(a,c){o(a,b,c),q(),p(a)})});var o=function(a,b,c){var d,e,f;d=document.createElement("div"),d.appendChild(e=document.createElement("div")),d.className="preview",e.appendChild(f=document.createElement("iframe")),e.className="resizeable",f.setAttribute("scrolling","no"),f.name="iframe"+c++,f.addEventListener("load",function(){var c,d,e,f,g,i,j;j=this.contentDocument;if(!b.sameOriginDataUri&&this.src!==m)return;this.src===m&&(c=j.createElement("html"),c.appendChild(j.createElement("head")),c.appendChild(d=j.createElement("body")),d.innerHTML=a.textContent,j.replaceChild(c,j.documentElement)),g=j.createElement("head"),g.appendChild(f=j.createElement("style")),g.appendChild(e=j.createElement("script")),e.textContent=l,f.textContent=k,i=j.getElementsByTagName("head")[0],i.parentNode.replaceChild(g,i),h(this,"getHeight")});var g;b.sameOriginDataUri?g="data:text/html;charset=utf-8,"+encodeURIComponent("<!doctype html><html><head></head></body>"+a.textContent):g=m,f.setAttribute("src",g);var i=function(){f.contentDocument.body.innerHTML=this.value,h(f,"getHeight")};a.addEventListener("keypress",i),a.addEventListener("keyup",i),a.parentNode.insertBefore(d,a)},p=function(a){var b=document.createElement("div");b.className="preview-code",b.style.position="absolute",b.style.left="-9999px",j.appendChild(b);var c=parseInt(window.getComputedStyle(a).getPropertyValue("max-height"),10),d=function(a){b.textContent=this.value+"\n";var d=b.offsetHeight+2;d>=c?this.style.overflow="auto":this.style.overflow="hidden",this.style.height=b.offsetHeight+2+"px"};a.addEventListener("keypress",d),a.addEventListener("keyup",d),d.call(a)},q=function(){var b=j.getElementsByClassName("settings")[0],c=j.getElementsByClassName("resizeable"),d=30,e=function(b){document.cookie="preview-width="+b,a(c,function(a){b==="auto"&&(b=a.parentNode.offsetWidth),a.style.width=b+"px",h(a.getElementsByTagName("iframe")[0],"getHeight")})},i=f(document.cookie)["preview-width"];if(i){e(i),g(b.getElementsByClassName("is-active"),"is-active");var k=b.querySelector('button[data-width="'+i+'"]');k&&k.classList.add("is-active")}window.addEventListener("message",function(a){if(a.data==null||!a.source)return;var b=a.data,c=document.getElementsByName(a.source.name)[0];b.height!=null&&c&&(c.parentNode.style.height=b.height+d+"px")},!1),b&&c.length>0&&(b.hidden=!1,b.addEventListener("click",function(a){var c=a.target.tagName.toLowerCase(),d;if(c==="button")d=a.target;else{if(c!=="svg")return;d=a.target.parentNode}a.preventDefault(),g(b.getElementsByClassName("is-active"),"is-active"),d.classList.add("is-active");var f=d.dataset.width;e(f)}))}}()})()</script></body></html><!-- Generated with StyleDocco (http://jacobrask.github.com/styledocco). --> +</div><div class="code"><pre><code>.icons-image-list { + list-style: none; + padding: 0; + li { + float: left; + width: 33%; + > span { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + } + .icon-search { + .icon-sprite-position(0, 0); + } + .icon-cart { + .icon-sprite-position(1, 0); + } + .icon-arrow-down { + .icon-sprite-position(2, 0); + } + .icon-arrow-up { + .icon-sprite-position(3, 0); + } + .icon-grid { + .icon-sprite-position(4, 0); + } + .icon-list { + .icon-sprite-position(5, 0); + } + .icon-remove { + .icon-sprite-position(6, 0); + } + .icon-star { + .icon-sprite-position(7, 0); + } + .icon-pointer-down { + .icon-sprite-position(8, 0); + } + .icon-pointer-up { + .icon-sprite-position(9, 0); + } + .icon-pointer-left { + .icon-sprite-position(10, 0); + } + .icon-pointer-right { + .icon-sprite-position(11, 0); + } + .icon-compare-empty { + .icon-sprite-position(0, 1); + } + .icon-compare-full { + .icon-sprite-position(1, 1); + } + .icon-wishlist-empty { + .icon-sprite-position(2, 1); + } + .icon-wishlist-full { + .icon-sprite-position(3, 1); + } + .icon-update { + .icon-sprite-position(4, 1); + } + .icon-collapse { + .icon-sprite-position(5, 1); + } + .icon-expand { + .icon-sprite-position(6, 1); + } + .icon-menu { + .icon-sprite-position(7, 1); + } + .icon-prev { + .icon-sprite-position(8, 1); + } + .icon-next { + .icon-sprite-position(9, 1); + } + .icon-settings { + .icon-sprite-position(10, 1); + } + .icon-info { + .icon-sprite-position(11, 1); + } + .icon-checkmark { + .icon-sprite-position(0, 2); + } + .icon-calendar { + .icon-sprite-position(1, 2); + } + .icon-comment { + .icon-sprite-position(2, 2); + } + .icon-comment-reflected { + .icon-sprite-position(3, 2); + } + .icon-envelope { + .icon-sprite-position(4, 2); + } + .icon-warning { + .icon-sprite-position(5, 2); + } + .icon-trash { + .icon-sprite-position(6, 2); + } + .icon-flag { + .icon-sprite-position(7, 2); + } + .icon-location { + .icon-sprite-position(8, 2); + } + .icon-up { + .icon-sprite-position(9, 2); + } + .icon-down { + .icon-sprite-position(10, 2); + } + } +} + +@icon-wishlist-full: '\e600'; +@icon-wishlist-empty: '\e601'; +@icon-warning: '\e602'; +@icon-update: '\e603'; +@icon-trash: '\e604'; +@icon-star: '\e605'; +@icon-settings: '\e606'; +@icon-pointer-down: '\e607'; +@icon-next: '\e608'; +@icon-menu: '\e609'; +@icon-location: '\e60a'; +@icon-list: '\e60b'; +@icon-info: '\e60c'; +@icon-grid: '\e60d'; +@icon-comment-reflected: '\e60e'; +@icon-collapse: '\e60f'; +@icon-checkmark: '\e610'; +@icon-cart: '\e611'; +@icon-calendar: '\e612'; +@icon-arrow-up: '\e613'; +@icon-arrow-down: '\e614'; +@icon-search: '\e615'; +@icon-remove: '\e616'; +@icon-prev: '\e617'; +@icon-pointer-up: '\e618'; +@icon-pointer-right: '\e619'; +@icon-pointer-left: '\e61a'; +@icon-flag: '\e61b'; +@icon-expand: '\e61c'; +@icon-envelope: '\e61d'; +@icon-compare-full: '\e61e'; +@icon-compare-empty: '\e61f'; +@icon-comment: '\e620'; +@icon-up: '\e621'; +@icon-down: '\e622'; +@icon-arrow-up-thin: '\e623'; +@icon-arrow-right-thin: '\e624'; +@icon-arrow-left-thin: '\e625'; +@icon-arrow-down-thin: '\e626'; + +.icons-font-list { + list-style: none; + padding: 0; + li { + float: left; + width: 25%; + margin-bottom: 35px; + text-align: center; + > span { + .icon-font('', @_icon-font-size: 34px); + &:before { + content: attr(data-icon); + margin: 0 auto; + display: block; + } + } + } +}</code></pre></div></article></section><div class="bar bottom"><div hidden class="settings container"><!-- Icons from http://iconmonstr.com--><button title="Desktop (1280)" data-width='1280'><svg viewBox="0 0 412 386" height="24" width="26" class="icon"><path d="m147.6,343.9c-4.5,15.9-26.2,37.6-42.1,42.1h201c-15.3,-4-38.1,-26.8-42.1,-42.1H147.6zM387,0.5H25c-13.8,0-25,11.2-25,25V294c0,13.8 11.2,25 25,25h362c13.8,0 25,-11.2 25,-25V25.5C412,11.7 400.8,0.5 387,0.5zM369.9,238.2H42.1L42.1,42.6 369.9,42.6V238.2z"></path></svg></button><button title="Laptop (1024)" data-width='1024'><svg viewBox="0 0 384 312" height="23" width="28" class="icon"><path d="m349.2,20.5c0,-11-9,-20-20,-20H53.6c-11,0-20,9-20,20v194H349.2v-194zm-27,167H60.6V27.5H322.2v160zm28,42H32.6L2.6,282.1c-3.5,6.2-3.5,13.8 0.1,19.9 3.6,6.2 10.2,9.9 17.3,9.9H363.1c7.1,0 13.7,-3.8 17.3,-10 3.6,-6.2 3.6,-13.8 0,-20l-30.2,-52.5zm-196.9,54 8,-23.5h60.5l8,23.5h-76.5z"></path></svg></button><button title="Tablet (768)" data-width='768'><svg viewBox="0 0 317 412" height="24" width="18" class="icon"><path d="M 316.5,380 V 32 c 0,-17.7 -14.3,-32 -32,-32 H 32 C 14.3,0 0,14.3 0,32 v 348 c 0,17.7 14.3,32 32,32 h 252.5 c 17.7,0 32,-14.3 32,-32 z M 40,367 V 45 H 276.5 V 367 H 40 z m 109.8,22.7 c 0,-4.7 3.8,-8.5 8.5,-8.5 4.7,0 8.5,3.8 8.5,8.5 0,4.7 -3.8,8.5 -8.5,8.5 -4.7,0 -8.5,-3.8 -8.5,-8.5 z"></path></svg></button><button title="Smart phone (320)" data-width='320'><svg viewBox="0 0 224 412" height="24" width="13" class="icon"><path d="M 190.7,0 H 33 C 14.8,0 0,14.8 0,33 v 346 c 0,18.2 14.8,33 33,33 h 157.7 c 18.2,0 33,-14.8 33,-33 V 33 c 0,-18.2 -14.8,-33 -33,-33 z M 94.3,30.2 h 37 c 2.2,0 4,1.8 4,4 0,2.2 -1.8,4 -4,4 h -37 c -2.2,0 -4,-1.8 -4,-4 0,-2.2 1.8,-4 4,-4 z m 18.5,362.8 c -8.8,0 -16,-7.2 -16,-16 0,-8.8 7.2,-16 16,-16 8.8,0 16,7.2 16,16 0,8.8 -7.2,16 -16,16 z M 198.6,343.8 H 25.1 V 68.2 h 173.5 v 275.5 z"></path></svg></button><button title="Feature phone (240)" data-width='240'><svg viewBox="0 0 201 412" height="24" width="12" class="icon"><path d="M 165.5,0.2 V 45 H 25 c -13.8,0 -25,11.2 -25,25 V 387 c 0,13.8 11.2,25 25,25 h 150.5 c 13.8,0 25,-11.2 25,-25 V 0.2 h -35 z M 65.2,366.5 H 34.2 v -24.5 h 31 v 24.5 z m 0,-44.3 H 34.2 v -24.5 h 31 v 24.5 z m 50.5,44.3 H 84.7 v -24.5 h 31 v 24.5 z m 0,-44.3 H 84.7 v -24.5 h 31 v 24.5 z m 50.5,44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-59.3 h -132 V 95.4 h 132 V 262.9 z"></path></svg></button><button title="Auto (100%)" data-width="auto" class="auto is-active">Auto</button></div></div><script>(function(){var a=[{title:"actions-toolbar",filename:"actions-toolbar",url:"actions-toolbar.html"},{title:"",filename:"actions-toolbar",url:"actions-toolbar.html#"},{title:"Actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar"},{title:"Actions toolbar mixin variables",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-mixin-variables"},{title:"Actions toolbar alignment",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-alignment"},{title:"Reverse primary and secondary blocks",filename:"actions-toolbar",url:"actions-toolbar.html#reverse-primary-and-secondary-blocks"},{title:"Actions toolbar indents customizations",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-indents-customizations"},{title:"Responsive actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#responsive-actions-toolbar"},{title:"breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html"},{title:"",filename:"breadcrumbs",url:"breadcrumbs.html#"},{title:"Breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs"},{title:"Breadcrumbs variables",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-variables"},{title:"Button-styled breadcrumbs with gradient background, border, and no separating symbol",filename:"breadcrumbs",url:"breadcrumbs.html#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol"},{title:"Breadcrumbs with solid background",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-with-solid-background"},{title:"buttons",filename:"buttons",url:"buttons.html"},{title:"",filename:"buttons",url:"buttons.html#"},{title:"Default button",filename:"buttons",url:"buttons.html#default-button"},{title:"Button variables",filename:"buttons",url:"buttons.html#button-variables"},{title:"Button as an icon",filename:"buttons",url:"buttons.html#button-as-an-icon"},{title:"Button with an icon on the left or right side of the text",filename:"buttons",url:"buttons.html#button-with-an-icon-on-the-left-or-right-side-of-the-text"},{title:"Button with fixed width",filename:"buttons",url:"buttons.html#button-with-fixed-width"},{title:"Primary button",filename:"buttons",url:"buttons.html#primary-button"},{title:"Primary button variables",filename:"buttons",url:"buttons.html#primary-button-variables"},{title:"Button with gradient background",filename:"buttons",url:"buttons.html#button-with-gradient-background"},{title:"Button as a link",filename:"buttons",url:"buttons.html#button-as-a-link"},{title:"Button as a link variables",filename:"buttons",url:"buttons.html#button-as-a-link-variables"},{title:"Link as a button",filename:"buttons",url:"buttons.html#link-as-a-button"},{title:"Button reset",filename:"buttons",url:"buttons.html#button-reset"},{title:"Button revert secondary color",filename:"buttons",url:"buttons.html#button-revert-secondary-color"},{title:"Button revert secondary color variables",filename:"buttons",url:"buttons.html#button-revert-secondary-color-variables"},{title:"Button revert secondary size",filename:"buttons",url:"buttons.html#button-revert-secondary-size"},{title:"Button revert secondary size variables",filename:"buttons",url:"buttons.html#button-revert-secondary-size-variables"},{title:"docs",filename:"docs",url:"docs.html"},{title:"",filename:"docs",url:"docs.html#"},{title:"Documentation",filename:"docs",url:"docs.html#documentation"},{title:"dropdowns",filename:"dropdowns",url:"dropdowns.html"},{title:"",filename:"dropdowns",url:"dropdowns.html#"},{title:"Drop-down and split buttons mixins",filename:"dropdowns",url:"dropdowns.html#dropdown-and-split-buttons-mixins"},{title:"Drop-down",filename:"dropdowns",url:"dropdowns.html#dropdown"},{title:"Drop-down variables",filename:"dropdowns",url:"dropdowns.html#dropdown-variables"},{title:"Drop-down with icon customization",filename:"dropdowns",url:"dropdowns.html#dropdown-with-icon-customization"},{title:"Modify dropdown list styles",filename:"dropdowns",url:"dropdowns.html#modify-dropdown-list-styles"},{title:"Split button",filename:"dropdowns",url:"dropdowns.html#split-button"},{title:"Split button variables",filename:"dropdowns",url:"dropdowns.html#split-button-variables"},{title:"Split button - button styling",filename:"dropdowns",url:"dropdowns.html#split-button-button-styling"},{title:"Split button icon customization",filename:"dropdowns",url:"dropdowns.html#split-button-icon-customization"},{title:"Split button drop-down list customization",filename:"dropdowns",url:"dropdowns.html#split-button-dropdown-list-customization"},{title:"forms",filename:"forms",url:"forms.html"},{title:"",filename:"forms",url:"forms.html#"},{title:"Forms mixins",filename:"forms",url:"forms.html#forms-mixins"},{title:"Global forms elements customization",filename:"forms",url:"forms.html#global-forms-elements-customization"},{title:"Fieldsets & fields customization",filename:"forms",url:"forms.html#fieldsets-fields-customization"},{title:"Fieldset and legend customization variables",filename:"forms",url:"forms.html#fieldset-and-legend-customization-variables"},{title:"Fields customization variables",filename:"forms",url:"forms.html#fields-customization-variables"},{title:"Required fields message customization variables",filename:"forms",url:"forms.html#required-fields-message-customization-variables"},{title:"Form element inputs customization",filename:"forms",url:"forms.html#form-element-inputs-customization"},{title:"Form element inputs customization variables",filename:"forms",url:"forms.html#form-element-inputs-customization-variables"},{title:"Form element choice",filename:"forms",url:"forms.html#form-element-choice"},{title:"Form element choice variables",filename:"forms",url:"forms.html#form-element-choice-variables"},{title:"Custom color",filename:"forms",url:"forms.html#custom-color"},{title:"Input number - input-text view",filename:"forms",url:"forms.html#input-number-inputtext-view"},{title:"Input search - input-text view",filename:"forms",url:"forms.html#input-search-inputtext-view"},{title:"Form validation",filename:"forms",url:"forms.html#form-validation"},{title:"Form validation variables// <pre>",filename:"forms",url:"forms.html#form-validation-variables-pre"},{title:"icons",filename:"icons",url:"icons.html"},{title:"Icons",filename:"icons",url:"icons.html#icons"},{title:"Icon with image or sprite",filename:"icons",url:"icons.html#icon-with-image-or-sprite"},{title:"Icon with image or sprite variables",filename:"icons",url:"icons.html#icon-with-image-or-sprite-variables"},{title:"Icon position for an icon with image or sprite",filename:"icons",url:"icons.html#icon-position-for-an-icon-with-image-or-sprite"},{title:"Position for icon with image or sprite mixin variables",filename:"icons",url:"icons.html#position-for-icon-with-image-or-sprite-mixin-variables"},{title:"Icon sprite position (with grid)",filename:"icons",url:"icons.html#icon-sprite-position-with-grid"},{title:"Icon sprite position variables",filename:"icons",url:"icons.html#icon-sprite-position-variables"},{title:"Image/sprite icon size",filename:"icons",url:"icons.html#imagesprite-icon-size"},{title:"Image/sprite icon size variables",filename:"icons",url:"icons.html#imagesprite-icon-size-variables"},{title:"Font icon",filename:"icons",url:"icons.html#font-icon"},{title:"Font icon variables",filename:"icons",url:"icons.html#font-icon-variables"},{title:"Change the size of font icon",filename:"icons",url:"icons.html#change-the-size-of-font-icon"},{title:"Change the size of font icon variables",filename:"icons",url:"icons.html#change-the-size-of-font-icon-variables"},{title:"Hide icon text",filename:"icons",url:"icons.html#hide-icon-text"},{title:"Sprite and font icons for Blank theme",filename:"icons",url:"icons.html#sprite-and-font-icons-for-blank-theme"},{title:"layout",filename:"layout",url:"layout.html"},{title:"",filename:"layout",url:"layout.html#"},{title:"Layout",filename:"layout",url:"layout.html#layout"},{title:"Layout global variables",filename:"layout",url:"layout.html#layout-global-variables"},{title:"Page layouts",filename:"layout",url:"layout.html#page-layouts"},{title:"Layout column",filename:"layout",url:"layout.html#layout-column"},{title:"Layout column variables",filename:"layout",url:"layout.html#layout-column-variables"},{title:"Layout width",filename:"layout",url:"layout.html#layout-width"},{title:"Layout width variables",filename:"layout",url:"layout.html#layout-width-variables"},{title:"lib",filename:"lib",url:"lib.html"},{title:"",filename:"lib",url:"lib.html#"},{title:"Including Magento UI library to your theme",filename:"lib",url:"lib.html#including-magento-ui-library-to-your-theme"},{title:"loaders",filename:"loaders",url:"loaders.html"},{title:"",filename:"loaders",url:"loaders.html#"},{title:"Loaders",filename:"loaders",url:"loaders.html#loaders"},{title:"Default loader variables",filename:"loaders",url:"loaders.html#default-loader-variables"},{title:"Loading",filename:"loaders",url:"loaders.html#loading"},{title:"Loading default variables",filename:"loaders",url:"loaders.html#loading-default-variables"},{title:"messages",filename:"messages",url:"messages.html"},{title:"",filename:"messages",url:"messages.html#"},{title:"Messages",filename:"messages",url:"messages.html#messages"},{title:"Information message",filename:"messages",url:"messages.html#information-message"},{title:"Warning message",filename:"messages",url:"messages.html#warning-message"},{title:"Error message",filename:"messages",url:"messages.html#error-message"},{title:"Success message",filename:"messages",url:"messages.html#success-message"},{title:"Notice message",filename:"messages",url:"messages.html#notice-message"},{title:"Message with inner icon",filename:"messages",url:"messages.html#message-with-inner-icon"},{title:"Message with lateral icon",filename:"messages",url:"messages.html#message-with-lateral-icon"},{title:"Custom message style",filename:"messages",url:"messages.html#custom-message-style"},{title:"Messages global variables",filename:"messages",url:"messages.html#messages-global-variables"},{title:"pages",filename:"pages",url:"pages.html"},{title:"",filename:"pages",url:"pages.html#"},{title:"Pagination HTML markup",filename:"pages",url:"pages.html#pagination-html-markup"},{title:"Pagination variables",filename:"pages",url:"pages.html#pagination-variables"},{title:"Pagination with label and gradient background on links",filename:"pages",url:"pages.html#pagination-with-label-and-gradient-background-on-links"},{title:'Pagination with "previous"..."next" text links and label',filename:"pages",url:"pages.html#pagination-with-previousnext-text-links-and-label"},{title:"Pagination without label, with solid background",filename:"pages",url:"pages.html#pagination-without-label-with-solid-background"},{title:"popups",filename:"popups",url:"popups.html"},{title:"",filename:"popups",url:"popups.html#"},{title:"Popups",filename:"popups",url:"popups.html#popups"},{title:"Popup variables",filename:"popups",url:"popups.html#popup-variables"},{title:"Window overlay mixin variables",filename:"popups",url:"popups.html#window-overlay-mixin-variables"},{title:"Fixed height popup",filename:"popups",url:"popups.html#fixed-height-popup"},{title:"Fixed content height popup",filename:"popups",url:"popups.html#fixed-content-height-popup"},{title:"Margins for header, content and footer block in popup",filename:"popups",url:"popups.html#margins-for-header-content-and-footer-block-in-popup"},{title:"Popup titles styled as theme headings",filename:"popups",url:"popups.html#popup-titles-styled-as-theme-headings"},{title:"Popup action toolbar",filename:"popups",url:"popups.html#popup-action-toolbar"},{title:"Popup Close button without an icon",filename:"popups",url:"popups.html#popup-close-button-without-an-icon"},{title:"Modify the icon of popup Close button",filename:"popups",url:"popups.html#modify-the-icon-of-popup-close-button"},{title:"Modify overlay styles",filename:"popups",url:"popups.html#modify-overlay-styles"},{title:"rating",filename:"rating",url:"rating.html"},{title:"",filename:"rating",url:"rating.html#"},{title:"Ratings",filename:"rating",url:"rating.html#ratings"},{title:"Global rating variables",filename:"rating",url:"rating.html#global-rating-variables"},{title:"Rating with vote",filename:"rating",url:"rating.html#rating-with-vote"},{title:"Rating with vote icons number customization",filename:"rating",url:"rating.html#rating-with-vote-icons-number-customization"},{title:"Rating with vote icons colors customization",filename:"rating",url:"rating.html#rating-with-vote-icons-colors-customization"},{title:"Rating with vote icons symbol customization",filename:"rating",url:"rating.html#rating-with-vote-icons-symbol-customization"},{title:"Accessible rating with vote",filename:"rating",url:"rating.html#accessible-rating-with-vote"},{title:"Rating summary",filename:"rating",url:"rating.html#rating-summary"},{title:"Rating summary icons number customization",filename:"rating",url:"rating.html#rating-summary-icons-number-customization"},{title:"Rating summary icons color customization",filename:"rating",url:"rating.html#rating-summary-icons-color-customization"},{title:"Rating summary icons symbol customization",filename:"rating",url:"rating.html#rating-summary-icons-symbol-customization"},{title:"Rating summary hide label",filename:"rating",url:"rating.html#rating-summary-hide-label"},{title:"Rating summary multiple ratings",filename:"rating",url:"rating.html#rating-summary-multiple-ratings"},{title:"Rating hide label mixin",filename:"rating",url:"rating.html#rating-hide-label-mixin"},{title:"resets",filename:"resets",url:"resets.html"},{title:"",filename:"resets",url:"resets.html#"},{title:"Resets",filename:"resets",url:"resets.html#resets"},{title:"responsive",filename:"responsive",url:"responsive.html"},{title:"",filename:"responsive",url:"responsive.html#"},{title:"Responsive",filename:"responsive",url:"responsive.html#responsive"},{title:"Responsive mixins usage",filename:"responsive",url:"responsive.html#responsive-mixins-usage"},{title:"Media query style groups separation variables",filename:"responsive",url:"responsive.html#media-query-style-groups-separation-variables"},{title:"Responsive breakpoints",filename:"responsive",url:"responsive.html#responsive-breakpoints"},{title:"sections",filename:"sections",url:"sections.html"},{title:"",filename:"sections",url:"sections.html#"},{title:"Tabs and accordions",filename:"sections",url:"sections.html#tabs-and-accordions"},{title:"Tabs",filename:"sections",url:"sections.html#tabs"},{title:"Tabs mixin variables",filename:"sections",url:"sections.html#tabs-mixin-variables"},{title:"Tabs with content top border",filename:"sections",url:"sections.html#tabs-with-content-top-border"},{title:"Accordion",filename:"sections",url:"sections.html#accordion"},{title:"Accordion mixin variables",filename:"sections",url:"sections.html#accordion-mixin-variables"},{title:"Responsive tabs",filename:"sections",url:"sections.html#responsive-tabs"},{title:"Tabs Base",filename:"sections",url:"sections.html#tabs-base"},{title:"Accordion Base",filename:"sections",url:"sections.html#accordion-base"},{title:"tables",filename:"tables",url:"tables.html"},{title:"",filename:"tables",url:"tables.html#"},{title:"Tables",filename:"tables",url:"tables.html#tables"},{title:"Table mixin variables",filename:"tables",url:"tables.html#table-mixin-variables"},{title:"Table typography",filename:"tables",url:"tables.html#table-typography"},{title:"Table typography mixin variables",filename:"tables",url:"tables.html#table-typography-mixin-variables"},{title:"Table caption",filename:"tables",url:"tables.html#table-caption"},{title:"Table caption mixin variables",filename:"tables",url:"tables.html#table-caption-mixin-variables"},{title:"Table cells resize",filename:"tables",url:"tables.html#table-cells-resize"},{title:"Table cells resize variables",filename:"tables",url:"tables.html#table-cells-resize-variables"},{title:"Table background customization",filename:"tables",url:"tables.html#table-background-customization"},{title:"Table background mixin variables",filename:"tables",url:"tables.html#table-background-mixin-variables"},{title:"Table borders customization",filename:"tables",url:"tables.html#table-borders-customization"},{title:"Table borders mixin variables",filename:"tables",url:"tables.html#table-borders-mixin-variables"},{title:"Table with horizontal borders",filename:"tables",url:"tables.html#table-with-horizontal-borders"},{title:"Table with vertical borders",filename:"tables",url:"tables.html#table-with-vertical-borders"},{title:"Table with light borders",filename:"tables",url:"tables.html#table-with-light-borders"},{title:"Table without borders",filename:"tables",url:"tables.html#table-without-borders"},{title:"Striped table",filename:"tables",url:"tables.html#striped-table"},{title:"Striped table mixin variables",filename:"tables",url:"tables.html#striped-table-mixin-variables"},{title:"Table with rows hover",filename:"tables",url:"tables.html#table-with-rows-hover"},{title:"Table with rows hover mixin variables",filename:"tables",url:"tables.html#table-with-rows-hover-mixin-variables"},{title:"Responsive table technics #1",filename:"tables",url:"tables.html#responsive-table-technics-1"},{title:"Responsive table technics #2",filename:"tables",url:"tables.html#responsive-table-technics-2"},{title:"Responsive table technics #2 mixin variables",filename:"tables",url:"tables.html#responsive-table-technics-2-mixin-variables"},{title:"tooltips",filename:"tooltips",url:"tooltips.html"},{title:"",filename:"tooltips",url:"tooltips.html#"},{title:"Tooltips",filename:"tooltips",url:"tooltips.html#tooltips"},{title:"Tooltips variables",filename:"tooltips",url:"tooltips.html#tooltips-variables"},{title:"typography",filename:"typography",url:"typography.html"},{title:"",filename:"typography",url:"typography.html#"},{title:"Typogrphy",filename:"typography",url:"typography.html#typogrphy"},{title:"Typography variables",filename:"typography",url:"typography.html#typography-variables"},{title:"Font-size mixin",filename:"typography",url:"typography.html#fontsize-mixin"},{title:"Line-height mixin",filename:"typography",url:"typography.html#lineheight-mixin"},{title:"Word breaking mixin",filename:"typography",url:"typography.html#word-breaking-mixin"},{title:"Font face mixin",filename:"typography",url:"typography.html#font-face-mixin"},{title:"Text overflow mixin",filename:"typography",url:"typography.html#text-overflow-mixin"},{title:"Text hide",filename:"typography",url:"typography.html#text-hide"},{title:"Hyphens",filename:"typography",url:"typography.html#hyphens"},{title:"Font style and color",filename:"typography",url:"typography.html#font-style-and-color"},{title:"Font style mixin variables",filename:"typography",url:"typography.html#font-style-mixin-variables"},{title:"Reset list styles",filename:"typography",url:"typography.html#reset-list-styles"},{title:"Reset list styles variables",filename:"typography",url:"typography.html#reset-list-styles-variables"},{title:"Inline-block list item styling",filename:"typography",url:"typography.html#inlineblock-list-item-styling"},{title:"Link styling mixin",filename:"typography",url:"typography.html#link-styling-mixin"},{title:"Link styling mixin variables",filename:"typography",url:"typography.html#link-styling-mixin-variables"},{title:"Heading styling mixin",filename:"typography",url:"typography.html#heading-styling-mixin"},{title:"Base typography mixins",filename:"typography",url:"typography.html#base-typography-mixins"},{title:"Headings typography mixin",filename:"typography",url:"typography.html#headings-typography-mixin"},{title:"Typography links mixin",filename:"typography",url:"typography.html#typography-links-mixin"},{title:"Typography lists mixin",filename:"typography",url:"typography.html#typography-lists-mixin"},{title:"Typography code elements mixin",filename:"typography",url:"typography.html#typography-code-elements-mixin"},{title:"Typography blockquote",filename:"typography",url:"typography.html#typography-blockquote"},{title:"utilities",filename:"utilities",url:"utilities.html"},{title:"",filename:"utilities",url:"utilities.html#"},{title:"Utilities",filename:"utilities",url:"utilities.html#utilities"},{title:".clearfix()",filename:"utilities",url:"utilities.html#clearfix"},{title:".visibility-hidden()",filename:"utilities",url:"utilities.html#visibilityhidden"},{title:".visually-hidden()",filename:"utilities",url:"utilities.html#visuallyhidden"},{title:".visually-hidden-reset()",filename:"utilities",url:"utilities.html#visuallyhiddenreset"},{title:".css()",filename:"utilities",url:"utilities.html#css"},{title:".css() variables",filename:"utilities",url:"utilities.html#css-variables"},{title:".rotate()",filename:"utilities",url:"utilities.html#rotate"},{title:".rotate() variables",filename:"utilities",url:"utilities.html#rotate-variables"},{title:".input-placeholder()",filename:"utilities",url:"utilities.html#inputplaceholder"},{title:".input-placeholder() variables",filename:"utilities",url:"utilities.html#inputplaceholder-variables"},{title:".background-gradient()",filename:"utilities",url:"utilities.html#backgroundgradient"},{title:".background-gradient() variables",filename:"utilities",url:"utilities.html#backgroundgradient-variables"},{title:"variables",filename:"variables",url:"variables.html"},{title:"",filename:"variables",url:"variables.html#"},{title:"List of Global Variables",filename:"variables",url:"variables.html#list-of-global-variables"},{title:"Table with rows hover mixin variables",filename:"variables",url:"variables.html#table-with-rows-hover-mixin-variables"}];(function(){"use strict";var b=function(a,b){return Array.prototype.indexOf.call(a,b)!==-1},c=function(a,b){return Array.prototype.filter.call(a,b)},d=function(a,b){return Array.prototype.forEach.call(a,b)},e=document.getElementsByTagName("body")[0];e.addEventListener("click",function(a){var b=a.target;b.tagName.toLowerCase()==="svg"&&(b=b.parentNode);var c=!1;b.dataset.toggle!=null&&(a.preventDefault(),b.classList.contains("is-active")||(c=!0)),d(e.querySelectorAll("[data-toggle]"),function(a){a.classList.remove("is-active"),document.getElementById(a.dataset.toggle).hidden=!0}),c&&(b.classList.add("is-active"),document.getElementById(b.dataset.toggle).hidden=!1)}),function(){var f=e.getElementsByClassName("nav")[0];if(!f)return;var g=document.createElement("ul");g.className="nav-results",g.id="nav-search",g.hidden=!0,d(a,function(a){var b,c,d;b=document.createElement("li"),b._title=a.title.toLowerCase(),b.hidden=!0,b.appendChild(c=document.createElement("a")),c.href=a.url,c.innerHTML=a.title,c.appendChild(d=document.createElement("span")),d.innerHTML=a.filename,d.className="nav-results-filename",g.appendChild(b)}),f.appendChild(g);var h=g.children,i=function(a){d(h,function(a){a.hidden=!0});var b=this.value.toLowerCase(),e=[];b!==""&&(e=c(h,function(a){return a._title.indexOf(b)!==-1})),e.length>0?(d(e,function(a){a.hidden=!1}),g.hidden=!1):g.hidden=!0},j=f.querySelector('input[type="search"]');j.addEventListener("keyup",i),j.addEventListener("focus",i),e.addEventListener("click",function(a){if(a.target.classList&&a.target.classList.contains("search"))return;g.hidden=!0}),g.addEventListener("click",function(a){j.value=""});var k=document.createElement("ul");k.id="nav-toc",k.hidden=!0,k.className="nav-results toc-list",c(e.getElementsByTagName("*"),function(a){return b(["h1","h2","h3"],a.tagName.toLowerCase())}).map(function(a){var b=document.createElement("li"),c=document.createElement("a"),d=a.tagName.toLowerCase()[1];c.classList.add("level-"+d),b.appendChild(c),c.href="#"+a.id,c.innerHTML=a.innerHTML,k.appendChild(b)}),f.appendChild(k)}()})(),function(){"use strict";if(location.hash==="#__preview__"||location.protocol==="data:")return;var a=function(a,b){return Array.prototype.forEach.call(a,b)},b=function(a,b){var e=Array.prototype.slice.call(arguments,2);return d(a,function(a){return(c(b)?b||a:a[b]).apply(a,e)})},c=function(a){return Object.prototype.toString.call(a)==="[object Function]"},d=function(a,b){return Array.prototype.map.call(a,b)},e=function(a,b){return d(a,function(a){return a[b]})},f=function(a){var b={},c=a.split(";");for(var d=0;c.length>d;d++){var e=c[d].trim().split("=");b[e[0]]=e[1]}return b},g=function(a,c){return b(e(a,"classList"),"remove",c)},h=function(a,b){a.contentDocument.defaultView.postMessage(b,"*")},i=document.getElementsByTagName("head")[0],j=document.getElementsByTagName("body")[0],k=e(i.querySelectorAll('style[type="text/preview"]'),"innerHTML").join(""),l=e(i.querySelectorAll('script[type="text/preview"]'),"innerHTML").join(""),m=location.href.split("#")[0]+"#__preview__",n=document.createElement("iframe");n.src="data:text/html,",j.appendChild(n),n.addEventListener("load",function(){var b={sameOriginDataUri:!0};try{this.contentDocument,this.contentDocument||(b.sameOriginDataUri=!1)}catch(c){b.sameOriginDataUri=!1}this.parentNode.removeChild(this),a(j.getElementsByTagName("textarea"),function(a,c){o(a,b,c),q(),p(a)})});var o=function(a,b,c){var d,e,f;d=document.createElement("div"),d.appendChild(e=document.createElement("div")),d.className="preview",e.appendChild(f=document.createElement("iframe")),e.className="resizeable",f.setAttribute("scrolling","no"),f.name="iframe"+c++,f.addEventListener("load",function(){var c,d,e,f,g,i,j;j=this.contentDocument;if(!b.sameOriginDataUri&&this.src!==m)return;this.src===m&&(c=j.createElement("html"),c.appendChild(j.createElement("head")),c.appendChild(d=j.createElement("body")),d.innerHTML=a.textContent,j.replaceChild(c,j.documentElement)),g=j.createElement("head"),g.appendChild(f=j.createElement("style")),g.appendChild(e=j.createElement("script")),e.textContent=l,f.textContent=k,i=j.getElementsByTagName("head")[0],i.parentNode.replaceChild(g,i),h(this,"getHeight")});var g;b.sameOriginDataUri?g="data:text/html;charset=utf-8,"+encodeURIComponent("<!doctype html><html><head></head></body>"+a.textContent):g=m,f.setAttribute("src",g);var i=function(){f.contentDocument.body.innerHTML=this.value,h(f,"getHeight")};a.addEventListener("keypress",i),a.addEventListener("keyup",i),a.parentNode.insertBefore(d,a)},p=function(a){var b=document.createElement("div");b.className="preview-code",b.style.position="absolute",b.style.left="-9999px",j.appendChild(b);var c=parseInt(window.getComputedStyle(a).getPropertyValue("max-height"),10),d=function(a){b.textContent=this.value+"\n";var d=b.offsetHeight+2;d>=c?this.style.overflow="auto":this.style.overflow="hidden",this.style.height=b.offsetHeight+2+"px"};a.addEventListener("keypress",d),a.addEventListener("keyup",d),d.call(a)},q=function(){var b=j.getElementsByClassName("settings")[0],c=j.getElementsByClassName("resizeable"),d=30,e=function(b){document.cookie="preview-width="+b,a(c,function(a){b==="auto"&&(b=a.parentNode.offsetWidth),a.style.width=b+"px",h(a.getElementsByTagName("iframe")[0],"getHeight")})},i=f(document.cookie)["preview-width"];if(i){e(i),g(b.getElementsByClassName("is-active"),"is-active");var k=b.querySelector('button[data-width="'+i+'"]');k&&k.classList.add("is-active")}window.addEventListener("message",function(a){if(a.data==null||!a.source)return;var b=a.data,c=document.getElementsByName(a.source.name)[0];b.height!=null&&c&&(c.parentNode.style.height=b.height+d+"px")},!1),b&&c.length>0&&(b.hidden=!1,b.addEventListener("click",function(a){var c=a.target.tagName.toLowerCase(),d;if(c==="button")d=a.target;else{if(c!=="svg")return;d=a.target.parentNode}a.preventDefault(),g(b.getElementsByClassName("is-active"),"is-active"),d.classList.add("is-active");var f=d.dataset.width;e(f)}))}}()})()</script></body></html><!-- Generated with StyleDocco (http://jacobrask.github.com/styledocco). --> diff --git a/lib/web/css/docs/source/icons.less b/lib/web/css/docs/source/icons.less index 97f05c59a017f916960128dceb9314f94e8dd93f..355ece1b150e82fd16b0534c4ed34ddb63bf10aa 100644 --- a/lib/web/css/docs/source/icons.less +++ b/lib/web/css/docs/source/icons.less @@ -685,6 +685,12 @@ // <li> // <span class="icon-arrow-down-thin" data-icon=""><span>@icon-arrow-down-thin</span></span> // </li> +// <li> +// <span class="icon-arrow-left-thin" data-icon=""><span>@icon-gift-registry</span></span> +// </li> +// <li> +// <span class="icon-arrow-down-thin" data-icon=""><span>@icon-present</span></span> +// </li> // </ul> // ``` diff --git a/lib/web/css/source/lib/variables/_icons.less b/lib/web/css/source/lib/variables/_icons.less index 443228833b6d87e93c4030cac230ad50f2c55ad6..999e9c2cf7922b5a9acb500e499ba271a116e992 100644 --- a/lib/web/css/source/lib/variables/_icons.less +++ b/lib/web/css/source/lib/variables/_icons.less @@ -80,3 +80,5 @@ @icon-arrow-left-thin: '\e625'; @icon-arrow-down-thin: '\e626'; @icon-account: '\e627'; +@icon-gift-registry: '\e628'; +@icon-present: '\e629'; diff --git a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot index 62bdd2789b80e4759cfb379c307f2186aafce389..9bc3197afaa63854e2a13d3f79f31488bf1fe4db 100644 Binary files a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot and b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot differ diff --git a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg index d92883dcfa582968714e1932df979ab965effc2f..85f6bf6ddeca82ba961382a061b92c7b6da011b7 100644 --- a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg +++ b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg"><defs><font horiz-adv-x="1024"><font-face units-per-em="1024" ascent="960" descent="-64"/><glyph horiz-adv-x="512"/><glyph unicode="" d="M676.57 637.696c-59.866 28.197-131.254 2.523-159.414-57.307-1.975-4.14-3.657-9.368-5.157-15.4-1.5 6.03-3.188 11.26-5.16 15.394-28.2 59.83-99.55 85.503-159.418 57.306-59.83-28.196-85.504-99.546-57.27-159.377 28.197-59.865 221.805-231.42 221.805-231.42s0 .22.036.584c.036-.37.036-.588.036-.588s193.65 171.555 221.81 231.423c28.23 59.83 2.595 131.182-57.27 159.378z"/><glyph unicode="î˜" d="M676.57 637.696c-59.83 28.197-131.217 2.523-159.45-57.307-1.938-4.14-3.657-9.368-5.157-15.4-1.463 6.03-3.182 11.26-5.157 15.394-28.16 59.83-99.547 85.503-159.378 57.306-59.83-28.196-85.467-99.546-57.27-159.377S511.963 246.89 511.963 246.89s0 .22.037.586v-.623s193.646 171.56 221.842 231.426c28.233 59.864 2.597 131.22-57.27 159.412zm13.643-158.464C664.796 435.456 516.206 294.51 516.206 294.51l-1.573 3S359.168 437.906 333.423 481.5c-30.61 51.822-7.754 108.946 38.948 128.44 43.52 18.175 101.89-27.32 123.508-73.144 1.5-3.182 17.627-1.463 18.798-6.107 1.135 4.64 12.728 2.92 14.227 6.1 21.577 45.825 81.04 93.99 128 72.41 46.007-21.136 66.926-72.153 33.317-129.973z"/><glyph unicode="" d="M512 704.11L215.15 191.854h593.7L512 704.11zm32.22-449.975h-62.76v49.92h62.757v-49.92zm-15.507 89.234h-31.27l-20.808 140.65-1.207 72.7h72.52v-72.7l-19.235-140.65z"/><glyph unicode="" d="M628.846 588.544c-34.085 28.343-75.63 42.24-116.773 42.24-47.47 0-94.757-18.578-130.085-54.382l-32.073 29.586-.585-102.693 110.994-.658L420.9 543.89c25.198 24.027 58.002 36.315 91.136 36.352 29.842-.037 59.72-9.947 84.517-30.574 31.488-26.222 47.69-63.744 47.726-101.815 0-5.45-.37-10.97-1.03-16.457l51.383 9.874c.073 2.23.146 4.425.146 6.62.037 52.37-22.49 104.52-65.938 140.653zm-25.052-235.776c-25.307-24.466-58.405-37.01-91.867-37.047-29.88.04-59.72 9.99-84.517 30.58-31.488 26.22-47.69 63.744-47.726 101.778 0 6.327.475 12.617 1.353 18.87l-51.602-9.69c-.146-3.072-.256-6.107-.256-9.18-.04-52.333 22.49-104.52 65.97-140.616 34.05-28.343 75.592-42.24 116.735-42.24h.11c47.8 0 95.377 18.907 130.742 55.223l33.937-33.83.22 106.096-112.054.29 38.95-40.23z"/><glyph unicode="" d="M696.942 624.933l-19.273 6.107h-74.5v38.583l-12.547 21.03-22.712 13.494H456.77l-23.333-13.495-12.58-21.03v-38.618H347.09l-18.76-6.656-17.19-14.153v-88.87h19.018v-.072h17.555V191.818h36.57v.293H639.7v-.29h36.57V521.26h18.287v.073h18.285v86.6l-15.91 17.007zm-239.507 42.642h109.13v-36.57h-109.13v36.57zm182.272-438.857H384.292v292.57h255.415V228.72zm36.572 329.216H347.72v36.498h328.56v-36.498zM457.43 483.51h-36.57V264.925h36.57V483.51zm73.143 0h-36.57V264.925h36.57V483.51zm73.143 0h-36.57V264.925h36.57V483.51z"/><glyph unicode="" d="M804.645 515.4c-1.5 4.682-5.888 7.9-10.79 7.9H586.9l-64.073 196.754c-1.536 4.645-5.888 7.826-10.825 7.826-4.9 0-9.29-3.182-10.825-7.863l-64.44-196.754h-206.59c-4.902 0-9.29-3.218-10.826-7.863-1.5-4.68.15-9.874 4.1-12.763l167.2-121.783-64.44-197.85c-1.534-4.682.148-9.84 4.135-12.728 3.95-2.89 9.4-2.89 13.35 0L512 292.46l167.937-122.148c2.01-1.463 4.315-2.23 6.693-2.23s4.68.767 6.693 2.23c4.023 2.89 5.67 8.01 4.133 12.727l-64.44 197.85 167.57 121.78c3.95 2.89 5.633 8.044 4.06 12.725z"/><glyph unicode="" d="M807.24 415.854V483l-9.508 3.144-71.936 23.442-19.2 46.373 36.937 78.08-47.506 47.5-8.923-4.498-67.438-34.304-46.373 19.2-29.11 81.3H477l-26.624-81.446-46.336-19.163-78.043 36.9-47.506-47.505 4.5-8.96 34.27-67.438-19.2-46.338-81.3-29.075V413l9.47-3.07 71.977-23.516 19.163-46.373-36.9-78.08 47.504-47.502 8.888 4.498 67.475 34.304 46.373-19.2 29.11-81.3H547l3.072 9.51 23.515 71.935 46.373 19.2 78.08-36.937 47.506 47.506-4.498 8.923-34.304 67.438 19.2 46.373 81.298 29.147zM512 353.938c-51.968 0-94.062 42.13-94.062 94.062 0 52.005 42.094 94.062 94.062 94.062 51.93 0 94.098-42.057 94.098-94.062-.037-51.93-42.167-94.062-94.098-94.062z"/><glyph unicode="" d="M339.602 539.94L512 356.06l172.398 183.88z"/><glyph unicode="" d="M606.94 449.938L448.547 612.79l-27.794-26.074L553.58 450.158l-136.52-140.36 27.173-26.588L597.43 440.76l-.145.146z"/><glyph unicode="" d="M127.634 740.57v-73.14h768.73v73.143h-768.73zm0-329.14h768.73v73.142h-768.73V411.43zm0-256h768.73v73.142h-768.73V155.43z"/><glyph unicode="" d="M512 742.217c-102.437 0-185.417-83.054-185.417-185.454C326.583 454.326 512 153.746 512 153.746s185.454 300.58 185.454 403.017C697.417 659.2 614.437 742.217 512 742.217zm0-241.774c-31.122 0-56.357 25.198-56.357 56.357 0 31.086 25.234 56.357 56.357 56.357 31.16 0 56.393-25.27 56.393-56.357-.037-31.16-25.27-56.357-56.393-56.357z"/><glyph unicode="" d="M219.43 485.595h255.926v254.793H219.43V485.595zM548.57 740.39V631.04h256v109.35h-256zM219.43 156.452h255.926v254.793H219.43V156.453zm329.14 328.3h256v109.35h-256v-109.35zm0-182.856h256v109.35h-256v-109.35zm0-146.286h256v109.35h-256V155.61z"/><glyph unicode="" d="M579.51 677.01c-30.792 0-57.38-25.16-57.38-55.954 0-28.635 18.907-47.58 47.58-47.58 31.414 0 58 23.772 58 55.992 0 28.71-20.223 47.543-48.2 47.543zm14.008-340.516c-9.8 0-48.31-59.502-69.266-59.502-5.595 0-8.375 4.937-8.375 9.8 0 11.228 7.68 28.71 11.85 39.206l50.32 136.375c25.2 67.84-6.984 86.016-37.046 86.016-40.552 0-76.94-20.3-104.88-46.85-9.107-9.07-39.864-38.44-39.864-51.058 0-4.133 4.17-9.07 9.107-9.07 12.544 0 46.153 60.855 72.01 60.855 5.594 0 11.885-6.29 6.984-18.87L435.46 360.225c-4.938-11.85-28.71-69.23-28.71-102.802 0-26.587 17.52-38.437 42.68-38.437 70.655 0 152.43 86.71 152.43 107.007 0 6.29-4.865 10.496-8.34 10.496z"/><glyph unicode="î˜" d="M219.063 593.92H366.08v147.017H219.063V593.92zm219.428 0h147.02v147.017H438.49V593.92zm219.43 147.017V593.92h147.02v147.017H657.92zM219.068 374.49H366.08v147.02H219.063V374.49zm219.428 0h147.02v147.02H438.49V374.49zm219.43 0H804.94v147.02H657.92V374.49zm-438.86-219.426H366.08V302.08H219.063V155.063zm219.43 0h147.02V302.08H438.49V155.063zm219.43 0H804.94V302.08H657.92V155.063z"/><glyph unicode="" d="M711.607 401.59l-5.486-5.52c21.07 27.793 32.88 60.196 32.22 94.72-1.97 99.217-106.68 177.626-233.87 175.14-127.23-2.487-228.79-84.992-226.815-184.21 1.94-99.182 106.68-177.554 233.91-175.067 28.637.585 50.434-5.815 75.63 2.12l159.234-78.7c-.038-.038-71.06 124.964-34.817 171.52z"/><glyph unicode="î˜" d="M236.946 466.286h550.107v-36.57H236.946v36.57z"/><glyph unicode="î˜" d="M749.13 663.698C597.027 570.44 486.655 452.79 437.064 393.764l-121.417 95.16-53.65-43.265 209.847-213.4c36.096 92.49 150.49 273.3 290.158 401.736l-12.873 29.696z"/><glyph unicode="" d="M434.87 259.95c-35.217 0-63.706-28.526-63.706-63.744 0-35.182 28.49-63.67 63.707-63.67 35.188 0 63.71 28.488 63.71 63.67 0 35.218-28.523 63.744-63.704 63.744zm219.978 0c-35.218 0-63.707-28.526-63.707-63.744 0-35.182 28.49-63.67 63.71-63.67 35.148 0 63.71 28.488 63.71 63.67 0 35.218-28.562 63.744-63.707 63.744zm129.426 356.79H357.047s-25.93 70.072-49.957 113.372c-24.027 43.227-57.893 32.037-57.893 32.037-26.843 0-39.314-16.06-39.314-42.977 0-26.843 16.457-48.64 43.337-48.64l16.603-14.848 121.93-330.534 356.424-.255s65.17 261.706 61.806 251.356c11.96 36.975-3.255 40.486-25.71 40.486zm-391.79-124.196c-18.724 0-33.9 15.177-33.9 33.902s15.176 33.902 33.9 33.902 33.903-15.177 33.903-33.902-15.177-33.902-33.902-33.902zm72.45-113.152c-18.726 0-33.903 15.177-33.903 33.902s15.18 33.902 33.908 33.902 33.902-15.177 33.902-33.902-15.178-33.902-33.903-33.902zM502.2 492.544c-18.727 0-33.904 15.177-33.904 33.902s15.177 33.902 33.902 33.902 33.9-15.177 33.9-33.902-15.176-33.902-33.9-33.902zm72.446-113.152c-18.725 0-33.865 15.177-33.865 33.902s15.18 33.902 33.87 33.902 33.938-15.177 33.938-33.902-15.214-33.902-33.938-33.902zm37.266 113.152c-18.725 0-33.938 15.177-33.938 33.902s15.214 33.902 33.938 33.902 33.865-15.177 33.865-33.902-15.14-33.902-33.865-33.902zm72.448-113.152c-18.724 0-33.864 15.177-33.864 33.902s15.14 33.902 33.865 33.902 33.94-15.177 33.94-33.902-15.21-33.902-33.94-33.902zm37.267 113.152c-18.725 0-33.938 15.177-33.938 33.902s15.21 33.902 33.932 33.902 33.865-15.177 33.865-33.902-15.14-33.902-33.865-33.902z"/><glyph unicode="" d="M642.487 578.304c11.96 0 21.65 9.69 21.65 21.65v77.934c0 11.96-9.69 21.65-21.65 21.65-11.922 0-21.65-9.69-21.65-21.65v-77.934c.037-11.96 9.728-21.65 21.65-21.65zm-260.645 0c11.922 0 21.65 9.69 21.65 21.65v77.934c0 11.96-9.728 21.65-21.65 21.65-11.96 0-21.65-9.69-21.65-21.65v-77.934c.037-11.96 9.69-21.65 21.65-21.65zm289.427 58.258v-.402c8.99-7.973 14.7-19.566 14.7-32.55 0-23.99-19.46-43.446-43.487-43.446-23.99 0-43.447 19.456-43.447 43.447 0 12.95 5.705 24.58 14.702 32.55v.407H410.59v-.402c8.996-7.972 14.7-19.565 14.7-32.55 0-23.99-19.455-43.445-43.446-43.445-24.027 0-43.447 19.455-43.447 43.446 0 12.947 5.67 24.577 14.665 32.55v.402h-96.84v-440.1h511.56v440.1H671.27zM732.08 234.57h-437.76v291.69h437.76V234.57zM619.3 407.11h-55.15V352h55.15v55.113zm0 82.908h-55.15v-55.11h55.15v55.113zm0-163.51h-55.15v-55.15h55.15v55.15zm77.642 163.51h-55.15v-55.11h55.15v55.113zm0-82.907h-55.15V352h55.15v55.113zm-310.675-80.6h-55.113v-55.15h55.113v55.15zm77.715 0h-55.15v-55.15h55.15v55.15zm0 80.606h-55.15V352h55.15v55.113zm-77.715 0h-55.113V352h55.113v55.113zm155.32 0h-55.114V352h55.113v55.113zm0 82.908h-55.114v-55.11h55.113v55.114zm-77.605 0h-55.15v-55.11h55.15v55.114zm77.604-163.51h-55.113v-55.15h55.113v55.15z"/><glyph unicode="" d="M512 677.742L302.994 424.485h136.338v-206.19H584.63v206.19h136.375z"/><glyph unicode="" d="M584.63 471.515V677.74H439.334V471.516h-136.34L512 218.296l209.007 253.22z"/><glyph unicode="" d="M836.462 183.918s-109.64 112.677-153.38 156.233c-19.055 19.02-32.074 31.93-32.074 31.93 14.848 21.21 26.405 44.36 34.633 69.34s12.367 51.24 12.367 78.85c0 35.62-6.802 69.083-20.334 100.46-13.57 31.306-32 58.698-55.406 82.03-23.37 23.44-50.725 41.875-82.066 55.407-31.304 13.605-64.767 20.37-100.39 20.37-35.582 0-69.045-6.802-100.423-20.37-31.305-13.53-58.55-31.963-81.664-55.406-23.08-23.297-41.437-50.69-54.97-81.994-13.566-31.378-20.332-64.84-20.332-100.462s6.8-69.083 20.334-100.39c13.534-31.304 31.89-58.66 54.97-82.102 23.114-23.33 50.323-41.8 81.665-55.37 31.377-13.564 64.84-20.293 100.424-20.293 27.647 0 53.942 4.022 78.884 12.287s48.09 19.858 69.303 34.706c0 0 11.923-11.96 29.697-29.805 48.422-48.603 155.027-159.16 155.027-159.16 16.02-6.984 41.73.44 54.456 11.338s19.857 33.683 9.29 52.408zM612.718 447.013c-9.838-22.747-23.223-42.57-40.155-59.43-16.933-16.932-36.718-30.353-59.43-40.19-22.637-9.875-46.847-14.776-72.52-14.776-26.258 0-50.688 4.937-73.362 14.775-22.67 9.838-42.49 23.26-59.423 40.192-16.896 16.86-30.354 36.68-40.155 59.43-9.84 22.6-14.74 47.103-14.74 73.288 0 25.673 4.9 50.03 14.74 72.997 9.837 22.93 23.26 42.892 40.154 59.79 16.933 16.97 36.754 30.352 59.43 40.153 22.673 9.91 47.103 14.738 73.36 14.738 25.674 0 49.884-4.863 72.522-14.737 22.674-9.8 42.496-23.186 59.43-40.155 16.932-16.933 30.317-36.9 40.154-59.83 9.872-22.968 14.736-47.324 14.736-72.998 0-26.15-4.9-50.65-14.738-73.253z"/><glyph unicode="" d="M695.845 602.66l-29.147 29.112L512 477.038 357.268 631.772l-29.11-29.11L482.89 447.926 328.266 293.303l29.11-29.074L512 418.81l154.664-154.58 29.038 29.073-154.586 154.624z"/><glyph unicode="" d="M470.418 450.158l132.79 136.558-27.793 26.075L417.06 449.94l9.62-9.033-.11-.146 153.233-157.55 27.137 26.59z"/><glyph unicode="" d="M512 539.94L339.602 356.06h344.795z"/><glyph unicode="" d="M392.12 622.043V273.956L631.844 448z"/><glyph unicode="" d="M392.12 448l239.725-174.043v348.087z"/><glyph unicode="" d="M237.714 191.16h73.728v513.68h-73.728V191.16zm548.572 511.926H346.003v-292.17h440.283l-148.078 144.13 148.078 148.04z"/><glyph unicode="" d="M787.054 466.36h-256.22v256.694h-36.57V466.36H236.947v-36.572h257.317v-256.84h36.57v256.84h256.22z"/><glyph unicode="î˜" d="M769.134 594.286v36.57h-513.17v-25.27l-1.097-1.097 1.097-1.1v-9.11h.622V301.71h-.622v-8.56l-1.097-1.095 1.097-1.098v-25.82h513.17v36.57h-.585v292.57h.58zM703.89 301.714H316.233l119.88 119.88-25.855 25.857L293.12 330.32v236.36L513.134 349.59l25.856 25.855-1.39 1.353 194.377 194.34v-245.87l-122.15 122.15-25.855-25.856L703.89 301.714zM317.22 594.286h386.16l-191.782-191.78-194.377 191.78z"/><glyph unicode="" d="M310.747 210.36h109.166v328.484H310.747V210.36zM604.05 355.583V210.36h109.202v145.224H604.05zM457.4 210.36h109.2v475.318H457.4v-475.32z"/><glyph unicode="" d="M310.747 210.36h109.166v328.484H310.747V210.36zm37.194 293.265h36.87V246.857h-36.87v256.768zm256.11-148.04V210.358h109.207v145.224H604.05zm73.29-108.874h-36.83v71.87h36.83v-71.87zM457.4 210.36h109.2v475.318H457.4v-475.32zm36.863 439.478h36.827V247.004h-36.827v402.834z"/><glyph unicode="î˜ " d="M519.57 665.893c-127.232 2.487-231.936-75.922-233.91-175.14-.696-34.488 11.153-66.927 32.218-94.72l-5.486 5.52c36.242-46.518-34.816-171.52-34.816-171.52l159.232 78.703c25.16-7.936 46.994-1.536 75.63-2.12 127.232-2.49 231.972 75.884 233.91 175.064 2.012 99.255-99.51 181.723-226.778 184.21z"/><glyph unicode="" d="M514.158 489.582l136.558-132.79 26.075 27.793L513.94 542.94 347.21 380.196l26.588-27.136z"/><glyph unicode="" d="M509.842 406.418l-136.558 132.79-26.075-27.793L510.06 353.06l166.73 162.744-26.588 27.136z"/><glyph unicode="" d="M938.824 426.028l-.504 106.238L512 958.588 85.678 532.266l-.504-106.238L474.618 815.47V-64.536h74.764V815.47z"/><glyph unicode="" d="M1.994 518.75h748.928L467.644 809.956h200.254L1022.006 446 667.898 82.044H467.644l283.278 291.174H1.994V518.75z"/><glyph unicode="" d="M1022.006 375.25H273.078L556.356 84.044H356.102L1.994 448l354.108 363.956h200.254L273.078 520.782h748.928V375.25z"/><glyph unicode="" d="M85.174 468.026l.504-106.238L512-64.536l426.32 426.324.504 106.238L549.38 78.582l.002 880.006h-74.764V78.584z"/><glyph unicode="" d="M511.963 831.086c-211.53 0-383.05-171.52-383.05-383.086S300.398 64.914 511.963 64.914C723.566 64.914 895.05 236.397 895.05 448S723.565 831.086 511.962 831.086zm0-36.572c191.086 0 346.514-155.43 346.514-346.514 0-79.91-27.43-153.344-73.07-212.04-5.486 1.974-11.008 3.84-16.274 6.106-34.926 14.63-73.8 31.78-108.654 46.153-9.917 2.7-19.937 5.41-29.848 8.15-11.85 8.154-23.59 35.364-29.915 48.932-6.29.914-12.654 1.792-19.017 2.633.915 20.99 13.935 22.125 19.018 38.07 4.5 14.08.514 32.44 7.57 45.495 4.94 9.07 16.13 9.07 21.65 16.934 5.085 6.984 8.41 19.272 9.986 27.94 2.853 15.8 5.34 37.34-2.158 53.03-4.28 8.96-6.985 9.873-8.23 20.735-1.425 13.274 3.914 56.43 4.134 65.754.513 24.21-.072 26.15-5.924 49.737 0 0-7.058 21.36-18.213 27.83l-22.272 3.805L573.55 710c-55.37 34.085-114.76 10.167-146.505-2.67-45.824-14.885-74.79-59.758-54.565-155.538 3.474-16.42-8.96-23.698-8.155-32.658 1.83-19.566 2.158-66.487 20.59-78.08 1.72-1.06 14.81-4.352 14.738-3.438 1.794-19.017 3.623-38.07 5.378-57.015 4.61-12.65 15.69-14.08 18.91-31.923l-14.152-3.438c-6.362-13.57-17.992-40.778-29.878-48.934-9.948-2.705-19.93-5.412-29.88-8.154-34.89-14.373-73.69-31.49-108.654-46.153-1.902-.77-3.877-1.39-5.815-2.16-43.775 58.11-70.07 130.01-70.07 208.165 0 191.086 155.43 346.514 346.478 346.514z"/></font></defs></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg"><defs><font id="Blank-Theme-Icons" horiz-adv-x="1024"><font-face units-per-em="1024" ascent="960" descent="-64"/><missing-glyph horiz-adv-x="1024"/><glyph unicode=" " d="" horiz-adv-x="512"/><glyph unicode="" d="M676.571 637.696c-59.867 28.197-131.255 2.523-159.415-57.307-1.975-4.133-3.657-9.362-5.157-15.397-1.499 6.034-3.182 11.264-5.157 15.397-28.197 59.831-99.547 85.504-159.415 57.307-59.831-28.197-85.504-99.547-57.271-159.378 28.197-59.867 221.806-231.424 221.806-231.424s0 0.219 0.037 0.585c0.037-0.366 0.037-0.585 0.037-0.585s193.646 171.557 221.806 231.424c28.233 59.831 2.597 131.182-57.271 159.378z"/><glyph unicode="" d="M676.571 637.696c-59.831 28.197-131.218 2.523-159.451-57.307-1.938-4.133-3.657-9.362-5.157-15.397-1.463 6.034-3.182 11.264-5.157 15.397-28.16 59.831-99.547 85.504-159.378 57.307s-85.467-99.547-57.271-159.378 221.806-231.424 221.806-231.424 0 0.219 0.037 0.585c0-0.402 0-0.622 0-0.622s193.646 171.557 221.842 231.424c28.233 59.867 2.597 131.218-57.271 159.415zM690.213 479.232c-25.417-43.776-174.007-184.722-174.007-184.722l-1.573 2.999c0 0-155.465 140.398-181.211 183.991-30.61 51.822-7.753 108.946 38.949 128.439 43.52 18.176 101.888-27.319 123.502-73.143 1.499-3.182 17.627-1.463 18.798-6.107 1.134 4.645 12.727 2.926 14.226 6.107 21.577 45.824 81.042 93.989 128 72.411 46.007-21.138 66.926-72.155 33.317-129.975z"/><glyph unicode="" d="M512 704.11l-296.85-512.256h593.701l-296.85 512.256zM544.219 254.135h-62.757v49.92h62.757v-49.92zM528.713 343.369h-31.269l-20.809 140.654-1.207 72.704h72.521v-72.704l-19.237-140.654z"/><glyph unicode="" d="M628.846 588.544c-34.085 28.343-75.63 42.24-116.773 42.24-47.47 0-94.757-18.578-130.085-54.382l-32.073 29.586-0.585-102.693 110.994-0.658-39.424 41.253c25.198 24.027 58.002 36.315 91.136 36.352 29.842-0.037 59.721-9.947 84.517-30.574 31.488-26.222 47.689-63.744 47.726-101.815 0-5.449-0.366-10.971-1.024-16.457l51.383 9.874c0.073 2.231 0.146 4.425 0.146 6.619 0.037 52.37-22.491 104.521-65.938 140.654zM603.794 352.768c-25.307-24.466-58.405-37.010-91.867-37.047-29.879 0.037-59.721 9.984-84.517 30.574-31.488 26.222-47.689 63.744-47.726 101.778 0 6.327 0.475 12.617 1.353 18.871l-51.602-9.691c-0.146-3.072-0.256-6.107-0.256-9.179-0.037-52.334 22.491-104.521 65.975-140.617 34.048-28.343 75.593-42.24 116.736-42.24h0.11c47.799 0 95.378 18.907 130.743 55.223l33.938-33.829 0.219 106.094-112.055 0.293 38.949-40.229z"/><glyph unicode="" d="M696.942 624.933l-19.273 6.107h-74.496v38.583l-12.544 21.029-22.711 13.495h-111.141l-23.333-13.495-12.581-21.029v-38.619h-73.765l-18.761-6.656-17.189-14.153v-88.869h19.017v-0.073h17.554v-329.435h36.571v0.293h255.415v-0.293h36.571v329.435h18.286v0.073h18.286v86.601l-15.909 17.006zM457.435 667.575h109.129v-36.571h-109.129v36.571zM639.707 228.718h-255.415v292.571h255.415v-292.571zM676.279 557.934h-328.558v36.498h328.558v-36.498zM457.435 483.511h-36.571v-218.587h36.571v218.587zM530.578 483.511h-36.571v-218.587h36.571v218.587zM603.721 483.511h-36.571v-218.587h36.571v218.587z"/><glyph unicode="" d="M804.645 515.401c-1.499 4.681-5.888 7.899-10.789 7.899h-206.958l-64.073 196.754c-1.536 4.645-5.888 7.826-10.825 7.826-4.901 0-9.289-3.182-10.825-7.863l-64.439-196.754h-206.592c-4.901 0-9.289-3.218-10.825-7.863-1.499-4.681 0.146-9.874 4.096-12.763l167.205-121.783-64.439-197.851c-1.536-4.681 0.146-9.838 4.133-12.727 3.95-2.889 9.399-2.889 13.349 0l168.338 122.185 167.936-122.149c2.011-1.463 4.315-2.231 6.693-2.231s4.681 0.768 6.693 2.231c4.023 2.889 5.669 8.009 4.133 12.727l-64.439 197.851 167.57 121.783c3.95 2.889 5.632 8.046 4.059 12.727z"/><glyph unicode="" d="M807.241 415.854v67.145l-9.509 3.145-71.936 23.442-19.2 46.373 36.937 78.080-47.506 47.506-8.923-4.498-67.438-34.304-46.373 19.2-29.111 81.298h-67.182l-26.624-81.445-46.336-19.163-78.043 36.901-47.506-47.506 4.498-8.96 34.267-67.438-19.2-46.336-81.298-29.074v-67.218l9.472-3.072 71.973-23.515 19.163-46.373-36.901-78.080 47.506-47.506 8.887 4.498 67.474 34.304 46.373-19.2 29.111-81.298h67.182l3.072 9.509 23.515 71.936 46.373 19.2 78.080-36.937 47.506 47.506-4.498 8.923-34.304 67.438 19.2 46.373 81.298 29.147zM512 353.938c-51.968 0-94.062 42.13-94.062 94.062 0 52.005 42.094 94.062 94.062 94.062 51.931 0 94.098-42.057 94.098-94.062-0.037-51.931-42.167-94.062-94.098-94.062z"/><glyph unicode="" d="M339.602 539.941l172.398-183.881 172.398 183.881z"/><glyph unicode="" d="M606.939 449.938l-158.391 162.853-27.794-26.075 132.827-136.558-136.521-140.361 27.173-26.587 153.198 157.55-0.146 0.146z"/><glyph unicode="" d="M127.634 740.571v-73.143h768.731v73.143h-768.731zM127.634 411.429h768.731v73.143h-768.731v-73.143zM127.634 155.429h768.731v73.143h-768.731v-73.143z"/><glyph unicode="" d="M512 742.217c-102.437 0-185.417-83.054-185.417-185.454 0-102.437 185.417-403.017 185.417-403.017s185.454 300.581 185.454 403.017c-0.037 102.437-83.017 185.454-185.454 185.454zM512 500.443c-31.122 0-56.357 25.198-56.357 56.357 0 31.086 25.234 56.357 56.357 56.357 31.159 0 56.393-25.271 56.393-56.357-0.037-31.159-25.271-56.357-56.393-56.357z"/><glyph unicode="" d="M219.429 485.595h255.927v254.793h-255.927v-254.793zM548.571 740.389v-109.349h256v109.349h-256zM219.429 156.453h255.927v254.793h-255.927v-254.793zM548.571 484.754h256v109.349h-256v-109.349zM548.571 301.897h256v109.349h-256v-109.349zM548.571 155.611h256v109.349h-256v-109.349z"/><glyph unicode="" d="M579.511 677.010c-30.793 0-57.381-25.161-57.381-55.954 0-28.635 18.907-47.579 47.579-47.579 31.415 0 58.002 23.771 58.002 55.991 0 28.709-20.224 47.543-48.201 47.543zM593.518 336.494c-9.801 0-48.311-59.502-69.266-59.502-5.595 0-8.375 4.937-8.375 9.801 0 11.227 7.68 28.709 11.849 39.205l50.322 136.375c25.198 67.84-6.985 86.016-37.047 86.016-40.558 0-76.946-20.297-104.887-46.848-9.106-9.070-39.863-38.437-39.863-51.054 0-4.133 4.169-9.070 9.106-9.070 12.544 0 46.153 60.855 72.009 60.855 5.595 0 11.886-6.29 6.985-18.871l-48.896-123.173c-4.937-11.849-28.709-69.23-28.709-102.802 0-26.587 17.518-38.437 42.679-38.437 70.656 0 152.43 86.711 152.43 107.008 0 6.29-4.864 10.496-8.338 10.496z"/><glyph unicode="" d="M219.063 593.92h147.017v147.017h-147.017v-147.017zM438.491 593.92h147.017v147.017h-147.017v-147.017zM657.92 740.937v-147.017h147.017v147.017h-147.017zM219.063 374.491h147.017v147.017h-147.017v-147.017zM438.491 374.491h147.017v147.017h-147.017v-147.017zM657.92 374.491h147.017v147.017h-147.017v-147.017zM219.063 155.063h147.017v147.017h-147.017v-147.017zM438.491 155.063h147.017v147.017h-147.017v-147.017zM657.92 155.063h147.017v147.017h-147.017v-147.017z"/><glyph unicode="" d="M711.607 401.591l-5.486-5.522c21.065 27.794 32.878 60.197 32.219 94.72-1.975 99.218-106.679 177.627-233.874 175.141-127.232-2.487-228.791-84.992-226.816-184.21 1.938-99.182 106.679-177.554 233.911-175.067 28.635 0.585 50.432-5.815 75.63 2.121l159.232-78.702c-0.037-0.037-71.058 124.965-34.816 171.52z"/><glyph unicode="" d="M236.946 466.286h550.107v-36.571h-550.107v36.571z"/><glyph unicode="" d="M749.129 663.698c-152.101-93.257-262.473-210.907-312.064-269.934l-121.417 95.159-53.65-43.264 209.847-213.394c36.096 92.489 150.491 273.298 290.158 401.737l-12.873 29.696z"/><glyph unicode="" d="M434.871 259.95c-35.218 0-63.707-28.526-63.707-63.744 0-35.182 28.489-63.671 63.707-63.671 35.182 0 63.707 28.489 63.707 63.671 0 35.218-28.526 63.744-63.707 63.744zM654.848 259.95c-35.218 0-63.707-28.526-63.707-63.744 0-35.182 28.489-63.671 63.707-63.671 35.145 0 63.707 28.489 63.707 63.671 0 35.218-28.562 63.744-63.707 63.744zM784.274 616.741c-163.511 0-427.227 0-427.227 0s-25.929 70.071-49.957 113.371c-24.027 43.227-57.893 32.037-57.893 32.037-26.843 0-39.314-16.055-39.314-42.971 0-26.843 16.457-48.64 43.337-48.64l16.603-14.848 121.929-330.533 356.425-0.256c0 0 65.17 261.705 61.806 251.355 11.959 36.974-3.255 40.485-25.71 40.485zM392.485 492.544c-18.725 0-33.902 15.177-33.902 33.902s15.177 33.902 33.902 33.902 33.902-15.177 33.902-33.902-15.177-33.902-33.902-33.902zM464.933 379.392c-18.725 0-33.902 15.177-33.902 33.902s15.177 33.902 33.902 33.902 33.902-15.177 33.902-33.902-15.177-33.902-33.902-33.902zM502.199 492.544c-18.725 0-33.902 15.177-33.902 33.902s15.177 33.902 33.902 33.902 33.902-15.177 33.902-33.902-15.177-33.902-33.902-33.902zM574.647 379.392c-18.725 0-33.865 15.177-33.865 33.902s15.177 33.902 33.865 33.902 33.938-15.177 33.938-33.902-15.214-33.902-33.938-33.902zM611.913 492.544c-18.725 0-33.938 15.177-33.938 33.902s15.214 33.902 33.938 33.902 33.865-15.177 33.865-33.902-15.141-33.902-33.865-33.902zM684.361 379.392c-18.725 0-33.865 15.177-33.865 33.902s15.141 33.902 33.865 33.902 33.938-15.177 33.938-33.902-15.214-33.902-33.938-33.902zM721.627 492.544c-18.725 0-33.938 15.177-33.938 33.902s15.214 33.902 33.938 33.902 33.865-15.177 33.865-33.902-15.141-33.902-33.865-33.902z"/><glyph unicode="" d="M642.487 578.304c11.959 0 21.65 9.691 21.65 21.65v77.934c0 11.959-9.691 21.65-21.65 21.65-11.922 0-21.65-9.691-21.65-21.65v-77.934c0.037-11.959 9.728-21.65 21.65-21.65zM381.842 578.304c11.922 0 21.65 9.691 21.65 21.65v77.934c0 11.959-9.728 21.65-21.65 21.65-11.959 0-21.65-9.691-21.65-21.65v-77.934c0.037-11.959 9.691-21.65 21.65-21.65zM671.269 636.562v-0.402c8.997-7.973 14.702-19.566 14.702-32.549 0-23.991-19.456-43.447-43.483-43.447-23.991 0-43.447 19.456-43.447 43.447 0 12.946 5.705 24.576 14.702 32.549v0.402h-203.154v-0.402c8.997-7.973 14.702-19.566 14.702-32.549 0-23.991-19.456-43.447-43.447-43.447-24.027 0-43.447 19.456-43.447 43.447 0 12.946 5.669 24.576 14.665 32.549v0.402h-96.841v-440.101h511.561v440.101h-96.512zM732.087 234.569h-437.76v291.694h437.76v-291.694zM619.301 407.113h-55.15v-55.113h55.15v55.113zM619.301 490.021h-55.15v-55.113h55.15v55.113zM619.301 326.51h-55.15v-55.15h55.15v55.15zM696.942 490.021h-55.15v-55.113h55.15v55.113zM696.942 407.113h-55.15v-55.113h55.15v55.113zM386.267 326.51h-55.113v-55.15h55.113v55.15zM463.982 326.51h-55.15v-55.15h55.15v55.15zM463.982 407.113h-55.15v-55.113h55.15v55.113zM386.267 407.113h-55.113v-55.113h55.113v55.113zM541.586 407.113h-55.113v-55.113h55.113v55.113zM541.586 490.021h-55.113v-55.113h55.113v55.113zM463.982 490.021h-55.15v-55.113h55.15v55.113zM541.586 326.51h-55.113v-55.15h55.113v55.15z"/><glyph unicode="" d="M512 677.742l-209.006-253.257h136.338v-206.19h145.298v206.19h136.375z"/><glyph unicode="" d="M584.631 471.515v206.226h-145.298v-206.226h-136.338l209.006-253.221 209.006 253.221z"/><glyph unicode="" d="M836.462 183.918c0 0-109.641 112.677-153.381 156.233-19.054 19.017-32.073 31.927-32.073 31.927 14.848 21.211 26.405 44.361 34.633 69.339s12.361 51.237 12.361 78.848c0 35.621-6.802 69.083-20.334 100.462-13.568 31.305-32 58.697-55.406 82.030-23.369 23.442-50.725 41.874-82.066 55.406-31.305 13.605-64.768 20.37-100.389 20.37-35.584 0-69.047-6.802-100.425-20.37-31.305-13.531-58.551-31.963-81.664-55.406-23.077-23.296-41.435-50.688-54.967-81.993-13.568-31.378-20.334-64.841-20.334-100.462s6.802-69.083 20.334-100.389c13.531-31.305 31.89-58.661 54.967-82.103 23.113-23.333 50.322-41.801 81.664-55.369 31.378-13.568 64.841-20.297 100.425-20.297 27.648 0 53.943 4.023 78.885 12.288s48.091 19.858 69.303 34.706c0 0 11.922-11.959 29.696-29.806 48.421-48.603 155.026-159.159 155.026-159.159 16.018-6.985 41.728 0.439 54.455 11.337s19.858 33.682 9.289 52.407zM612.718 447.013c-9.838-22.747-23.223-42.569-40.155-59.429-16.933-16.933-36.718-30.354-59.429-40.192-22.638-9.874-46.848-14.775-72.521-14.775-26.258 0-50.688 4.937-73.362 14.775s-42.496 23.259-59.429 40.192c-16.896 16.859-30.354 36.681-40.155 59.429-9.838 22.601-14.738 47.104-14.738 73.289 0 25.673 4.901 50.030 14.738 72.997 9.838 22.93 23.259 42.898 40.155 59.794 16.933 16.969 36.754 30.354 59.429 40.155 22.674 9.911 47.104 14.738 73.362 14.738 25.673 0 49.883-4.864 72.521-14.738 22.674-9.801 42.496-23.186 59.429-40.155 16.933-16.933 30.318-36.901 40.155-59.831 9.874-22.967 14.738-47.323 14.738-72.997 0-26.149-4.901-50.651-14.738-73.253z"/><glyph unicode="" d="M695.845 602.661l-29.147 29.111-154.697-154.734-154.734 154.734-29.111-29.111 154.734-154.734-154.624-154.624 29.111-29.074 154.624 154.587 154.661-154.587 29.038 29.074-154.587 154.624z"/><glyph unicode="" d="M470.418 450.158l132.791 136.558-27.794 26.075-158.354-162.853 9.618-9.033-0.11-0.146 153.234-157.55 27.136 26.587z"/><glyph unicode="" d="M512 539.941l-172.398-183.881h344.795z"/><glyph unicode="" d="M392.119 622.043v-348.087l239.726 174.043z"/><glyph unicode="" d="M392.119 448l239.726-174.043v348.087z"/><glyph unicode="" d="M237.714 191.159h73.728v513.682h-73.728v-513.682zM786.286 703.086h-440.283v-292.169h440.283l-148.078 144.128 148.078 148.041z"/><glyph unicode="" d="M787.054 466.359h-256.219v256.695h-36.571v-256.695h-257.317v-36.571h257.317v-256.841h36.571v256.841h256.219z"/><glyph unicode="" d="M769.134 594.286v36.571h-513.17v-25.271l-1.097-1.097 1.097-1.097v-9.106h0.622v-292.571h-0.622v-8.558l-1.097-1.097 1.097-1.097v-25.819h513.17v36.571h-0.585v292.571h0.585zM703.89 301.714h-387.657l119.881 119.881-25.856 25.856-117.138-117.138v236.361l220.014-217.088 25.856 25.856-1.39 1.353 194.377 194.341v-245.87l-122.149 122.149-25.856-25.856 119.918-119.845zM317.221 594.286h386.158l-191.781-191.781-194.377 191.781z"/><glyph unicode="" d="M310.747 210.359h109.166v328.485h-109.166v-328.485zM604.050 355.584v-145.225h109.202v145.225h-109.202zM457.399 210.359h109.202v475.319h-109.202v-475.319z"/><glyph unicode="" d="M310.747 210.359h109.166v328.485h-109.166v-328.485zM347.941 503.625h36.864v-256.768h-36.864v256.768zM604.050 355.584v-145.225h109.202v145.225h-109.202zM677.339 246.711h-36.827v71.863h36.827v-71.863zM457.399 210.359h109.202v475.319h-109.202v-475.319zM494.263 649.838h36.827v-402.834h-36.827v402.834z"/><glyph unicode="" d="M519.57 665.893c-127.232 2.487-231.936-75.922-233.911-175.141-0.695-34.487 11.154-66.926 32.219-94.72l-5.486 5.522c36.242-46.519-34.816-171.52-34.816-171.52l159.232 78.702c25.161-7.936 46.994-1.536 75.63-2.121 127.232-2.487 231.973 75.886 233.911 175.067 2.011 99.255-99.511 181.723-226.779 184.21z"/><glyph unicode="" d="M514.158 489.582l136.558-132.791 26.075 27.794-162.853 158.354-166.729-162.743 26.587-27.136z"/><glyph unicode="" d="M509.842 406.418l-136.558 132.791-26.075-27.794 162.853-158.354 166.729 162.743-26.587 27.136z"/><glyph unicode="" d="M938.824 426.028l-0.504 106.238-426.32 426.322-426.322-426.322-0.504-106.238 389.444 389.442v-880.006h74.764v880.006z"/><glyph unicode="" d="M1.994 518.75h748.928l-283.278 291.206h200.254l354.108-363.956-354.108-363.956h-200.254l283.278 291.174h-748.928v145.532z"/><glyph unicode="" d="M1022.006 375.25h-748.928l283.278-291.206h-200.254l-354.108 363.956 354.108 363.956h200.254l-283.278-291.174h748.928v-145.532z"/><glyph unicode="" d="M85.174 468.026l0.504-106.238 426.322-426.324 426.32 426.324 0.504 106.238-389.444-389.444 0.002 880.006h-74.764v-880.004z"/><glyph unicode="" d="M511.963 831.086c-211.529 0-383.049-171.52-383.049-383.086s171.483-383.086 383.049-383.086c211.602 0 383.086 171.483 383.086 383.086s-171.483 383.086-383.086 383.086zM511.963 794.514c191.086 0 346.514-155.429 346.514-346.514 0-79.909-27.429-153.344-73.070-212.041-5.486 1.975-11.008 3.84-16.274 6.107-34.926 14.629-73.801 31.781-108.654 46.153-9.911 2.706-19.931 5.413-29.842 8.155-11.849 8.155-23.589 35.365-29.915 48.933-6.29 0.914-12.654 1.792-19.017 2.633 0.914 20.992 13.934 22.126 19.017 38.071 4.498 14.080 0.512 32.439 7.57 45.495 4.937 9.070 16.128 9.070 21.65 16.933 5.083 6.985 8.411 19.273 9.984 27.941 2.853 15.799 5.339 37.339-2.158 53.029-4.279 8.96-6.985 9.874-8.229 20.736-1.426 13.275 3.913 56.43 4.133 65.755 0.512 24.21-0.073 26.149-5.925 49.737 0 0-7.058 21.358-18.213 27.831l-22.272 3.803-13.714 12.727c-55.369 34.085-114.761 10.167-146.505-2.67-45.824-14.885-74.789-59.758-54.565-155.538 3.474-16.421-8.96-23.698-8.155-32.658 1.829-19.566 2.158-66.487 20.59-78.080 1.719-1.061 14.811-4.352 14.738-3.438 1.792-19.017 3.621-38.071 5.376-57.015 4.608-12.654 15.689-14.080 18.907-31.927l-14.153-3.438c-6.363-13.568-17.993-40.777-29.879-48.933-9.947-2.706-19.931-5.413-29.879-8.155-34.889-14.373-73.691-31.488-108.654-46.153-1.902-0.768-3.877-1.39-5.815-2.158-43.776 58.112-70.071 130.011-70.071 208.165 0 191.086 155.429 346.514 346.478 346.514z"/><glyph unicode="" d="M427.703 653.019c0-10.569-8.558-19.090-19.090-19.090h-11.154c-10.533 0-19.090 8.521-19.090 19.090v68.462c0 10.533 8.594 19.090 19.090 19.090h11.154c10.533 0 19.090-8.558 19.090-19.090v-68.462zM645.778 653.019c0-10.569-8.521-19.090-19.054-19.090h-11.154c-10.533 0-19.054 8.521-19.054 19.090v68.462c-0.037 10.533 8.485 19.090 19.054 19.090h11.154c10.533 0 19.054-8.558 19.054-19.090v-68.462zM675.182 481.317l-38.729 31.598-152.795-187.282-81.518 64.805-28.891-36.242 120.21-95.634zM758.784 687.982h-71.351v-29.769c0-31.634-25.746-57.344-57.271-57.344h-11.227c-31.598 0-57.271 25.71-57.271 57.344v29.769h-97.682v-29.769c0-31.634-25.71-57.344-57.307-57.344h-11.154c-31.598 0-57.307 25.71-57.307 57.344v29.769h-72.96c-10.533 0-19.090-8.521-19.090-19.054v-494.373c-0.037-10.569 8.558-19.127 19.090-19.127h493.531c10.533 0 19.054 8.558 19.054 19.090v494.409c0 10.533-8.521 19.054-19.054 19.054zM720.567 240.677c0-10.569-8.558-19.090-19.090-19.090h-378.917c-10.569 0-19.090 8.521-19.090 19.090v288.11c0 10.569 8.521 19.054 19.090 19.054h378.88c10.533 0 19.090-8.485 19.090-19.054v-288.11z"/><glyph unicode="" d="M391.863 554.203h-128.219c-10.35 0-18.761-8.375-18.761-18.725v-91.429c0-10.35 8.375-18.725 18.761-18.725h128.219c10.35 0 18.761 8.375 18.761 18.725v91.429c0 10.386-8.375 18.725-18.761 18.725zM391.863 387.511h-90.734c-10.35 0-18.761-8.375-18.761-18.725v-194.633c0-10.35 8.411-18.725 18.761-18.725h90.734c10.35 0 18.761 8.375 18.761 18.725v194.633c0 10.35-8.375 18.725-18.761 18.725zM760.357 554.203h-279.845c-10.35 0-18.725-8.375-18.725-18.725v-91.429c0-10.35 8.375-18.725 18.725-18.725h279.845c10.313 0 18.725 8.375 18.725 18.725v91.429c-0.037 10.386-8.411 18.725-18.725 18.725zM721.701 385.573h-240.64c-10.313 0-18.725-8.375-18.725-18.761v-192.695c0-10.35 8.375-18.725 18.725-18.725h240.64c10.35 0 18.725 8.375 18.725 18.725v192.695c0 10.35-8.375 18.761-18.725 18.761zM507.355 575.634c21.87-3.986 42.971-6.327 62.647-6.327 99.072 0 152.832 53.248 153.088 103.387 0.183 32.293-23.698 67.291-78.117 67.84-72.923 0-118.089-51.493-141.605-89.71-23.918 38.107-69.266 88.576-142.373 88.576-52.882-0.549-76.763-35.547-76.581-67.84 0.256-50.139 54.016-103.424 153.088-103.424 0.037 0 0.037 0 0.037 0 21.394 0 44.398 2.414 68.425 7.241l1.39 0.256zM645.998 693.723c9.143-0.073 30.354-2.304 30.245-20.773-0.11-23.589-33.17-56.795-106.24-56.795-10.057 0-20.553 0.658-31.525 1.938 16.567 29.294 51.566 75.63 107.52 75.63zM437.504 614.985v0c-73.106 0-106.167 33.207-106.277 56.795-0.11 18.469 21.102 20.699 31.305 20.809 55.259 0 90.039-46.373 106.496-75.666-10.935-1.28-21.467-1.938-31.525-1.938z"/></font></defs></svg> diff --git a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf index 67e7a7f1588bfaee162257fda8b9526699071887..eaec02d1df42b6b0208db02f1da2a3fb3bcae7fd 100644 Binary files a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf and b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf differ diff --git a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff index 809752bf8e5bb222801a256a45bcdcea3b03d190..e9e8395b2574bc6cfbb3c2606213ca204179bf51 100644 Binary files a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff and b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff differ diff --git a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2 b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2 index 438e128ae281b026f6fa1309ca2e78b17cf18a8b..1d60f2f95c0facb689b7a0079cfb2b2312bcab17 100644 Binary files a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2 and b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2 differ diff --git a/lib/web/fonts/Blank-Theme-Icons/selection.json b/lib/web/fonts/Blank-Theme-Icons/selection.json index 307b07ce972e4209487d81adfe63a86024ae2012..e3a71a30c6ae96426ed01b4041c20ae392e1e909 100644 --- a/lib/web/fonts/Blank-Theme-Icons/selection.json +++ b/lib/web/fonts/Blank-Theme-Icons/selection.json @@ -1,6 +1,83 @@ { "IcoMoonType": "selection", "icons": [ + { + "icon": { + "paths": [ + "M427.703 306.981c0 10.569-8.558 19.090-19.090 19.090h-11.154c-10.533 0-19.090-8.521-19.090-19.090v-68.462c0-10.533 8.594-19.090 19.090-19.090h11.154c10.533 0 19.090 8.558 19.090 19.090v68.462z", + "M645.778 306.981c0 10.569-8.521 19.090-19.054 19.090h-11.154c-10.533 0-19.054-8.521-19.054-19.090v-68.462c-0.037-10.533 8.485-19.090 19.054-19.090h11.154c10.533 0 19.054 8.558 19.054 19.090v68.462z", + "M675.182 478.683l-38.729-31.598-152.795 187.282-81.518-64.805-28.891 36.242 120.21 95.634z", + "M758.784 272.018h-71.351v29.769c0 31.634-25.746 57.344-57.271 57.344h-11.227c-31.598 0-57.271-25.71-57.271-57.344v-29.769h-97.682v29.769c0 31.634-25.71 57.344-57.307 57.344h-11.154c-31.598 0-57.307-25.71-57.307-57.344v-29.769h-72.96c-10.533 0-19.090 8.521-19.090 19.054v494.373c-0.037 10.569 8.558 19.127 19.090 19.127h493.531c10.533 0 19.054-8.558 19.054-19.090v-494.409c0-10.533-8.521-19.054-19.054-19.054zM720.567 719.323c0 10.569-8.558 19.090-19.090 19.090h-378.917c-10.569 0-19.090-8.521-19.090-19.090v-288.11c0-10.569 8.521-19.054 19.090-19.054h378.88c10.533 0 19.090 8.485 19.090 19.054v288.11z" + ], + "attrs": [ + {}, + {}, + {}, + {} + ], + "isMulticolor": false, + "grid": 0, + "tags": [ + "gift-registry" + ] + }, + "attrs": [ + {}, + {}, + {}, + {} + ], + "properties": { + "order": 41, + "id": 36, + "prevSize": 32, + "code": 58920, + "name": "gift-registry" + }, + "setIdx": 0, + "setId": 1, + "iconIdx": 0 + }, + { + "icon": { + "paths": [ + "M391.863 405.797h-128.219c-10.35 0-18.761 8.375-18.761 18.725v91.429c0 10.35 8.375 18.725 18.761 18.725h128.219c10.35 0 18.761-8.375 18.761-18.725v-91.429c0-10.386-8.375-18.725-18.761-18.725z", + "M391.863 572.489h-90.734c-10.35 0-18.761 8.375-18.761 18.725v194.633c0 10.35 8.411 18.725 18.761 18.725h90.734c10.35 0 18.761-8.375 18.761-18.725v-194.633c0-10.35-8.375-18.725-18.761-18.725z", + "M760.357 405.797h-279.845c-10.35 0-18.725 8.375-18.725 18.725v91.429c0 10.35 8.375 18.725 18.725 18.725h279.845c10.313 0 18.725-8.375 18.725-18.725v-91.429c-0.037-10.386-8.411-18.725-18.725-18.725z", + "M721.701 574.427h-240.64c-10.313 0-18.725 8.375-18.725 18.761v192.695c0 10.35 8.375 18.725 18.725 18.725h240.64c10.35 0 18.725-8.375 18.725-18.725v-192.695c-0-10.35-8.375-18.761-18.725-18.761z", + "M507.355 384.366c21.87 3.986 42.971 6.327 62.647 6.327 99.072 0 152.832-53.248 153.088-103.387 0.183-32.293-23.698-67.291-78.117-67.84-72.923 0-118.089 51.493-141.605 89.71-23.918-38.107-69.266-88.576-142.373-88.576-52.882 0.549-76.763 35.547-76.581 67.84 0.256 50.139 54.016 103.424 153.088 103.424 0.037 0 0.037 0 0.037 0 21.394 0 44.398-2.414 68.425-7.241l1.39-0.256zM645.998 266.277c9.143 0.073 30.354 2.304 30.245 20.773-0.11 23.589-33.17 56.795-106.24 56.795-10.057 0-20.553-0.658-31.525-1.938 16.567-29.294 51.566-75.63 107.52-75.63zM437.504 345.015v0c-73.106 0-106.167-33.207-106.277-56.795-0.11-18.469 21.102-20.699 31.305-20.809 55.259 0 90.039 46.373 106.496 75.666-10.935 1.28-21.467 1.938-31.525 1.938z" + ], + "attrs": [ + {}, + {}, + {}, + {}, + {} + ], + "isMulticolor": false, + "grid": 0, + "tags": [ + "present" + ] + }, + "attrs": [ + {}, + {}, + {}, + {}, + {} + ], + "properties": { + "order": 43, + "id": 35, + "prevSize": 32, + "code": 58921, + "name": "present" + }, + "setIdx": 0, + "setId": 1, + "iconIdx": 1 + }, { "icon": { "paths": [ @@ -9,8 +86,10 @@ "grid": 0, "tags": [ "account" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 40, "id": 4, @@ -20,7 +99,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 0 + "setId": 1, + "iconIdx": 2 }, { "icon": { @@ -30,8 +110,10 @@ "grid": 0, "tags": [ "arrow-up-thin" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 36, "id": 3, @@ -41,7 +123,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 1 + "setId": 1, + "iconIdx": 3 }, { "icon": { @@ -51,8 +134,10 @@ "grid": 0, "tags": [ "arrow-right-thin" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 37, "id": 2, @@ -62,7 +147,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 2 + "setId": 1, + "iconIdx": 4 }, { "icon": { @@ -72,8 +158,10 @@ "grid": 0, "tags": [ "arrow-left-thin" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 38, "id": 1, @@ -83,7 +171,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 3 + "setId": 1, + "iconIdx": 5 }, { "icon": { @@ -93,8 +182,10 @@ "grid": 0, "tags": [ "arrow-down-thin" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 39, "id": 0, @@ -104,7 +195,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 4 + "setId": 1, + "iconIdx": 6 }, { "icon": { @@ -114,8 +206,10 @@ "grid": 0, "tags": [ "wishlist full" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 1, "id": 32, @@ -124,8 +218,9 @@ "name": "wishlist-full", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 0 + "setIdx": 0, + "setId": 1, + "iconIdx": 7 }, { "icon": { @@ -135,8 +230,10 @@ "grid": 0, "tags": [ "wishlist empty" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 2, "id": 31, @@ -145,8 +242,9 @@ "name": "wishlist-empty", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 1 + "setIdx": 0, + "setId": 1, + "iconIdx": 8 }, { "icon": { @@ -156,8 +254,10 @@ "grid": 0, "tags": [ "warning" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 3, "id": 30, @@ -166,8 +266,9 @@ "name": "warning", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 2 + "setIdx": 0, + "setId": 1, + "iconIdx": 9 }, { "icon": { @@ -177,8 +278,10 @@ "grid": 0, "tags": [ "update" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 4, "id": 29, @@ -187,8 +290,9 @@ "name": "update", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 3 + "setIdx": 0, + "setId": 1, + "iconIdx": 10 }, { "icon": { @@ -198,8 +302,10 @@ "grid": 0, "tags": [ "trash" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 5, "id": 28, @@ -208,8 +314,9 @@ "name": "trash", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 4 + "setIdx": 0, + "setId": 1, + "iconIdx": 11 }, { "icon": { @@ -219,8 +326,10 @@ "grid": 0, "tags": [ "star" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 6, "id": 27, @@ -229,8 +338,9 @@ "name": "star", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 5 + "setIdx": 0, + "setId": 1, + "iconIdx": 12 }, { "icon": { @@ -240,8 +350,10 @@ "grid": 0, "tags": [ "settings" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 7, "id": 26, @@ -250,8 +362,9 @@ "name": "settings", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 6 + "setIdx": 0, + "setId": 1, + "iconIdx": 13 }, { "icon": { @@ -261,8 +374,10 @@ "grid": 0, "tags": [ "pointer down" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 8, "id": 19, @@ -271,8 +386,9 @@ "name": "pointer-down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 7 + "setIdx": 0, + "setId": 1, + "iconIdx": 14 }, { "icon": { @@ -282,8 +398,10 @@ "grid": 0, "tags": [ "next" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 9, "id": 18, @@ -292,8 +410,9 @@ "name": "next", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 8 + "setIdx": 0, + "setId": 1, + "iconIdx": 15 }, { "icon": { @@ -303,8 +422,10 @@ "grid": 0, "tags": [ "menu" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 10, "id": 17, @@ -313,8 +434,9 @@ "name": "menu", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 9 + "setIdx": 0, + "setId": 1, + "iconIdx": 16 }, { "icon": { @@ -324,8 +446,10 @@ "grid": 0, "tags": [ "location" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 11, "id": 16, @@ -334,8 +458,9 @@ "name": "location", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 10 + "setIdx": 0, + "setId": 1, + "iconIdx": 17 }, { "icon": { @@ -345,8 +470,10 @@ "grid": 0, "tags": [ "list" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 12, "id": 15, @@ -355,8 +482,9 @@ "name": "list", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 11 + "setIdx": 0, + "setId": 1, + "iconIdx": 18 }, { "icon": { @@ -366,8 +494,10 @@ "grid": 0, "tags": [ "info" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 13, "id": 14, @@ -376,8 +506,9 @@ "name": "info", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 12 + "setIdx": 0, + "setId": 1, + "iconIdx": 19 }, { "icon": { @@ -387,8 +518,10 @@ "grid": 0, "tags": [ "grid" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 14, "id": 13, @@ -397,8 +530,9 @@ "name": "grid", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 13 + "setIdx": 0, + "setId": 1, + "iconIdx": 20 }, { "icon": { @@ -408,8 +542,10 @@ "grid": 0, "tags": [ "comment reflected" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 15, "id": 6, @@ -418,8 +554,9 @@ "name": "comment-reflected", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 14 + "setIdx": 0, + "setId": 1, + "iconIdx": 21 }, { "icon": { @@ -429,8 +566,10 @@ "grid": 0, "tags": [ "collapse" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 16, "id": 5, @@ -439,8 +578,9 @@ "name": "collapse", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 15 + "setIdx": 0, + "setId": 1, + "iconIdx": 22 }, { "icon": { @@ -450,8 +590,10 @@ "grid": 0, "tags": [ "checkmark" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 17, "id": 4, @@ -460,8 +602,9 @@ "name": "checkmark", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 16 + "setIdx": 0, + "setId": 1, + "iconIdx": 23 }, { "icon": { @@ -471,8 +614,10 @@ "grid": 0, "tags": [ "cart" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 18, "id": 3, @@ -481,8 +626,9 @@ "name": "cart", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 17 + "setIdx": 0, + "setId": 1, + "iconIdx": 24 }, { "icon": { @@ -492,8 +638,10 @@ "grid": 0, "tags": [ "calendar" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 19, "id": 2, @@ -502,8 +650,9 @@ "name": "calendar", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 18 + "setIdx": 0, + "setId": 1, + "iconIdx": 25 }, { "icon": { @@ -513,8 +662,10 @@ "grid": 0, "tags": [ "arrow up" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 20, "id": 1, @@ -523,8 +674,9 @@ "name": "arrow-up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 19 + "setIdx": 0, + "setId": 1, + "iconIdx": 26 }, { "icon": { @@ -534,8 +686,10 @@ "grid": 0, "tags": [ "arrow down" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 21, "id": 0, @@ -544,8 +698,9 @@ "name": "arrow-down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 20 + "setIdx": 0, + "setId": 1, + "iconIdx": 27 }, { "icon": { @@ -555,8 +710,10 @@ "grid": 0, "tags": [ "search" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 22, "id": 25, @@ -565,8 +722,9 @@ "name": "search", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 21 + "setIdx": 0, + "setId": 1, + "iconIdx": 28 }, { "icon": { @@ -576,8 +734,10 @@ "grid": 0, "tags": [ "remove" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 23, "id": 24, @@ -586,8 +746,9 @@ "name": "remove", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 22 + "setIdx": 0, + "setId": 1, + "iconIdx": 29 }, { "icon": { @@ -597,8 +758,10 @@ "grid": 0, "tags": [ "prev" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 24, "id": 23, @@ -607,8 +770,9 @@ "name": "prev", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 23 + "setIdx": 0, + "setId": 1, + "iconIdx": 30 }, { "icon": { @@ -618,8 +782,10 @@ "grid": 0, "tags": [ "pointer up" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 25, "id": 22, @@ -628,8 +794,9 @@ "name": "pointer-up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 24 + "setIdx": 0, + "setId": 1, + "iconIdx": 31 }, { "icon": { @@ -639,8 +806,10 @@ "grid": 0, "tags": [ "pointer right" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 26, "id": 21, @@ -649,8 +818,9 @@ "name": "pointer-right", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 25 + "setIdx": 0, + "setId": 1, + "iconIdx": 32 }, { "icon": { @@ -660,8 +830,10 @@ "grid": 0, "tags": [ "pointer left" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 27, "id": 20, @@ -670,8 +842,9 @@ "name": "pointer-left", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 26 + "setIdx": 0, + "setId": 1, + "iconIdx": 33 }, { "icon": { @@ -681,8 +854,10 @@ "grid": 0, "tags": [ "flag" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 28, "id": 12, @@ -691,8 +866,9 @@ "name": "flag", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 27 + "setIdx": 0, + "setId": 1, + "iconIdx": 34 }, { "icon": { @@ -702,8 +878,10 @@ "grid": 0, "tags": [ "expand" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 29, "id": 11, @@ -712,8 +890,9 @@ "name": "expand", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 28 + "setIdx": 0, + "setId": 1, + "iconIdx": 35 }, { "icon": { @@ -723,8 +902,10 @@ "grid": 0, "tags": [ "envelope" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 30, "id": 10, @@ -733,8 +914,9 @@ "name": "envelope", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 29 + "setIdx": 0, + "setId": 1, + "iconIdx": 36 }, { "icon": { @@ -744,8 +926,10 @@ "grid": 0, "tags": [ "compare full" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 31, "id": 9, @@ -754,8 +938,9 @@ "name": "compare-full", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 30 + "setIdx": 0, + "setId": 1, + "iconIdx": 37 }, { "icon": { @@ -765,8 +950,10 @@ "grid": 0, "tags": [ "compare empty" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 32, "id": 8, @@ -775,8 +962,9 @@ "name": "compare-empty", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 31 + "setIdx": 0, + "setId": 1, + "iconIdx": 38 }, { "icon": { @@ -786,8 +974,10 @@ "grid": 0, "tags": [ "comment" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 33, "id": 7, @@ -796,8 +986,9 @@ "name": "comment", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 32 + "setIdx": 0, + "setId": 1, + "iconIdx": 39 }, { "icon": { @@ -807,8 +998,10 @@ "grid": 0, "tags": [ "up" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 34, "id": 34, @@ -817,8 +1010,9 @@ "name": "up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 33 + "setIdx": 0, + "setId": 1, + "iconIdx": 40 }, { "icon": { @@ -828,8 +1022,10 @@ "grid": 0, "tags": [ "down" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 35, "id": 33, @@ -838,8 +1034,9 @@ "name": "down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 34 + "setIdx": 0, + "setId": 1, + "iconIdx": 41 } ], "height": 1024, @@ -870,6 +1067,8 @@ "gridSize": 16, "showLiga": false, "search": "", - "showGrid": false + "showGrid": false, + "showQuickUse2": true, + "showSVGs": true } } \ No newline at end of file diff --git a/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php b/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php index b7697813590c90cd3845ef83ad5936ce5fb5a110..e0550e1f37097054d8d5d9ccc4d113665f9a6055 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php @@ -34,12 +34,7 @@ class ServiceDataAttributesScannerTest extends \PHPUnit_Framework_TestCase 'Magento\Sales\Api\Data\OrderExtension', 'Magento\Sales\Api\Data\OrderItemExtensionInterface', 'Magento\Sales\Api\Data\OrderItemExtension', - 'Magento\GiftMessage\Api\Data\MessageExtensionInterface', - 'Magento\GiftMessage\Api\Data\MessageExtension', - 'Magento\Quote\Api\Data\TotalsAdditionalDataExtensionInterface', - 'Magento\Quote\Api\Data\TotalsAdditionalDataExtension' ]; - $this->assertSame($expectedResult, $this->model->collectEntities($files)); } } diff --git a/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml b/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml index 604ebb9dc9ab6850e9e98729f20a2ac9b9bfb5e1..336d89dd4ecc727b5a382ecb0e03878fef50dfaa 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml +++ b/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml @@ -12,11 +12,4 @@ <extension_attributes for="Magento\Sales\Api\Data\OrderItemInterface"> <attribute code="gift_message" type="Magento\GiftMessage\Api\Data\MessageInterface" /> </extension_attributes> - <extension_attributes for="Magento\GiftMessage\Api\Data\MessageInterface"> - <attribute code="entity_id" type="string" /> - <attribute code="entity_type" type="string" /> - </extension_attributes> - <extension_attributes for="Magento\Quote\Api\Data\TotalsAdditionalDataInterface"> - <attribute code="gift_messages" type="Magento\GiftMessage\Api\Data\MessageInterface[]" /> - </extension_attributes> </config>