diff --git a/app/code/Magento/Backend/etc/adminhtml/system.xml b/app/code/Magento/Backend/etc/adminhtml/system.xml index adba54d656028..6f85251da52ed 100644 --- a/app/code/Magento/Backend/etc/adminhtml/system.xml +++ b/app/code/Magento/Backend/etc/adminhtml/system.xml @@ -211,6 +211,10 @@ Magento\Backend\Model\Config\Source\Yesno + + + Magento\Backend\Model\Config\Source\Yesno + diff --git a/app/code/Magento/Catalog/Helper/Product.php b/app/code/Magento/Catalog/Helper/Product.php index 72000f42184c9..eeee50878443d 100644 --- a/app/code/Magento/Catalog/Helper/Product.php +++ b/app/code/Magento/Catalog/Helper/Product.php @@ -81,6 +81,13 @@ class Product extends \Magento\Core\Helper\Url */ protected $_catalogSession; + /** + * Invalidate product category indexer params + * + * @var array + */ + protected $_reindexProductCategoryIndexerData; + /** * Invalidate price indexer params * @@ -109,6 +116,7 @@ class Product extends \Magento\Core\Helper\Url * @param \Magento\Framework\App\Config\ScopeConfigInterface $coreConfig * @param string $typeSwitcherLabel * @param array $reindexPriceIndexerData + * @param array $reindexProductCategoryIndexerData * @param ProductRepositoryInterface $productRepository * @param CategoryRepositoryInterface $categoryRepository * @SuppressWarnings(PHPMD.ExcessiveParameterList) @@ -124,6 +132,7 @@ public function __construct( \Magento\Framework\App\Config\ScopeConfigInterface $coreConfig, $typeSwitcherLabel, $reindexPriceIndexerData, + $reindexProductCategoryIndexerData, ProductRepositoryInterface $productRepository, CategoryRepositoryInterface $categoryRepository ) { @@ -137,6 +146,7 @@ public function __construct( $this->_reindexPriceIndexerData = $reindexPriceIndexerData; $this->productRepository = $productRepository; $this->categoryRepository = $categoryRepository; + $this->_reindexProductCategoryIndexerData = $reindexProductCategoryIndexerData; parent::__construct($context, $storeManager); } @@ -169,6 +179,22 @@ public function isDataForPriceIndexerWasChanged($data) return false; } + /** + * Retrieve data for product category indexer update + * + * @param \Magento\Catalog\Model\Product $data + * @return boolean + */ + public function isDataForProductCategoryIndexerWasChanged(\Magento\Catalog\Model\Product $data) + { + foreach ($this->_reindexProductCategoryIndexerData['byDataChange'] as $param) { + if ($data->dataHasChangedFor($param)) { + return true; + } + } + return false; + } + /** * Retrieve product view page url * diff --git a/app/code/Magento/Catalog/Model/Category.php b/app/code/Magento/Catalog/Model/Category.php index 750ed9ff5a2e1..00930af3f43e8 100644 --- a/app/code/Magento/Catalog/Model/Category.php +++ b/app/code/Magento/Catalog/Model/Category.php @@ -1024,8 +1024,9 @@ public function reindex() $flatIndexer->reindexRow($this->getId()); } } + $affectedProductIds = $this->getAffectedProductIds(); $productIndexer = $this->indexerRegistry->get(Indexer\Category\Product::INDEXER_ID); - if (!$productIndexer->isScheduled()) { + if (!$productIndexer->isScheduled() && !empty($affectedProductIds)) { $productIndexer->reindexList($this->getPathIds()); } } diff --git a/app/code/Magento/Catalog/Model/Product.php b/app/code/Magento/Catalog/Model/Product.php index b3e03d6a91d85..53a81b2f29e0d 100644 --- a/app/code/Magento/Catalog/Model/Product.php +++ b/app/code/Magento/Catalog/Model/Product.php @@ -835,10 +835,12 @@ public function eavReindexCallback() */ public function reindex() { - $this->_productFlatIndexerProcessor->reindexRow($this->getEntityId()); - $categoryIndexer = $this->indexerRegistry->get(Indexer\Product\Category::INDEXER_ID); - if (!$categoryIndexer->isScheduled()) { - $categoryIndexer->reindexRow($this->getId()); + if ($this->_catalogProduct->isDataForProductCategoryIndexerWasChanged($this) || $this->isDeleted()) { + $this->_productFlatIndexerProcessor->reindexRow($this->getEntityId()); + $categoryIndexer = $this->indexerRegistry->get(Indexer\Product\Category::INDEXER_ID); + if (!$categoryIndexer->isScheduled()) { + $categoryIndexer->reindexRow($this->getId()); + } } } diff --git a/app/code/Magento/Catalog/etc/adminhtml/di.xml b/app/code/Magento/Catalog/etc/adminhtml/di.xml index 3b74c04d8ef69..29aadc03ae11e 100644 --- a/app/code/Magento/Catalog/etc/adminhtml/di.xml +++ b/app/code/Magento/Catalog/etc/adminhtml/di.xml @@ -60,10 +60,10 @@ - - + + - + diff --git a/app/code/Magento/Catalog/etc/di.xml b/app/code/Magento/Catalog/etc/di.xml index 9f557a871f0c4..148e9aeef5ecf 100644 --- a/app/code/Magento/Catalog/etc/di.xml +++ b/app/code/Magento/Catalog/etc/di.xml @@ -83,6 +83,14 @@ tax_class_id + + + category_ids + entity_id + store_id + visibility + + Magento\Catalog\Api\ProductRepositoryInterface\Proxy diff --git a/app/code/Magento/Core/etc/config.xml b/app/code/Magento/Core/etc/config.xml index 9527a2ef4c627..2f8cfb53c77df 100644 --- a/app/code/Magento/Core/etc/config.xml +++ b/app/code/Magento/Core/etc/config.xml @@ -25,6 +25,10 @@ 0 Magento\Framework\Code\Minifier\Adapter\Js\Jsmin + + 0 + Magento\Framework\Code\Minifier\Adapter\Css\CssMinifier + GD2 @@ -98,6 +102,7 @@ 0 + 0 diff --git a/app/code/Magento/PageCache/Block/System/Config/Form/Field/Export.php b/app/code/Magento/PageCache/Block/System/Config/Form/Field/Export.php index 0a4befa6a72ea..59b24cf3bbc46 100644 --- a/app/code/Magento/PageCache/Block/System/Config/Form/Field/Export.php +++ b/app/code/Magento/PageCache/Block/System/Config/Form/Field/Export.php @@ -15,18 +15,22 @@ class Export extends \Magento\Backend\Block\System\Config\Form\Field * * @param \Magento\Framework\Data\Form\Element\AbstractElement $element * @return string + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ protected function _getElementHtml(\Magento\Framework\Data\Form\Element\AbstractElement $element) { /** @var \Magento\Backend\Block\Widget\Button $buttonBlock */ $buttonBlock = $this->getForm()->getLayout()->createBlock('Magento\Backend\Block\Widget\Button'); - $params = ['website' => $buttonBlock->getRequest()->getParam('website')]; + $params = [ + 'website' => $buttonBlock->getRequest()->getParam('website'), + 'varnish' => $this->getVarnishVersion() + ]; $url = $this->getUrl("*/PageCache/exportVarnishConfig", $params); $data = [ - 'id' => 'system_full_page_cache_varnish_export_button', - 'label' => __('Export VCL'), + 'id' => 'system_full_page_cache_varnish_export_button_version' . $this->getVarnishVersion(), + 'label' => __('Export VCL for Varnish ') . $this->getVarnishVersion(), 'onclick' => "setLocation('" . $url . "')", ]; @@ -34,6 +38,16 @@ protected function _getElementHtml(\Magento\Framework\Data\Form\Element\Abstract return $html; } + /** + * Return Varnish version to this class + * + * @return int + */ + public function getVarnishVersion() + { + return 0; + } + /** * Return PageCache TTL value from config * to avoid saving empty field diff --git a/app/code/Magento/PageCache/Block/System/Config/Form/Field/Export/Varnish3.php b/app/code/Magento/PageCache/Block/System/Config/Form/Field/Export/Varnish3.php new file mode 100644 index 0000000000000..f10863bb0b2fd --- /dev/null +++ b/app/code/Magento/PageCache/Block/System/Config/Form/Field/Export/Varnish3.php @@ -0,0 +1,22 @@ +config->getVclFile(); + $varnishVersion = $this->getRequest()->getParam('varnish'); + switch ($varnishVersion) { + case 3: + $content = $this->config->getVclFile(\Magento\PageCache\Model\Config::VARNISH_3_CONFIGURATION_PATH); + break; + default: + $content = $this->config->getVclFile(\Magento\PageCache\Model\Config::VARNISH_4_CONFIGURATION_PATH); + break; + } return $this->fileFactory->create($fileName, $content, DirectoryList::VAR_DIR); } } diff --git a/app/code/Magento/PageCache/Model/Config.php b/app/code/Magento/PageCache/Model/Config.php index c72b8d93ba647..55f70ea787a6e 100644 --- a/app/code/Magento/PageCache/Model/Config.php +++ b/app/code/Magento/PageCache/Model/Config.php @@ -49,9 +49,14 @@ class Config protected $_scopeConfig; /** - * XML path to value for saving temporary .vcl configuration + * XML path to Varnish 3 config template path */ - const VARNISH_CONFIGURATION_PATH = 'system/full_page_cache/varnish/path'; + const VARNISH_3_CONFIGURATION_PATH = 'system/full_page_cache/varnish3/path'; + + /** + * XML path to Varnish 4 config template path + */ + const VARNISH_4_CONFIGURATION_PATH = 'system/full_page_cache/varnish4/path'; /** * @var \Magento\Framework\App\Cache\StateInterface $_cacheState @@ -101,11 +106,12 @@ public function getTtl() /** * Return generated varnish.vcl configuration file * + * @param string $vclTemplatePath * @return string */ - public function getVclFile() + public function getVclFile($vclTemplatePath) { - $data = $this->_modulesDirectory->readFile($this->_scopeConfig->getValue(self::VARNISH_CONFIGURATION_PATH)); + $data = $this->_modulesDirectory->readFile($this->_scopeConfig->getValue($vclTemplatePath)); return strtr($data, $this->_getReplacements()); } @@ -117,16 +123,16 @@ public function getVclFile() protected function _getReplacements() { return [ - '{{ host }}' => $this->_scopeConfig->getValue( + '/* {{ host }} */' => $this->_scopeConfig->getValue( self::XML_VARNISH_PAGECACHE_BACKEND_HOST, \Magento\Framework\Store\ScopeInterface::SCOPE_STORE ), - '{{ port }}' => $this->_scopeConfig->getValue( + '/* {{ port }} */' => $this->_scopeConfig->getValue( self::XML_VARNISH_PAGECACHE_BACKEND_PORT, \Magento\Framework\Store\ScopeInterface::SCOPE_STORE ), - '{{ ips }}' => $this->_getAccessList(), - '{{ design_exceptions_code }}' => $this->_getDesignExceptions() + '/* {{ ips }} */' => $this->_getAccessList(), + '/* {{ design_exceptions_code }} */' => $this->_getDesignExceptions() ]; } @@ -149,9 +155,9 @@ protected function _getAccessList() \Magento\Framework\Store\ScopeInterface::SCOPE_STORE ); if (!empty($accessList)) { - $ips = explode(', ', $accessList); + $ips = explode(',', $accessList); foreach ($ips as $ip) { - $result[] = sprintf($tpl, $ip); + $result[] = sprintf($tpl, trim($ip)); } return implode("\n", $result); } diff --git a/app/code/Magento/PageCache/etc/adminhtml/system.xml b/app/code/Magento/PageCache/etc/adminhtml/system.xml index 4edf4786ff1a6..3a587d6d359f7 100644 --- a/app/code/Magento/PageCache/etc/adminhtml/system.xml +++ b/app/code/Magento/PageCache/etc/adminhtml/system.xml @@ -41,9 +41,15 @@ 1 - - - Magento\PageCache\Block\System\Config\Form\Field\Export + + + Magento\PageCache\Block\System\Config\Form\Field\Export\Varnish3 + + 1 + + + + Magento\PageCache\Block\System\Config\Form\Field\Export\Varnish4 1 diff --git a/app/code/Magento/PageCache/etc/config.xml b/app/code/Magento/PageCache/etc/config.xml index 56a9702a463be..8bb6fd48f64a1 100644 --- a/app/code/Magento/PageCache/etc/config.xml +++ b/app/code/Magento/PageCache/etc/config.xml @@ -9,9 +9,12 @@ - - Magento/PageCache/etc/varnish.vcl - + + Magento/PageCache/etc/varnish3.vcl + + + Magento/PageCache/etc/varnish4.vcl + 120 1 diff --git a/app/code/Magento/PageCache/etc/varnish.vcl b/app/code/Magento/PageCache/etc/varnish3.vcl similarity index 96% rename from app/code/Magento/PageCache/etc/varnish.vcl rename to app/code/Magento/PageCache/etc/varnish3.vcl index 2b90ee0e3ef14..e400f5b3c979d 100644 --- a/app/code/Magento/PageCache/etc/varnish.vcl +++ b/app/code/Magento/PageCache/etc/varnish3.vcl @@ -2,12 +2,12 @@ import std; # The minimal Varnish version is 3.0.5 backend default { - .host = "{{ host }}"; - .port = "{{ port }}"; + .host = "/* {{ host }} */"; + .port = "/* {{ port }} */"; } acl purge { -{{ ips }} +/* {{ ips }} */ } sub vcl_recv { @@ -68,7 +68,7 @@ sub vcl_hash { if (req.http.cookie ~ "X-Magento-Vary=") { hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1")); } - {{ design_exceptions_code }} + /* {{ design_exceptions_code }} */ } sub vcl_fetch { diff --git a/app/code/Magento/PageCache/etc/varnish4.vcl b/app/code/Magento/PageCache/etc/varnish4.vcl new file mode 100644 index 0000000000000..166e3e6a81d25 --- /dev/null +++ b/app/code/Magento/PageCache/etc/varnish4.vcl @@ -0,0 +1,109 @@ +vcl 4.0; + +import std; +# The minimal Varnish version is 4.0 + +backend default { + .host = "/* {{ host }} */"; + .port = "/* {{ port }} */"; +} + +acl purge { +/* {{ ips }} */ +} + +sub vcl_recv { + if (req.method == "PURGE") { + if (client.ip !~ purge) { + return (synth(405, "Method not allowed")); + } + if (!req.http.X-Magento-Tags-Pattern) { + return (synth(400, "X-Magento-Tags-Pattern header required")); + } + ban("obj.http.X-Magento-Tags ~ " + req.http.X-Magento-Tags-Pattern); + return (synth(200, "Purged")); + } + + if (req.method != "GET" && + req.method != "HEAD" && + req.method != "PUT" && + req.method != "POST" && + req.method != "TRACE" && + req.method != "OPTIONS" && + req.method != "DELETE") { + /* Non-RFC2616 or CONNECT which is weird. */ + return (pipe); + } + + # We only deal with GET and HEAD by default + if (req.method != "GET" && req.method != "HEAD") { + return (pass); + } + + return (hash); +} + +sub vcl_hash { + if (req.http.cookie ~ "X-Magento-Vary=") { + hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1")); + } + /* {{ design_exceptions_code }} */ +} + +sub vcl_backend_response { + if (beresp.http.content-type ~ "text") { + set beresp.do_esi = true; + } + + if (bereq.url ~ "\.js$" || beresp.http.content-type ~ "text") { + set beresp.do_gzip = true; + } + + # cache only successfully responses + if (beresp.status != 200) { + set beresp.ttl = 0s; + set beresp.uncacheable = true; + return (deliver); + } elsif (beresp.http.Cache-Control ~ "private") { + set beresp.uncacheable = true; + set beresp.ttl = 120s; + return (deliver); + } + + if (beresp.http.X-Magento-Debug) { + set beresp.http.X-Magento-Cache-Control = beresp.http.Cache-Control; + } + + # validate if we need to cache it and prevent from setting cookie + # images, css and js are cacheable by default so we have to remove cookie also + if (beresp.ttl > 0s && (bereq.method == "GET" || bereq.method == "HEAD")) { + unset beresp.http.set-cookie; + if (bereq.url !~ "\.(css|js|jpg|png|gif|tiff|bmp|gz|tgz|bz2|tbz|mp3|ogg|svg|swf|woff)(\?|$)") { + set beresp.http.Pragma = "no-cache"; + set beresp.http.Expires = "-1"; + set beresp.http.Cache-Control = "no-store, no-cache, must-revalidate, max-age=0"; + set beresp.grace = 1m; + } + } + return (deliver); +} + +sub vcl_deliver { + if (resp.http.X-Magento-Debug) { + if (resp.http.x-varnish ~ " ") { + set resp.http.X-Magento-Cache-Debug = "HIT"; + } else { + set resp.http.X-Magento-Cache-Debug = "MISS"; + } + } else { + unset resp.http.Age; + } + + unset resp.http.X-Magento-Debug; + unset resp.http.X-Magento-Tags; + unset resp.http.X-Powered-By; + unset resp.http.Server; + unset resp.http.X-Varnish; + unset resp.http.Via; + unset resp.http.Link; +} diff --git a/app/code/Magento/PageCache/view/adminhtml/templates/page_cache_validation.phtml b/app/code/Magento/PageCache/view/adminhtml/templates/page_cache_validation.phtml index ab061a4e26f0b..d9f2d3eb827fc 100644 --- a/app/code/Magento/PageCache/view/adminhtml/templates/page_cache_validation.phtml +++ b/app/code/Magento/PageCache/view/adminhtml/templates/page_cache_validation.phtml @@ -24,7 +24,10 @@ require(['jquery'], function($){ var invalidFields = fields.filter(function () { return ($(this).val().length == 0 || ($(this).val() != $(this).data('previous-value'))); }); - $('#system_full_page_cache_varnish_export_button').prop('disabled', (invalidFields.length > 0)); + $('[id^=system_full_page_cache_varnish_export_button_version]').prop( + 'disabled', + (invalidFields.length > 0) + ); }); //]]> diff --git a/app/etc/di.xml b/app/etc/di.xml index cf466920f5e07..af058c9dc4aaf 100644 --- a/app/etc/di.xml +++ b/app/etc/di.xml @@ -556,4 +556,9 @@ + + + false + + diff --git a/composer.json b/composer.json index a8aade223ec32..00745de93f92f 100644 --- a/composer.json +++ b/composer.json @@ -31,7 +31,8 @@ "zendframework/zend-http": "2.3.1", "magento/zendframework1": "1.12.9-patch1", "composer/composer": "1.0.0-alpha8", - "monolog/monolog": "1.11.0" + "monolog/monolog": "1.11.0", + "tubalmartin/cssmin": "2.4.8-p4" }, "require-dev": { "phpunit/phpunit": "4.1.0", diff --git a/composer.lock b/composer.lock index 13ec83807924b..4b1d786bece16 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "6b9559f218c2662fad52c9ae7f3b6492", + "hash": "089a12df92109b065a465aad27ee43f5", "packages": [ { "name": "composer/composer", @@ -485,6 +485,50 @@ "homepage": "http://symfony.com", "time": "2015-01-06 22:47:52" }, + { + "name": "tubalmartin/cssmin", + "version": "v2.4.8-p4", + "source": { + "type": "git", + "url": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port.git", + "reference": "fe84d71e8420243544c0ce3bd0f5d7c1936b0f90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tubalmartin/YUI-CSS-compressor-PHP-port/zipball/fe84d71e8420243544c0ce3bd0f5d7c1936b0f90", + "reference": "fe84d71e8420243544c0ce3bd0f5d7c1936b0f90", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "cssmin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Túbal Martín", + "homepage": "http://tubalmartin.me/" + } + ], + "description": "A PHP port of the YUI CSS compressor", + "homepage": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port", + "keywords": [ + "compress", + "compressor", + "css", + "minify", + "yui" + ], + "time": "2014-09-22 08:08:50" + }, { "name": "zendframework/zend-code", "version": "2.3.1", @@ -2458,25 +2502,25 @@ }, { "name": "sebastian/comparator", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "c484a80f97573ab934e37826dba0135a3301b26a" + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c484a80f97573ab934e37826dba0135a3301b26a", - "reference": "c484a80f97573ab934e37826dba0135a3301b26a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e", + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e", "shasum": "" }, "require": { "php": ">=5.3.3", - "sebastian/diff": "~1.1", - "sebastian/exporter": "~1.0" + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" }, "require-dev": { - "phpunit/phpunit": "~4.1" + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { @@ -2518,7 +2562,7 @@ "compare", "equality" ], - "time": "2014-11-16 21:32:38" + "time": "2015-01-29 16:28:08" }, { "name": "sebastian/diff", @@ -2624,16 +2668,16 @@ }, { "name": "sebastian/exporter", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "35ab8d385eef068186c83e23ae83c96b0288b3ee" + "reference": "84839970d05254c73cde183a721c7af13aede943" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/35ab8d385eef068186c83e23ae83c96b0288b3ee", - "reference": "35ab8d385eef068186c83e23ae83c96b0288b3ee", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943", + "reference": "84839970d05254c73cde183a721c7af13aede943", "shasum": "" }, "require": { @@ -2646,7 +2690,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -2686,7 +2730,7 @@ "export", "exporter" ], - "time": "2015-01-24 09:57:24" + "time": "2015-01-27 07:23:06" }, { "name": "sebastian/recursion-context", @@ -3219,6 +3263,7 @@ "phpmd/phpmd": 0 }, "prefer-stable": false, + "prefer-lowest": false, "platform": { "php": "~5.4.11|~5.5.0|~5.6.0" }, diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/Asset/MinifierTest.php b/dev/tests/integration/testsuite/Magento/Framework/View/Asset/MinifierTest.php new file mode 100644 index 0000000000000..0a64c7b1f1de0 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/Asset/MinifierTest.php @@ -0,0 +1,247 @@ +objectManager = Bootstrap::getInstance()->getObjectManager(); + $this->objectManager->get('Magento\Framework\App\State')->setAreaCode('frontend'); + Bootstrap::getInstance()->reinitialize(); + } + + /** + * CSS Minifier library test + * + * When fails on library update or minification handler replacement: + * 1 - minify `_files/static/css/styles.css` with new library manually + * 2 - use DIFF tools to see difference between new minified CSS and old minified one + * 3 - ensure that all differences are acceptable + * 4 - ensure that new minified CSS is fully workable in all supported browsers + * 5 - replace `_files/static/css/styles.magento.min.css` with new minified css + */ + public function testCssMinifierLibrary() + { + /** @var \Magento\Core\Model\Asset\Config $config */ + $config = $this->objectManager->get('\Magento\Core\Model\Asset\Config'); + $adapterClass = $config->getAssetMinificationAdapter('css'); + + /** @var \Magento\Framework\Code\Minifier\AdapterInterface $adapter */ + $adapter = $this->objectManager->get($adapterClass); + $this->assertEquals( + file_get_contents(dirname(__DIR__) . '/_files/static/css/styles.magento.min.css'), + $adapter->minify(file_get_contents(dirname(__DIR__) . '/_files/static/css/styles.css')), + 'Minified CSS differs from initial minified CSS snapshot. ' + . 'Ensure that new CSS is fully valid for all supported browsers ' + . 'and replace old minified snapshot with new one.' + ); + } + + /** + * Test CSS minification + * + * @param string $requestedUri + * @param string $requestedFilePath + * @param string $testFile + * @param callable $assertionCallback + * @throws \Magento\Framework\Exception + */ + protected function _testCssMinification($requestedUri, $requestedFilePath, $testFile, $assertionCallback) + { + /** @var \Magento\Framework\App\State|\PHPUnit_Framework_MockObject_MockObject $appState */ + $appState = $this->getMock('\Magento\Framework\App\State', ['getMode'], [], '', false); + $appState->expects($this->any()) + ->method('getMode') + ->will($this->returnValue(\Magento\Framework\App\State::MODE_DEFAULT)); + + /** @var \Magento\Framework\App\Request\Http $request */ + $request = $this->objectManager->get('Magento\Framework\App\Request\Http'); + $request->setRequestUri($requestedUri); + $request->setParam('resource', $requestedUri); + + $response = $this->getMockForAbstractClass( + 'Magento\Framework\App\Response\FileInterface', + [], + '', + false, + false, + true, + ['setFilePath'] + ); + $response->expects( + $this->any() + )->method( + 'setFilePath' + )->will( + $this->returnCallback( + $assertionCallback + ) + ); + + $publisher = $this->objectManager->create( + 'Magento\Framework\App\View\Asset\Publisher', + [ + 'appState' => $appState + ] + ); + + /** @var \Magento\Framework\App\StaticResource $staticResourceApp */ + $staticResourceApp = $this->objectManager->create( + 'Magento\Framework\App\StaticResource', + [ + 'response' => $response, + 'publisher' => $publisher + ] + ); + $initParams = Bootstrap::getInstance()->getAppInitParams(); + $designPath = $initParams[\Magento\Framework\App\Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS]['design']['path']; + $destFile = $designPath . $requestedFilePath; + + if (!is_readable(dirname($destFile))) { + mkdir(dirname($destFile), 777, true); + } + + copy($testFile, $destFile); + + $staticResourceApp->launch(); + + unlink($destFile); + } + + /** + * @magentoConfigFixture current_store dev/css/minify_files 1 + */ + public function testCssMinification() + { + $this->_testCssMinification( + '/frontend/Magento/blank/en_US/css/styles.css', + '/frontend/Magento/blank/web/css/styles.css', + dirname(__DIR__) . '/_files/static/css/styles.css', + function ($path) { + $this->assertEquals( + file_get_contents(dirname(__DIR__) . '/_files/static/css/styles.magento.min.css'), + file_get_contents($path), + 'Minified files are not equal or minification did not work for requested CSS' + ); + } + ); + } + + /** + * @magentoConfigFixture current_store dev/css/minify_files 0 + */ + public function testCssMinificationOff() + { + $this->_testCssMinification( + '/frontend/Magento/blank/en_US/css/styles.css', + '/frontend/Magento/blank/web/css/styles.css', + dirname(__DIR__) . '/_files/static/css/styles.css', + function ($path) { + $content = file_get_contents($path); + $this->assertNotEmpty($content); + $this->assertContains('Magento/backend', $content); + $this->assertNotEquals( + file_get_contents(dirname(__DIR__) . '/_files/static/css/styles.magento.min.css'), + $content, + 'CSS is minified when minification turned off' + ); + } + ); + } + + /** + * @magentoConfigFixture current_store dev/css/minify_files 1 + */ + public function testCssMinificationForMinifiedFiles() + { + $this->_testCssMinification( + '/frontend/Magento/blank/en_US/css/preminified-styles.min.css', + '/frontend/Magento/blank/web/css/preminified-styles.min.css', + dirname(__DIR__) . '/_files/static/css/preminified-styles.min.css', + function ($path) { + $content = file_get_contents($path); + $this->assertNotEmpty($content); + $this->assertContains('Magento/backend', $content); + $this->assertContains('semi-minified file', $content); + } + ); + } + + /** + * @magentoConfigFixture current_store dev/css/minify_files 1 + */ + public function testDeploymentWithMinifierEnabled() + { + $initDirectories = Bootstrap::getInstance() + ->getAppInitParams()[\Magento\Framework\App\Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS]; + + $designPath = $initDirectories['design']['path']; + + $staticPath = $initDirectories['static']['path']; + + $fileToBePublished = $staticPath . '/frontend/Magento/blank/en_US/css/styles.css'; + $destFile = $designPath . '/frontend/Magento/blank/web/css/styles.css'; + $fileToTestPublishing = dirname(__DIR__) . '/_files/static/css/styles.css'; + + if (!is_readable(dirname($destFile))) { + mkdir(dirname($destFile), 777, true); + } + + copy($fileToTestPublishing, $destFile); + + $omFactory = $this->getMock('\Magento\Framework\App\ObjectManagerFactory', ['create'], [], '', false); + $omFactory->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->objectManager)); + + $logger = $this->objectManager->create( + 'Magento\Tools\View\Deployer\Log', + ['verbosity' => \Magento\Tools\View\Deployer\Log::SILENT] + ); + + $filesUtil = $this->getMock('\Magento\Framework\Test\Utility\Files', [], [], '', false); + $filesUtil->expects($this->any()) + ->method('getStaticLibraryFiles') + ->will($this->returnValue([])); + + $filesUtil->expects($this->any()) + ->method('getStaticPreProcessingFiles') + ->will($this->returnValue( + [ + ['frontend', 'Magento/blank', '', '', 'css/styles.css', $destFile] + ] + )); + + /** @var \Magento\Tools\View\Deployer $deployer */ + $deployer = $this->objectManager->create( + 'Magento\Tools\View\Deployer', + ['filesUtil' => $filesUtil, 'logger' => $logger, 'isDryRun' => false] + ); + + $deployer->deploy($omFactory, ['en_US']); + + $this->assertFileExists($fileToBePublished); + $this->assertEquals( + file_get_contents(dirname(__DIR__) . '/_files/static/css/styles.magento.min.css'), + file_get_contents($fileToBePublished), + 'Minified file is not equal or minification did not work for deployed CSS' + ); + + unlink($destFile); + unlink($fileToBePublished); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/css/preminified-styles.min.css b/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/css/preminified-styles.min.css new file mode 100644 index 0000000000000..38070ee58dc90 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/css/preminified-styles.min.css @@ -0,0 +1,9 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/* + * Magento/backend + * semi-minified file to check that .min.css files are not minified with library + */ +table > caption { margin-bottom: 5px;}table thead { background: #676056; color: #f7f3eb;}table thead .headings { background: #807a6e;} \ No newline at end of file diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/css/styles.css b/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/css/styles.css new file mode 100644 index 0000000000000..10fde1eb12603 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/css/styles.css @@ -0,0 +1,6118 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/* Magento/backend */ +table > caption { + margin-bottom: 5px; +} +table thead { + background: #676056; + color: #f7f3eb; +} +table thead .headings { + background: #807a6e; +} +table thead a { + color: #f7f3eb; + display: block; +} +table thead a label { + color: #f7f3eb; + cursor: pointer; + display: block; +} +table thead a:hover, +table thead a:focus { + color: #dac7a2; + text-decoration: none; +} +table tfoot { + background: #f2ebde; + color: #676056; +} +table tfoot tr th, +table tfoot tr td { + text-align: left; +} +table th { + background: transparent; + border: solid #cac3b4; + border-width: 0 1px; + font-size: 14px; + padding: 6px 10px; + text-align: center; +} +table td { + border: solid #cac3b4; + border-width: 0 1px; + padding: 6px 10px 7px; + vertical-align: top; +} +table tbody tr td { + background: #ffffff; + color: #676056; + padding-top: 12px; +} +table tbody tr td:first-child { + border-left: 0; +} +table tbody tr td:first-child input[type="checkbox"] { + margin: 0; +} +table tbody tr td:last-child { + border-right: 0; +} +table tbody tr:last-child th, +table tbody tr:last-child td { + border-bottom-width: 1px; +} +table tbody tr:nth-child(odd) td, +table tbody tr:nth-child(odd) th { + background-color: #f7f3eb; +} +table tbody.even tr td { + background: #ffffff; +} +table tbody.odd tr td { + background: #f7f3eb; +} +table .dropdown-menu li { + padding: 7px 15px; + line-height: 14px; + cursor: pointer; +} +table .col-draggable .draggable-handle { + float: left; + position: relative; + top: 0; +} +.not-sort { + padding-right: 10px; +} +.sort-arrow-asc, +.sort-arrow-desc { + padding-right: 10px; + position: relative; +} +.sort-arrow-asc:after, +.sort-arrow-desc:after { + right: -11px; + top: -1px; + position: absolute; + width: 23px; +} +.sort-arrow-asc:hover:after, +.sort-arrow-desc:hover:after { + color: #dac7a2; +} +.sort-arrow-asc { + display: inline-block; + text-decoration: none; +} +.sort-arrow-asc:after { + font-family: 'icons-blank-theme'; + content: '\e626'; + font-size: 13px; + line-height: inherit; + color: #f7f3eb; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.sort-arrow-asc:hover:after { + color: #dac7a2; +} +.sort-arrow-desc { + display: inline-block; + text-decoration: none; +} +.sort-arrow-desc:after { + font-family: 'icons-blank-theme'; + content: '\e623'; + font-size: 13px; + line-height: inherit; + color: #f7f3eb; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.sort-arrow-desc:hover:after { + color: #dac7a2; +} +.grid-actions .input-text, +.pager .input-text, +.massaction .input-text, +.filter .input-text, +.grid-actions select, +.pager select, +.massaction select, +.filter select, +.grid-actions .select, +.pager .select, +.massaction .select, +.filter .select { + border-color: #989287; + box-shadow: none; + border-radius: 1px; + height: 28px; + margin: 0 10px 0 0; +} +.filter th { + border: 0 solid #676056; + padding: 6px 3px; + vertical-align: top; +} +.filter .ui-datepicker-trigger { + cursor: pointer; + margin-top: 2px; +} +.filter .input-text { + padding: 0 5px; +} +.filter .range-line:not(:last-child) { + margin-bottom: 5px; +} +.filter .date { + padding-right: 28px; + position: relative; + display: inline-block; + text-decoration: none; +} +.filter .date .hasDatepicker { + vertical-align: top; + width: 99%; +} +.filter .date img { + cursor: pointer; + height: 25px; + width: 25px; + right: 0; + position: absolute; + vertical-align: middle; + z-index: 2; + opacity: 0; +} +.filter .date:before { + font-family: 'icons-blank-theme'; + content: '\e612'; + font-size: 42px; + line-height: 30px; + color: #f7f3eb; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.filter .date:hover:before { + color: #dac7a2; +} +.filter .date:before { + height: 29px; + margin-left: 5px; + position: absolute; + right: -3px; + top: -3px; + width: 35px; +} +.filter select { + border-color: #cac3b4; + margin: 0; + padding: 0; + width: 99%; +} +.filter input.input-text { + border-color: #cac3b4; + margin: 0; + width: 99%; +} +.filter input.input-text::-webkit-input-placeholder { + color: #989287 !important; + text-transform: lowercase; +} +.filter input.input-text::-moz-placeholder { + color: #989287 !important; + text-transform: lowercase; +} +.filter input.input-text:-moz-placeholder { + color: #989287 !important; + text-transform: lowercase; +} +.filter input.input-text:-ms-input-placeholder { + color: #989287 !important; + text-transform: lowercase; +} +.grid { + background: #ffffff; + color: #676056; + font-size: 13px; + font-weight: 400; + padding: 15px; +} +.grid table { + width: 100%; +} +.grid tbody tr.selected th, +.grid tbody tr.selected td, +.grid tbody tr:hover th, +.grid tbody tr:hover td, +.grid tbody tr:nth-child(odd):hover th, +.grid tbody tr:nth-child(odd):hover td { + background-color: #f2ebde; + cursor: pointer; +} +.grid tbody tr.selected th.empty-text, +.grid tbody tr.selected td.empty-text, +.grid tbody tr:hover th.empty-text, +.grid tbody tr:hover td.empty-text, +.grid tbody tr:nth-child(odd):hover th.empty-text, +.grid tbody tr:nth-child(odd):hover td.empty-text { + background-color: #f7f3eb; + cursor: default; +} +.grid .empty-text { + font: 400 20px/1.2 'Open Sans', sans-serif; + text-align: center; + white-space: nowrap; +} +.grid .col-sku { + max-width: 100px; + width: 100px; +} +.grid .col-select, +.grid .col-massaction { + text-align: center; +} +.grid .editable .input-text { + width: 65px; +} +.grid .col-actions .action-select { + background: #ffffff; + border-color: #989287; + height: 28px; + margin: 0; + padding: 4px 4px 5px; + width: 80px; +} +.grid .col-position.editable { + white-space: nowrap; +} +.grid .col-position.editable .input-text { + margin: -7px 5px 0; + width: 70%; +} +.eq-ie9 .hor-scroll { + display: inline-block; + min-height: 0; + overflow-y: hidden; + overflow-x: auto; + width: 100%; +} +.data-table { + border-collapse: separate; + width: 100%; +} +.data-table thead, +.data-table tfoot, +.data-table th, +.accordion .config .data-table thead th, +.accordion .config .data-table tfoot td, +.accordion .config .accordion .config .data-table tfoot td th { + background: #ffffff; + color: #676056; + font-size: 13px; + font-weight: 600; +} +.data-table th { + text-align: left; +} +.data-table thead th, +.accordion .config .data-table thead th th, +.accordion .config .data-table tfoot td th, +.accordion .config .accordion .config .data-table tfoot td th th { + border: solid #c9c2b8; + border-width: 0 0 1px; + padding: 7px; +} +.data-table td, +.data-table tbody tr th, +.data-table tbody tr td, +.accordion .config .data-table td { + background: #ffffff; + border-width: 0; + padding: 5px 7px; + vertical-align: middle; +} +.data-table tbody tr:nth-child(odd) th, +.data-table tbody tr:nth-child(odd) td, +.accordion .config .data-table tbody tr:nth-child(odd) td { + background: #fbfaf6; +} +.data-table tbody.odd tr th, +.data-table tbody.odd tr td { + background: #fbfaf6; +} +.data-table tbody.even tr th, +.data-table tbody.even tr td { + background: #ffffff; +} +.data-table tfoot tr:last-child th, +.data-table tfoot tr:last-child td, +.data-table .accordion .config .data-table tfoot tr:last-child td { + border: 0; +} +.data-table.order-tables tbody td { + vertical-align: top; +} +.data-table.order-tables tbody:hover tr th, +.data-table.order-tables tbody:hover tr td { + background: #f7f3eb; +} +.data-table.order-tables tfoot td { + background: #f2ebde; + color: #676056; + font-size: 13px; + font-weight: 600; +} +.data-table input[type="text"] { + width: 98%; + padding-left: 1%; + padding-right: 1%; +} +.data-table select { + margin: 0; + box-sizing: border-box; +} +.data-table .col-actions .actions-split { + margin-top: 4px; +} +.data-table .col-actions .actions-split [class^='action-'] { + background: none; + border: 1px solid #c8c3b5; + padding: 3px 5px; + color: #bbb3a6; + font-size: 12px; +} +.data-table .col-actions .actions-split [class^='action-']:first-child { + border-right: 0; +} +.data-table .col-actions .actions-split .dropdown-menu { + margin-top: -1px; +} +.data-table .col-actions .actions-split .dropdown-menu a { + display: block; + color: #333; + text-decoration: none; +} +.data-table .col-actions .actions-split.active .action-toggle { + position: relative; + border-bottom-right-radius: 0; + box-shadow: none; + background: #fff; +} +.data-table .col-actions .actions-split.active .action-toggle:after { + position: absolute; + top: 100%; + left: 0; + right: 0; + height: 2px; + margin-top: -1px; + background: #fff; + content: ''; + z-index: 2; +} +.data-table .col-actions .actions-split.active .action-toggle .dropdown-menu { + border-top-right-radius: 0; +} +.data-table .col-default { + white-space: nowrap; + text-align: center; + vertical-align: middle; +} +.data-table .col-delete { + text-align: center; + width: 32px; +} +.data-table .col-file { + white-space: nowrap; +} +.data-table .col-file input, +.data-table .col-file .input-text { + margin: 0 5px; + width: 40%; +} +.data-table .col-file input:first-child, +.data-table .col-file .input-text:first-child { + margin-left: 0; +} +.data-table .col-actions-add { + padding: 10px 0; +} +.grid-actions { + background: #ffffff; + font-size: 13px; + line-height: 28px; + padding: 10px 15px; + position: relative; +} +.grid-actions + .grid { + padding-top: 5px; +} +.grid-actions .export, +.grid-actions .filter-actions { + float: right; + margin-left: 10px; + vertical-align: top; +} +.grid-actions .import { + display: block; + vertical-align: top; +} +.grid-actions .action-reset { + background: none; + border: 0; + display: inline; + line-height: 1.42857143; + margin: 0; + padding: 0; + color: #1979c3; + text-decoration: none; + margin: 6px 10px 0 0; + vertical-align: top; +} +.grid-actions .action-reset:visited { + color: #800080; + text-decoration: none; +} +.grid-actions .action-reset:hover { + color: #006bb4; + text-decoration: underline; +} +.grid-actions .action-reset:active { + color: #ff5501; + text-decoration: underline; +} +.grid-actions .action-reset:hover { + color: #006bb4; +} +.grid-actions .action-reset:hover, +.grid-actions .action-reset:active, +.grid-actions .action-reset:focus { + background: none; + border: 0; +} +.grid-actions .action-reset.disabled, +.grid-actions .action-reset[disabled], +fieldset[disabled] .grid-actions .action-reset { + color: #1979c3; + text-decoration: underline; + cursor: default; + pointer-events: none; + opacity: 0.5; +} +.grid-actions .import .label, +.grid-actions .export .label, +.massaction > .entry-edit .label { + margin: 0 14px 0 0; + vertical-align: inherit; +} +.grid-actions .import .action-, +.grid-actions .export .action-, +.grid-actions .filter-actions .action-, +.massaction > .entry-edit .action- { + vertical-align: inherit; +} +.grid-actions .filter .date { + float: left; + margin: 0 15px 0 0; + position: relative; +} +.grid-actions .filter .date:before { + color: #676056; + top: 1px; +} +.grid-actions .filter .date:hover:before { + color: #31302b; +} +.grid-actions .filter .label { + margin: 0; +} +.grid-actions .filter .hasDatepicker { + margin: 0 5px; + width: 80px; +} +.grid-actions .filter .show-by .select { + margin-left: 5px; + padding: 4px 4px 5px; + vertical-align: top; + width: auto; +} +.grid-actions .filter.required:after { + content: ''; +} +.grid-actions img { + vertical-align: middle; + height: 22px; + width: 22px; +} +.grid-actions .validation-advice { + background: #f9d4d4; + border: 1px solid #e22626; + border-radius: 3px; + color: #e22626; + margin: 5px 0 0; + padding: 3px 7px; + position: absolute; + white-space: nowrap; + z-index: 5; +} +.grid-actions .validation-advice:before { + width: 0; + height: 0; + border: 5px solid transparent; + border-bottom-color: #e22626; + content: ''; + left: 50%; + margin-left: -5px; + position: absolute; + top: -11px; +} +.grid-actions input[type="text"].validation-failed { + border-color: #e22626; + box-shadow: 0 0 8px rgba(226, 38, 38, 0.6); +} +.grid-actions .link-feed { + white-space: nowrap; +} +.pager { + font-size: 13px; +} +.grid .pager { + margin: 15px 0 0; + position: relative; + text-align: center; +} +.pager .pages-total-found { + margin-right: 25px; +} +.pager .view-pages .select { + margin: 0 5px; +} +.pager .link-feed { + font-size: 12px; + margin: 7px 15px 0 0; + position: absolute; + right: 0; + top: 0; +} +.pager .action-previous, +.pager .action-next { + background: none; + border: 0; + display: inline; + line-height: 1.42857143; + margin: 0; + padding: 0; + color: #1979c3; + text-decoration: none; + line-height: .6; + overflow: hidden; + width: 20px; +} +.pager .action-previous:visited, +.pager .action-next:visited { + color: #800080; + text-decoration: none; +} +.pager .action-previous:hover, +.pager .action-next:hover { + color: #006bb4; + text-decoration: underline; +} +.pager .action-previous:active, +.pager .action-next:active { + color: #ff5501; + text-decoration: underline; +} +.pager .action-previous:hover, +.pager .action-next:hover { + color: #006bb4; +} +.pager .action-previous:hover, +.pager .action-next:hover, +.pager .action-previous:active, +.pager .action-next:active, +.pager .action-previous:focus, +.pager .action-next:focus { + background: none; + border: 0; +} +.pager .action-previous.disabled, +.pager .action-next.disabled, +.pager .action-previous[disabled], +.pager .action-next[disabled], +fieldset[disabled] .pager .action-previous, +fieldset[disabled] .pager .action-next { + color: #1979c3; + text-decoration: underline; + cursor: default; + pointer-events: none; + opacity: 0.5; +} +.pager .action-previous:before, +.pager .action-next:before { + margin-left: -10px; +} +.pager .action-previous.disabled, +.pager .action-next.disabled { + opacity: .3; +} +.pager .action-previous { + display: inline-block; + text-decoration: none; +} +.pager .action-previous > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.pager .action-previous > span.focusable:active, +.pager .action-previous > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.pager .action-previous > span.focusable:active, +.pager .action-previous > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.pager .action-previous:before { + font-family: 'icons-blank-theme'; + content: '\e617'; + font-size: 40px; + line-height: inherit; + color: #026294; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.pager .action-previous:hover:before { + color: #007dbd; +} +.pager .action-next { + display: inline-block; + text-decoration: none; +} +.pager .action-next > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.pager .action-next > span.focusable:active, +.pager .action-next > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.pager .action-next > span.focusable:active, +.pager .action-next > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.pager .action-next:before { + font-family: 'icons-blank-theme'; + content: '\e608'; + font-size: 40px; + line-height: inherit; + color: #026294; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.pager .action-next:hover:before { + color: #007dbd; +} +.pager .input-text { + height: 25px; + line-height: 16px; + margin-right: 5px; + text-align: center; + width: 25px; + vertical-align: top; +} +.pager .pages-total { + line-height: 25px; + vertical-align: top; +} +.massaction { + background: #ffffff; + border-top: 1px solid #f2ebde; + font-size: 13px; + line-height: 28px; + padding: 15px 15px 0; +} +.massaction > .entry-edit { + float: right; +} +.massaction > .entry-edit .field-row { + display: inline-block; + vertical-align: top; +} +.massaction > .entry-edit .validation-advice { + display: none !important; +} +.massaction > .entry-edit .form-inline { + display: inline-block; +} +.massaction > .entry-edit .label { + padding: 0; + width: auto; +} +.massaction > .entry-edit .action- { + vertical-align: top; +} +.massaction .select.validation-failed { + border: 1px dashed #e22626; + background: #f9d4d4; +} +.grid-severity-critical, +.grid-severity-major, +.grid-severity-notice, +.grid-severity-minor { + background: #feeee1; + border: 1px solid #ed4f2e; + color: #ed4f2e; + display: block; + padding: 0 3px; + font-weight: bold; + line-height: 17px; + text-transform: uppercase; + text-align: center; +} +.grid-severity-critical, +.grid-severity-major { + border-color: #e22626; + background: #f9d4d4; + color: #e22626; +} +.grid-severity-notice { + border-color: #5b8116; + background: #d0e5a9; + color: #185b00; +} +.grid tbody td input[type="text"], +.data-table tbody td input[type="text"], +.grid tbody th input[type="text"], +.data-table tbody th input[type="text"], +.grid tbody td .input-text, +.data-table tbody td .input-text, +.grid tbody th .input-text, +.data-table tbody th .input-text, +.grid tbody td select, +.data-table tbody td select, +.grid tbody th select, +.data-table tbody th select, +.grid tbody td .select, +.data-table tbody td .select, +.grid tbody th .select, +.data-table tbody th .select { + width: 99%; +} +.ui-tabs-panel .grid .col-sku { + max-width: 150px; + width: 150px; +} +.col-indexer_status, +.col-indexer_mode { + width: 160px; +} +.fieldset-wrapper .grid-actions + .grid { + padding-top: 15px; +} +.fieldset-wrapper .grid-actions { + padding: 10px 0 0; +} +.fieldset-wrapper .grid { + padding: 0; +} +.fieldset-wrapper .massaction { + padding: 0; + border-top: none; + margin-bottom: 15px; +} +.accordion .grid { + padding: 0; +} +.ui-dialog-content .grid-actions, +.ui-dialog-content .grid { + padding-left: 0; + padding-right: 0; +} +.qty-table td { + border: 0; + padding: 0 5px 3px; +} +.sales-order-create-index .sales-order-create-index .grid table .action-configure { + float: right; +} +.sales-order-create-index .data-table .border td { + padding-bottom: 15px; +} +.sales-order-create-index .actions.update { + margin: 10px 0; +} +.adminhtml-order-shipment-new .grid .col-product { + max-width: 770px; + width: 770px; +} +.customer-index-index .grid .col-name { + max-width: 90px; + width: 90px; +} +.customer-index-index .grid .col-billing_region { + width: 70px; +} +.adminhtml-cms-hierarchy-index .col-title, +.adminhtml-cms-hierarchy-index .col-identifier { + max-width: 410px; + width: 410px; +} +.adminhtml-widget-instance-edit .grid-chooser .control { + margin-top: -19px; + width: 80%; +} +.eq-ie9 .adminhtml-widget-instance-edit .grid-chooser .control { + margin-top: -18px; +} +.adminhtml-widget-instance-edit .grid-chooser .control .grid-actions { + padding: 0 0 15px; +} +.adminhtml-widget-instance-edit .grid-chooser .control .grid { + padding: 0; +} +.adminhtml-widget-instance-edit .grid-chooser .control .addon input:last-child, +.adminhtml-widget-instance-edit .grid-chooser .control .addon select:last-child { + border-radius: 0; +} +.reports-report-product-sold .grid .col-name { + max-width: 720px; + width: 720px; +} +.adminhtml-system-store-index .grid td { + max-width: 310px; +} +.adminhtml-system-currency-index .grid { + padding-top: 0; +} +.adminhtml-system-currency-index .col-currency-edit-rate { + min-width: 40px; +} +.adminhtml-system-currency-index .col-base-currency { + font-weight: bold; +} +.adminhtml-system-currency-index .old-rate { + display: block; + margin-top: 3px; + text-align: center; +} +.adminhtml-system-currency-index .hor-scroll { + overflow-x: auto; + min-width: 970px; +} +.adminhtml-system-currencysymbol-index .col-currency { + width: 35%; +} +.adminhtml-system-currencysymbol-index .grid .input-text { + margin: 0 10px 0 0; + width: 50%; +} +.catalog-product-set-index .col-set_name { + max-width: 930px; + width: 930px; +} +.adminhtml-export-index .grid td { + vertical-align: middle; +} +.adminhtml-export-index .grid .input-text-range { + margin: 0 10px 0 5px; + width: 37%; +} +.adminhtml-export-index .grid .input-text-range-date { + margin: 0 5px; + width: 32%; +} +.adminhtml-export-index .ui-datepicker-trigger { + display: inline-block; + margin: -3px 10px 0 0; + vertical-align: middle; +} +.adminhtml-notification-index .grid .col-select, +.adminhtml-cache-index .grid .col-select, +.adminhtml-process-list .grid .col-select, +.indexer-indexer-list .grid .col-select { + width: 10px; +} +@font-face { + font-family: 'icons-blank-theme'; + src: url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot'); + src: url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot?#iefix') format('embedded-opentype'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf') format('truetype'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg#icons-blank-theme') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'icons-blank-theme'; + src: url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot'); + src: url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot?#iefix') format('embedded-opentype'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff'), url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} +.navigation { + background-color: #676056; + position: relative; + z-index: 5; +} +.navigation .level-0.reverse > .submenu { + right: 1px; +} +.navigation > ul { + position: relative; + text-align: right; +} +.navigation .level-0 > .submenu { + display: none; + position: absolute; + top: 100%; + padding: 19px 13px; +} +.navigation .level-0 > .submenu a { + display: block; + color: #676056; + font-size: 13px; + font-weight: 400; + line-height: 1.385; + padding: 3px 12px 3px; + text-decoration: none; +} +.navigation .level-0 > .submenu a:focus, +.navigation .level-0 > .submenu a:hover { + text-decoration: underline; +} +.navigation .level-0 > .submenu a:hover { + color: #ffffff; + background: #989287; + text-decoration: none; +} +.navigation .level-0 > .submenu li { + margin-bottom: 1px; +} +.navigation .level-0 > .submenu a[href="#"] { + cursor: default; + display: block; + color: #676056; + font-size: 14px; + font-weight: 700; + line-height: 1; + margin: 7px 0 6px; + padding: 0 12px; +} +.navigation .level-0 > .submenu a[href="#"]:focus, +.navigation .level-0 > .submenu a[href="#"]:hover { + color: #676056; + font-size: 14px; + font-weight: 700; + background: none; + text-decoration: none; +} +.navigation .level-0 { + display: inline-block; + float: left; + text-align: left; + transition: display 0.15s ease-out; +} +.navigation .level-0 > a { + background: none; + display: block; + padding: 12px 13px 0; + color: #f2ebde; + font-size: 13px; + font-weight: 600; + text-transform: uppercase; + text-decoration: none; + transition: background 0.15s ease-out; +} +.navigation .level-0 > a:after { + content: ""; + display: block; + margin-top: 10px; + height: 3px; + font-size: 0; +} +.navigation .level-0.active > a { + font-weight: 700; +} +.navigation .level-0.active > a:after { + background: #ef672f; +} +.navigation .level-0.hover.recent > a { + background: #fff; + color: #676056; + font-size: 13px; + font-weight: 600; +} +.navigation .level-0.hover.recent > a:after { + background: none; +} +.navigation .level-0.hover.recent.active > a { + font-weight: 700; +} +.navigation .level-0 > .submenu { + opacity: 0; + visibility: hidden; +} +.navigation .level-0.recent.hover > .submenu { + opacity: 1; + visibility: visible; +} +.no-js .navigation .level-0:hover > .submenu, +.no-js .navigation .level-0.hover > .submenu, +.no-js .navigation .level-0 > a:focus + .submenu { + display: block; +} +.navigation .level-0 > .submenu { + background: #fff; + box-shadow: 0 3px 3px rgba(50, 50, 50, 0.15); +} +.navigation .level-0 > .submenu li { + max-width: 200px; +} +.navigation .level-0 > .submenu > ul { + white-space: nowrap; +} +.navigation .level-0 > .submenu .column { + display: inline-block; + margin-left: 40px; + vertical-align: top; +} +.navigation .level-0 > .submenu .column:first-child { + margin-left: 0; +} +.navigation .level-0 .submenu .level-1 { + white-space: normal; +} +.navigation .level-0.parent .submenu .level-1.parent { + margin: 17px 0 25px; +} +.navigation .level-0.parent .level-1.parent:first-child { + margin-top: 0; +} +.navigation .level-2 .submenu { + margin-left: 7px; +} +.navigation .level-0 > .submenu .level-2 > a[href="#"] { + font-size: 13px; + margin-top: 10px; + margin-left: 7px; +} +.navigation .level-2 > .submenu a { + font-size: 12px; + line-height: 1.231; +} +.navigation .level-0 > .submenu .level-3 > a[href="#"], +.navigation .level-3 .submenu { + margin-left: 15px; +} +.navigation .level-0.item-system, +.navigation .level-0.item-stores { + float: none; +} +.navigation .level-0.item-system > .submenu, +.navigation .level-0.item-stores > .submenu { + left: auto; + right: 1px; +} +/* + Dashboard +-------------------------------------- */ +/* + Dashboard Layout +-------------------------------------- */ +.adminhtml-dashboard-index .col-1-layout { + max-width: 1300px; + border: none; + border-radius: 0; + padding: 0; + background: #f7f3eb; +} +.dashboard-inner { + padding-top: 35px; +} +.dashboard-inner:before, +.dashboard-inner:after { + content: ""; + display: table; +} +.dashboard-inner:after { + clear: both; +} +.dashboard-inner:before, +.dashboard-inner:after { + content: ""; + display: table; +} +.dashboard-inner:after { + clear: both; +} +.dashboard-secondary { + float: left; + width: 32%; + margin: 0 1.5%; +} +.dashboard-main { + float: right; + width: 65%; +} +/* + Dashboard Diagram +-------------------------------------- */ +.dashboard-diagram-chart { + max-width: 100%; + height: auto; +} +.dashboard-diagram-nodata, +.dashboard-diagram-switcher { + padding: 20px 0; +} +.dashboard-diagram-image { + background: #ffffff url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%; +} +/* + Dashboard Store Stats +-------------------------------------- */ +.dashboard-container .ui-tabs-panel { + background-color: #ffffff; + min-height: 40px; + padding: 15px; +} +.dashboard-store-stats { + margin-top: 35px; +} +.dashboard-store-stats .ui-tabs-panel { + background: #ffffff url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%; +} +.dashboard-item { + margin-bottom: 30px; +} +.dashboard-item-header { + margin-left: 5px; +} +.dashboard-item.dashboard-item-primary { + margin-bottom: 35px; +} +.dashboard-item.dashboard-item-primary .title { + font-size: 22px; + margin-bottom: 5px; +} +.dashboard-item.dashboard-item-primary .dashboard-sales-value { + display: block; + text-align: right; + font-weight: 600; + font-size: 30px; + margin-right: 12px; + padding-bottom: 5px; +} +.dashboard-item.dashboard-item-primary:first-child { + color: #ef672f; +} +.dashboard-item.dashboard-item-primary:first-child .title { + color: #ef672f; +} +.dashboard-totals { + background: #ffffff; + padding: 50px 15px 25px; +} +.dashboard-totals-list { + margin: 0; + padding: 0; + list-style: none none; +} +.dashboard-totals-list:before, +.dashboard-totals-list:after { + content: ""; + display: table; +} +.dashboard-totals-list:after { + clear: both; +} +.dashboard-totals-list:before, +.dashboard-totals-list:after { + content: ""; + display: table; +} +.dashboard-totals-list:after { + clear: both; +} +.dashboard-totals-item { + float: left; + width: 18%; + margin-left: 7%; + padding-top: 15px; + border-top: 2px solid #cac3b4; +} +.dashboard-totals-item:first-child { + margin-left: 0; +} +.dashboard-totals-label { + display: block; + font-size: 16px; + font-weight: 600; + padding-bottom: 2px; +} +.dashboard-totals-value { + color: #ef672f; + font-size: 20px; +} +.dashboard-data { + width: 100%; +} +.dashboard-data thead { + background: transparent; +} +.dashboard-data thead tr { + background: none; +} +.dashboard-data th, +.dashboard-data td { + border: none; + padding: 10px 12px; + text-align: right; +} +.dashboard-data th:first-child, +.dashboard-data td:first-child { + text-align: left; +} +.dashboard-data th { + color: #676056; + font-weight: 600; +} +.dashboard-data td { + background-color: transparent; +} +.dashboard-data tbody tr:hover td { + background-color: transparent; +} +.dashboard-data tbody tr:nth-child(odd) td, +.dashboard-data tbody tr:nth-child(odd):hover td, +.dashboard-data tbody tr:nth-child(odd) th, +.dashboard-data tbody tr:nth-child(odd):hover th { + background-color: #e1dbcf; +} +.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd) td, +.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd):hover td, +.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd) th, +.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd):hover th { + background-color: #f7f3eb; +} +.dashboard-data td.empty-text { + text-align: center; +} +.ui-tabs-panel .dashboard-data { + background-color: #ffffff; +} +.mage-dropdown-dialog.ui-dialog .ui-dialog-content { + overflow: visible; +} +.mage-dropdown-dialog.ui-dialog .ui-dialog-buttonpane { + padding: 0; +} +/* + System Messages +-------------------------------------- */ +.message-system-inner { + background: #f7f3eb; + border: 1px solid #c0bbaf; + border-top: 0; + border-radius: 0 0 5px 5px; + float: right; + overflow: hidden; +} +.message-system-unread .message-system-inner { + float: none; +} +.message-system-list { + margin: 0; + padding: 0; + list-style: none; + float: left; +} +.message-system .message-system-list { + width: 75%; +} +.message-system-list li { + padding: 5px 13px 7px 36px; + position: relative; +} +.message-system-short { + padding: 5px 13px 7px; + float: right; +} +.message-system-short span { + display: inline-block; + margin-left: 7px; + border-left: 1px #d1ccc3 solid; +} +.message-system-short span:first-child { + border: 0; + margin-left: 0; +} +.message-system-short a { + padding-left: 27px; + position: relative; + height: 16px; +} +.message-system .message-system-short a:before, +.message-system-list li:before { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + height: 16px; + width: 16px; + font-size: 16px; + line-height: 16px; + text-align: center; + position: absolute; + left: 7px; + top: 2px; +} +.message-system-list li:before { + top: 5px; + left: 13px; +} +.message-system .message-system-short .warning a:before, +.message-system-list li.warning:before { + content: "\e006"; + color: #f2a825; +} +.message-system .message-system-short .error a:before, +.message-system-list li.error:before { + content: "\e086"; + font-family: 'MUI-Icons'; + color: #c00815; +} +.ui-dialog .message-system-list { + margin-bottom: 25px; +} +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +.sales-order-create-index .order-errors .notice { + color: #ed4f2e; + font-size: 11px; + margin: 5px 0 0; +} +.order-errors .fieldset-wrapper-title .title { + box-sizing: border-box; + background: #fffbf0; + border: 1px solid #d87e34; + border-radius: 5px; + color: #676056; + font-size: 14px; + margin: 20px 0; + padding: 10px 26px 10px 35px; + position: relative; +} +.order-errors .fieldset-wrapper-title .title:before { + position: absolute; + left: 11px; + top: 50%; + margin-top: -11px; + width: auto; + height: auto; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 16px; + line-height: inherit; + content: '\e046'; + color: #d87e34; +} +.search-global.miniform { + position: relative; + z-index: 1000; + display: inline-block; + vertical-align: top; + margin: 6px 10px 0; +} +.search-global.miniform .mage-suggest { + border: 0; + border-radius: 0; +} +.search-global-actions { + display: none; +} +.search-global-field { + margin: 0; +} +.search-global-field .label { + position: absolute; + right: 4px; + z-index: 2; + cursor: pointer; + display: inline-block; + text-decoration: none; +} +.search-global-field .label > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.search-global-field .label > span.focusable:active, +.search-global-field .label > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.search-global-field .label > span.focusable:active, +.search-global-field .label > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.search-global-field .label:before { + font-family: 'MUI-Icons'; + content: "\e01f"; + font-size: 18px; + line-height: 29px; + color: #cac3b4; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.search-global-field .control { + width: 48px; + overflow: hidden; + opacity: 0; + transition: all .3s ease; +} +.search-global-field .control input[type="text"] { + background: transparent; + border: none; + width: 100%; +} +.search-global-field.active { + z-index: 2; +} +.search-global-field.active .label:before { + display: none; +} +.search-global-field.active .control { + overflow: visible; + opacity: 1; + transition: all .3s ease; + width: 300px; +} +.search-global-menu { + box-sizing: border-box; + display: block; + width: 100%; +} +.notifications-summary { + display: inline-block; + text-align: left; + position: relative; + z-index: 1; +} +.notifications-summary.active { + z-index: 999; +} +.notifications-action { + color: #f2ebde; + padding: 12px 22px 11px 22px; + text-transform: capitalize; + display: inline-block; + text-decoration: none; +} +.notifications-action:before { + font-family: "MUI-Icons"; + content: "\e06e"; + font-size: 18px; + line-height: 18px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.notifications-action:visited, +.notifications-action:focus, +.notifications-action:active, +.notifications-action:hover { + color: #f2ebde; + text-decoration: none; +} +.notifications-action.active { + background-color: #FFF; + color: #676056; +} +.notifications-action .text { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.notifications-action .text.focusable:active, +.notifications-action .text.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.notifications-action .text.focusable:active, +.notifications-action .text.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.notifications-action .qty.counter { + display: inline-block; + background: #ed4f2e; + color: #f2ebde; + font-size: 12px; + line-height: 12px; + font-weight: bold; + padding: 1px 3px; + position: absolute; + top: 6px; + left: 50%; + border-radius: 4px; +} +.notifications-list { + width: 300px; + padding: 0; + margin: 0; +} +.notifications-list .last { + padding: 10px; + text-align: center; + font-size: 12px; +} +.notifications-summary .notifications-entry { + padding: 15px; + color: #676056; + font-size: 11px; + font-weight: 400; +} +.notifications-entry { + position: relative; + z-index: 1; +} +.notifications-entry:hover .action { + display: block; +} +.notifications-entry-title { + padding-right: 15px; + color: #ed4f2e; + font-size: 12px; + font-weight: 600; + display: block; + margin-bottom: 10px; +} +.notifications-entry-description { + line-height: 1.3; + display: block; + max-height: 3.9em; + overflow: hidden; + margin-bottom: 10px; + text-overflow: ellipsis; +} +.notifications-close.action { + position: absolute; + z-index: 1; + top: 12px; + right: 12px; + display: inline-block; + background-image: none; + background: none; + 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; + display: none; +} +.notifications-close.action > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.notifications-close.action > span.focusable:active, +.notifications-close.action > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.notifications-close.action > span.focusable:active, +.notifications-close.action > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.notifications-close.action:before { + font-family: 'MUI-Icons'; + content: "\e07f"; + font-size: 16px; + line-height: inherit; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.notifications-close.action:focus, +.notifications-close.action:active { + background: none; + border: none; +} +.notifications-close.action:hover { + background: none; + border: none; +} +.notifications-close.action.disabled, +.notifications-close.action[disabled], +fieldset[disabled] .notifications-close.action { + cursor: not-allowed; + pointer-events: none; + opacity: 0.5; +} +.notifications-dialog-content { + display: none; +} +.notifications-critical .notifications-entry-title { + padding-left: 25px; + display: inline-block; + text-decoration: none; +} +.notifications-critical .notifications-entry-title:before { + font-family: 'MUI-Icons'; + content: "\e086"; + font-size: 18px; + line-height: 18px; + color: #c00815; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.notifications-critical .notifications-entry-title:before { + position: absolute; + margin-left: -25px; +} +.notifications-dialog-content .notifications-entry-time { + color: #8c867e; + font-size: 13px; + font-family: Helvetica, Arial, sans-serif; + position: absolute; + right: 17px; + bottom: 27px; + text-align: right; +} +.notifications-url { + display: inline-block; + text-decoration: none; +} +.notifications-url > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.notifications-url > span.focusable:active, +.notifications-url > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.notifications-url > span.focusable:active, +.notifications-url > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.notifications-url:after { + font-family: 'MUI-Icons'; + content: "\e084"; + font-size: 16px; + line-height: inherit; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; + margin: -2px 0 0 10px; +} +.notifications-dialog-content .notifications-entry-title { + font-size: 15px; +} +.locale-switcher-field { + white-space: nowrap; + float: left; +} +.locale-switcher-field .control, +.locale-switcher-field .label { + vertical-align: middle; + margin: 0 10px 0 0; + display: inline-block; +} +.locale-switcher-select { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + appearance: none; + border: 1px solid #ada89e; + max-width: 200px; + height: 31px; + background: url("../images/select-bg.svg") no-repeat 100% 50%; + background-size: 30px 60px; + padding-right: 29px; + text-indent: .01px; + text-overflow: ''; +} +.locale-switcher-select::-ms-expand { + display: none; +} +.lt-ie10 .locale-switcher-select { + background-image: none; + padding-right: 4px; +} +@-moz-document url-prefix() { + .locale-switcher-select { + background-image: none; + } +} +@-moz-document url-prefix() { + .locale-switcher-select { + background-image: none; + } +} +.mage-suggest { + text-align: left; + box-sizing: border-box; + position: relative; + display: inline-block; + vertical-align: top; + width: 100%; + background-color: #fff; + border: 1px solid #ada89e; + border-radius: 2px; +} +.mage-suggest:after { + position: absolute; + top: 3px; + right: 3px; + bottom: 0; + width: 22px; + text-align: center; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e01f'; + font-size: 18px; + color: #b2b2b2; +} +.mage-suggest input[type="search"], +.mage-suggest input.search { + width: 100%; + border: none; + background: none; + padding-right: 30px; +} +.mage-suggest.category-select input[type="search"], +.mage-suggest.category-select input.search { + height: 26px; +} +.mage-suggest-dropdown { + position: absolute; + left: 0; + right: 0; + top: 100%; + margin: 1px -1px 0 -1px; + border: 1px solid #cac2b5; + background: #fff; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + z-index: 990; +} +.mage-suggest-dropdown ul { + margin: 0; + padding: 0; + list-style: none; +} +.mage-suggest-dropdown li { + border-bottom: 1px solid #e5e5e5; + padding: 0; +} +.mage-suggest-dropdown li a { + display: block; +} +.mage-suggest-dropdown li a.ui-state-focus { + background: #f5f5f5; +} +.mage-suggest-dropdown li a, +.mage-suggest-dropdown .jstree li a:hover, +.mage-suggest-dropdown .jstree .jstree-hovered, +.mage-suggest-dropdown .jstree .jstree-clicked { + padding: 6px 12px 5px; + text-decoration: none; + color: #333; +} +.mage-suggest-dropdown .jstree li a:hover, +.mage-suggest-dropdown .jstree .jstree-hovered, +.mage-suggest-dropdown .jstree .jstree-clicked { + border: none; +} +.mage-suggest-dropdown .jstree li { + border-bottom: 0; +} +.mage-suggest-dropdown .jstree li a { + display: inline-block; +} +.mage-suggest-dropdown .jstree .mage-suggest-selected > a { + color: #000; + background: #F1FFEB; +} +.field-category_ids .mage-suggest-dropdown, +.field-new_category_parent .mage-suggest-dropdown { + max-height: 200px; + overflow: auto; +} +.mage-suggest-dropdown .jstree .mage-suggest-selected > a:hover, +.mage-suggest-dropdown .jstree .mage-suggest-selected > .jstree-hovered, +.mage-suggest-dropdown .jstree .mage-suggest-selected > .jstree-clicked, +.mage-suggest-dropdown .jstree .mage-suggest-selected.mage-suggest-not-active > .jstree-hovered, +.mage-suggest-dropdown .jstree .mage-suggest-selected.mage-suggest-not-active > .jstree-clicked { + background: #E5FFD9; +} +.mage-suggest-dropdown .jstree .mage-suggest-not-active > a { + color: #D4D4D4; +} +.mage-suggest-dropdown .jstree .mage-suggest-not-active > a:hover, +.mage-suggest-dropdown .jstree .mage-suggest-not-active > .jstree-hovered, +.mage-suggest-dropdown .jstree .mage-suggest-not-active > .jstree-clicked { + background: #F5F5F5; +} +.mage-suggest-dropdown .category-path { + font-size: 11px; + margin-left: 10px; + color: #9ba8b5; +} +.suggest-expandable .action-dropdown .action-toggle { + display: inline-block; + max-width: 500px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + background: none; + border: none; + box-shadow: none; + color: #676056; + font-size: 12px; + padding: 5px 4px; + filter: none; +} +.suggest-expandable .action-dropdown .action-toggle span { + display: inline; +} +.suggest-expandable .action-dropdown .action-toggle:before { + display: inline-block; + float: right; + margin-left: 4px; + font-size: 13px; + color: #b2b0ad; +} +.suggest-expandable .action-dropdown .action-toggle:hover:before { + color: #7e7e7e; +} +.suggest-expandable .dropdown-menu { + margin: 1px 0 0; + left: 0; + right: auto; + width: 245px; + z-index: 4; +} +.suggest-expandable .mage-suggest { + border: none; + border-radius: 3px 3px 0 0; +} +.suggest-expandable .mage-suggest:after { + top: 10px; + right: 8px; +} +.suggest-expandable .mage-suggest-inner .title { + margin: 0; + padding: 0 10px 4px; + text-transform: uppercase; + color: #a6a098; + font-size: 12px; + border-bottom: 1px solid #e5e5e5; +} +.suggest-expandable .mage-suggest-inner > input[type="search"], +.suggest-expandable .mage-suggest-inner > input.search { + position: relative; + margin: 6px 5px 5px; + padding-right: 20px; + border: 1px solid #ada89e; + width: 236px; + z-index: 1; +} +.suggest-expandable .mage-suggest-inner > input.ui-autocomplete-loading, +.suggest-expandable .mage-suggest-inner > input.mage-suggest-state-loading { + background: #ffffff url("../mui/images/ajax-loader-small.gif") no-repeat 190px 50%; +} +.suggest-expandable .mage-suggest-dropdown { + margin-top: 0; + border-top: 0; + border-radius: 0 0 3px 3px; + max-height: 300px; + overflow: auto; + width: 100%; + float: left; +} +.suggest-expandable .mage-suggest-dropdown ul { + margin: 0; + padding: 0; + list-style: none; +} +.suggest-expandable .action-show-all:hover, +.suggest-expandable .action-show-all:active, +.suggest-expandable .action-show-all:focus, +.suggest-expandable .action-show-all[disabled] { + border-top: 1px solid #e5e5e5; + display: block; + width: 100%; + padding: 8px 10px 10px; + text-align: left; + font: 12px/1.333 Arial, Verdana, sans-serif; + color: #676056; +} +.product-actions .suggest-expandable { + max-width: 500px; + float: left; + margin-top: 1px; +} +.page-actions.fixed #product-template-suggest-container { + display: none; +} +.catalog-category-edit .col-2-left-layout:before { + display: none; +} +.category-content .ui-tabs-panel .fieldset { + padding-top: 40px; +} +.category-content .ui-tabs-panel .fieldset .legend { + display: none; +} +.attributes-edit-form .field:not(.field-weight) .addon { + display: block; + position: relative; +} +.attributes-edit-form .field:not(.field-weight) .addon input[type="text"] { + border-width: 1px; +} +.attributes-edit-form .field:not(.field-weight) .addon .addafter { + display: block; + border: 0; + height: auto; + width: auto; +} +.attributes-edit-form .field:not(.field-weight) .addon input:focus ~ .addafter { + box-shadow: none; +} +.attributes-edit-form .with-addon .textarea { + margin: 0; +} +.attributes-edit-form .attribute-change-checkbox { + display: block; + margin-top: 5px; +} +.attributes-edit-form .attribute-change-checkbox .label { + float: none; + padding: 0; + width: auto; +} +.attributes-edit-form .attribute-change-checkbox .checkbox { + margin-right: 5px; + width: auto; +} +.attributes-edit-form .field-price .addon > input, +.attributes-edit-form .field-special_price .addon > input, +.attributes-edit-form .field-gift_wrapping_price .addon > input, +.attributes-edit-form .field-msrp .addon > input, +.attributes-edit-form .field-gift_wrapping_price .addon > input { + padding-left: 23px; +} +.attributes-edit-form .field-price .addafter > strong, +.attributes-edit-form .field-special_price .addafter > strong, +.attributes-edit-form .field-gift_wrapping_price .addafter > strong, +.attributes-edit-form .field-msrp .addafter > strong, +.attributes-edit-form .field-gift_wrapping_price .addafter > strong { + left: 5px; + position: absolute; + top: 3px; +} +.attributes-edit-form .field.type-price input:focus + label, +.attributes-edit-form .field-price input:focus + label, +.attributes-edit-form .field-special_price input:focus + label, +.attributes-edit-form .field-msrp input:focus + label, +.attributes-edit-form .field-weight input:focus + label { + box-shadow: none; +} +.attributes-edit-form .field-special_from_date > .control .input-text, +.attributes-edit-form .field-special_to_date > .control .input-text, +.attributes-edit-form .field-news_from_date > .control .input-text, +.attributes-edit-form .field-news_to_date > .control .input-text, +.attributes-edit-form .field-custom_design_from > .control .input-text, +.attributes-edit-form .field-custom_design_to > .control .input-text { + border-width: 1px; + width: 130px; +} +.attributes-edit-form .field-weight .fields-group-2 .control { + padding-right: 27px; +} +.attributes-edit-form .field-weight .fields-group-2 .control .addafter + .addafter { + border-width: 1px 1px 1px 0; + border-style: solid; + height: 28px; + right: 0; + position: absolute; + top: 0; +} +.attributes-edit-form .field-weight .fields-group-2 .control .addafter strong { + line-height: 28px; +} +.attributes-edit-form .field-weight .fields-group-2 .control > input:focus + .addafter + .addafter { + box-shadow: 0 0 8px rgba(82, 168, 236, 0.6); +} +.attributes-edit-form .field-gift_message_available .addon > input[type="checkbox"], +.attributes-edit-form .field-gift_wrapping_available .addon > input[type="checkbox"] { + width: auto; + margin-right: 5px; +} +.attributes-edit-form .fieldset > .addafter { + display: none; +} +.advanced-inventory-edit .field.choice { + display: block; + margin: 3px 0 0; +} +.advanced-inventory-edit .field.choice .label { + padding-top: 1px; +} +.product-actions:before, +.product-actions:after { + content: ""; + display: table; +} +.product-actions:after { + clear: both; +} +.product-actions:before, +.product-actions:after { + content: ""; + display: table; +} +.product-actions:after { + clear: both; +} +.product-actions .switcher { + float: right; +} +#configurable-attributes-container .actions-select { + display: inline-block; + position: relative; +} +#configurable-attributes-container .actions-select:before, +#configurable-attributes-container .actions-select:after { + content: ""; + display: table; +} +#configurable-attributes-container .actions-select:after { + clear: both; +} +#configurable-attributes-container .actions-select:before, +#configurable-attributes-container .actions-select:after { + content: ""; + display: table; +} +#configurable-attributes-container .actions-select:after { + clear: both; +} +#configurable-attributes-container .actions-select .action.toggle { + cursor: pointer; + display: inline-block; + text-decoration: none; +} +#configurable-attributes-container .actions-select .action.toggle:after { + font-family: 'icons-blank-theme'; + content: '\e607'; + font-size: 22px; + line-height: 22px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +#configurable-attributes-container .actions-select .action.toggle:hover:after { + color: inherit; +} +#configurable-attributes-container .actions-select .action.toggle:active:after { + color: inherit; +} +#configurable-attributes-container .actions-select .action.toggle.active { + display: inline-block; + text-decoration: none; +} +#configurable-attributes-container .actions-select .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: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +#configurable-attributes-container .actions-select .action.toggle.active:hover:after { + color: inherit; +} +#configurable-attributes-container .actions-select .action.toggle.active:active:after { + color: inherit; +} +#configurable-attributes-container .actions-select ul.dropdown { + margin: 0; + padding: 0; + list-style: none none; + box-sizing: border-box; + background: #ffffff; + border: 1px solid #bbbbbb; + position: absolute; + z-index: 100; + top: 100%; + min-width: 100%; + margin-top: 4px; + display: none; + box-shadow: 0 3px 3px rgba(0, 0, 0, 0.15); +} +#configurable-attributes-container .actions-select ul.dropdown li { + margin: 0; + padding: 3px 5px; +} +#configurable-attributes-container .actions-select ul.dropdown li:hover { + background: #e8e8e8; + cursor: pointer; +} +#configurable-attributes-container .actions-select.active { + overflow: visible; +} +#configurable-attributes-container .actions-select.active ul.dropdown { + display: block; +} +#configurable-attributes-container .actions-select .action.toggle { + padding: 1px 8px; + border: 1px solid #ada89e; + background: #fff; + border-radius: 0 2px 2px 0; +} +#configurable-attributes-container .actions-select .action.toggle:after { + width: 14px; + text-indent: -2px; +} +#configurable-attributes-container .actions-select ul.dropdown li:hover { + background: #eef8fc; +} +#configurable-attributes-container .actions-select ul.dropdown a { + color: #333; + text-decoration: none; +} +#product-variations-matrix .actions-image-uploader { + display: inline-block; + position: relative; + display: block; + width: 50px; +} +#product-variations-matrix .actions-image-uploader:before, +#product-variations-matrix .actions-image-uploader:after { + content: ""; + display: table; +} +#product-variations-matrix .actions-image-uploader:after { + clear: both; +} +#product-variations-matrix .actions-image-uploader:before, +#product-variations-matrix .actions-image-uploader:after { + content: ""; + display: table; +} +#product-variations-matrix .actions-image-uploader:after { + clear: both; +} +#product-variations-matrix .actions-image-uploader .action.split { + float: left; + margin: 0; +} +#product-variations-matrix .actions-image-uploader .action.toggle { + float: right; + margin: 0; +} +#product-variations-matrix .actions-image-uploader .action.toggle { + padding: 6px 5px; + display: inline-block; + text-decoration: none; +} +#product-variations-matrix .actions-image-uploader .action.toggle > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +#product-variations-matrix .actions-image-uploader .action.toggle > span.focusable:active, +#product-variations-matrix .actions-image-uploader .action.toggle > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +#product-variations-matrix .actions-image-uploader .action.toggle > span.focusable:active, +#product-variations-matrix .actions-image-uploader .action.toggle > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +#product-variations-matrix .actions-image-uploader .action.toggle:after { + font-family: 'icons-blank-theme'; + content: '\e607'; + font-size: 22px; + line-height: 14px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +#product-variations-matrix .actions-image-uploader .action.toggle:hover:after { + color: inherit; +} +#product-variations-matrix .actions-image-uploader .action.toggle:active:after { + color: inherit; +} +#product-variations-matrix .actions-image-uploader .action.toggle.active { + display: inline-block; + text-decoration: none; +} +#product-variations-matrix .actions-image-uploader .action.toggle.active > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +#product-variations-matrix .actions-image-uploader .action.toggle.active > span.focusable:active, +#product-variations-matrix .actions-image-uploader .action.toggle.active > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +#product-variations-matrix .actions-image-uploader .action.toggle.active > span.focusable:active, +#product-variations-matrix .actions-image-uploader .action.toggle.active > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +#product-variations-matrix .actions-image-uploader .action.toggle.active:after { + font-family: 'icons-blank-theme'; + content: '\e618'; + font-size: 22px; + line-height: 14px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +#product-variations-matrix .actions-image-uploader .action.toggle.active:hover:after { + color: inherit; +} +#product-variations-matrix .actions-image-uploader .action.toggle.active:active:after { + color: inherit; +} +#product-variations-matrix .actions-image-uploader ul.dropdown { + margin: 0; + padding: 0; + list-style: none none; + box-sizing: border-box; + background: #ffffff; + border: 1px solid #bbbbbb; + position: absolute; + z-index: 100; + top: 100%; + min-width: 100%; + margin-top: 4px; + display: none; + box-shadow: 0 3px 3px rgba(0, 0, 0, 0.15); +} +#product-variations-matrix .actions-image-uploader ul.dropdown li { + margin: 0; + padding: 3px 5px; +} +#product-variations-matrix .actions-image-uploader ul.dropdown li:hover { + background: #e8e8e8; + cursor: pointer; +} +#product-variations-matrix .actions-image-uploader.active { + overflow: visible; +} +#product-variations-matrix .actions-image-uploader.active ul.dropdown { + display: block; +} +#product-variations-matrix .actions-image-uploader .action.toggle { + padding: 0 2px; + border: 1px solid #b7b2a7; + background: #fff; + border-radius: 0 4px 4px 0; + border-left: none; + height: 33px; +} +#product-variations-matrix .actions-image-uploader .action.toggle.no-display { + display: none; +} +#product-variations-matrix .actions-image-uploader .action.toggle:after { + width: 12px; + text-indent: -5px; +} +#product-variations-matrix .actions-image-uploader ul.dropdown { + left: 0; + margin-left: 0; + width: 100px; +} +#product-variations-matrix .actions-image-uploader ul.dropdown li:hover { + background: #eef8fc; +} +#product-variations-matrix .actions-image-uploader ul.dropdown a { + color: #333; + text-decoration: none; +} +.debugging-hints .page-actions { + position: relative; + z-index: 1; +} +.debugging-hints .page-actions .debugging-hint-template-file { + left: auto !important; + right: 0 !important; +} +/* + Reports - test +-------------------------------------- */ +/* + Reports - test Report +-------------------------------------- */ +.filter-segments { + list-style: none; + padding: 0; +} +.adminhtml-report-customer-test-detail .col-id { + width: 35px; +} +.adminhtml-report-customer-test-detail .col-period { + white-space: nowrap; + width: 70px; +} +.adminhtml-report-customer-test-detail .col-zip { + width: 50px; +} +/* + Reports - tests +-------------------------------------- */ +.adminhtml-report-customer-test-segment .col-id { + width: 35px; +} +.adminhtml-report-customer-test-segment .col-status { + width: 65px; +} +.adminhtml-report-customer-test-segment .col-qty { + width: 145px; +} +.adminhtml-report-customer-test-segment .col-segment, +.adminhtml-report-customer-test-segment .col-website { + width: 35%; +} +.adminhtml-report-customer-test-segment .col-select { + width: 45px; +} +/* + GFR +--------------------------------------*/ +.test-custom-attributes { + margin-bottom: 20px; +} +/* + GFW +--------------------------------------*/ +.adminhtml-test-index th.col-id { + text-align: left; +} +.adminhtml-test-index .col-price { + text-align: right; + width: 50px; +} +.adminhtml-test-index .col-actions { + width: 50px; +} +.adminhtml-test-index .col-select { + width: 60px; +} +.adminhtml-test-edit .field-image .control { + line-height: 28px; +} +.adminhtml-test-edit .field-image a { + display: inline-block; + margin: 0 5px 0 0; +} +.adminhtml-test-edit .field-image img { + vertical-align: middle; +} +.adminhtml-test-new .field-image .input-file, +.adminhtml-test-edit .field-image .input-file { + display: inline-block; + margin: 0 15px 0 0; + width: auto; +} +.adminhtml-test-new .field-image .addafter, +.adminhtml-test-edit .field-image .addafter { + border: 0; + box-shadow: none; + display: inline-block; + margin: 0 15px 0 0; + height: auto; + width: auto; +} +.adminhtml-test-new .field-image .delete-image, +.adminhtml-test-edit .field-image .delete-image { + display: inline-block; + white-space: nowrap; +} +.adminhtml-test-edit .field-image .delete-image input { + margin: -3px 5px 0 0; + width: auto; + display: inline-block; +} +.adminhtml-test-edit .field-image .addon .delete-image input:focus + label { + border: 0; + box-shadow: none; +} +.adminhtml-test-index .col-id { + width: 35px; +} +.adminhtml-test-index .col-status { + white-space: normal; + width: 75px; +} +.adminhtml-test-index .col-websites { + white-space: nowrap; + width: 200px; +} +.adminhtml-test-index .col-price .label { + display: inline-block; + min-width: 60px; + white-space: nowrap; +} +.adminhtml-test-index .col-price .price-excl-tax .price, +.adminhtml-test-index .col-price .price-incl-tax .price { + font-weight: bold; +} +/* + tests +--------------------------------------*/ +.invitee_information, +.inviter_information { + width: 48.9362%; +} +.invitee_information { + float: left; +} +.inviter_information { + float: right; +} +.test_information .data-table th, +.invitee_information .data-table th, +.inviter_information .data-table th { + width: 20%; + white-space: nowrap; +} +.test_information .data-table textarea, +.test_information .data-table input { + width: 100%; +} +.tests-history ul { + margin: 0; + padding-left: 25px; +} +.tests-history ul .status:before { + display: inline-block; + content: "|"; + margin: 0 10px; +} +/* + Reports - Order Conversion Rate +-------------------------------------- */ +.adminhtml-report-test-order .col-period { + white-space: nowrap; + width: 70px; +} +.adminhtml-report-test-order .col-inv-sent, +.adminhtml-report-test-order .col-inv-acc, +.adminhtml-report-test-order .col-acc, +.adminhtml-report-test-order .col-rate { + text-align: right; + width: 23%; +} +/* + Reports - tests - Customer +-------------------------------------- */ +.adminhtml-report-test-customer .col-id { + width: 35px; +} +.adminhtml-report-test-customer .col-period { + white-space: nowrap; + width: 70px; +} +.adminhtml-report-test-customer .col-inv-sent, +.adminhtml-report-test-customer .col-inv-acc { + text-align: right; + width: 120px; +} +/* + Reports - tests - General +-------------------------------------- */ +.adminhtml-report-test-index .col-period { + white-space: nowrap; +} +.adminhtml-report-test-index .col-inv-sent, +.adminhtml-report-test-index .col-inv-acc, +.adminhtml-report-test-index .col-inv-disc, +.adminhtml-report-test-index .col-inv-acc-rate, +.adminhtml-report-test-index .col-inv-disc-rate { + text-align: right; + width: 19%; +} +/* + test Data table - alternative view +-------------------------------------- */ +.test_information .data-table, +.invitee_information .data-table, +.inviter_information .data-table { + width: 100%; +} +.test_information .data-table tbody tr th, +.invitee_information .data-table tbody tr th, +.inviter_information .data-table tbody tr th { + font-weight: bold; +} +.test_information .data-table tbody tr td, +.test_information .data-table tbody tr th, +.invitee_information .data-table tbody tr td, +.invitee_information .data-table tbody tr th, +.inviter_information .data-table tbody tr td, +.inviter_information .data-table tbody tr th { + background-color: #fff; + border: 0; + padding: 9px 10px 10px; + color: #666; + vertical-align: top; +} +.test_information .data-table tbody tr:nth-child(2n+1) td, +.test_information .data-table tbody tr:nth-child(2n+1) th, +.invitee_information .data-table tbody tr:nth-child(2n+1) td, +.invitee_information .data-table tbody tr:nth-child(2n+1) th, +.inviter_information .data-table tbody tr:nth-child(2n+1) td, +.inviter_information .data-table tbody tr:nth-child(2n+1) th { + background-color: #fbfaf6; +} +[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table .col-sort-order { + width: 80px; +} +[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td, +[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td { + vertical-align: top; +} +[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td select, +[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td select { + display: block; + width: 100%; +} +[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td .input-radio.global-scope, +[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td .input-radio.global-scope { + margin-top: 9px; +} +.sales-order-create-index .ui-dialog .content > .test .field.text .input-text { + width: 100%; +} +.sales-order-create-index .ui-dialog .content > .test .note .price { + font-weight: 600; +} +.sales-order-create-index .ui-dialog .content > .test .note .price:before { + content: ": "; +} +.sales-order-create-index .ui-dialog .content > .test .fixed.amount .label:after { + content: ": "; +} +.sales-order-create-index .ui-dialog .content > .test .fixed.amount .control { + display: inline-block; + font-weight: 600; +} +.sales-order-create-index .ui-dialog .content > .test .fixed.amount .control .control-value { + margin: -2px 0 0; + padding: 0; +} +.eq-ie9 [class^=" adminhtml-test-"] .custom-options .data-table { + word-wrap: normal; + table-layout: auto; +} +.rma-items .col-actions a.disabled, +.newRma .col-actions a.disabled { + cursor: default; + opacity: .5; +} +.rma-items .col-actions a.disabled:hover, +.newRma .col-actions a.disabled:hover { + text-decoration: none; +} +.block.mselect-list .mselect-input { + width: 100%; +} +.block.mselect-list .mselect-input-container .mselect-save { + top: 4px; +} +.block.mselect-list .mselect-input-container .mselect-cancel { + top: 4px; +} +html { + font-size: 62.5%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + font-size-adjust: 100%; +} +body, +html { + height: 100%; + min-height: 100%; +} +body { + color: #676056; + font-family: 'Open Sans', sans-serif; + line-height: 1.33; + font-weight: 400; + font-size: 1.4rem; + background: #f2ebde; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; +} +body > * { + -webkit-flex-grow: 0; + flex-grow: 0; + -webkit-flex-shrink: 0; + flex-shrink: 0; + -webkit-flex-basis: auto; + flex-basis: auto; +} +.page-wrapper { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + min-height: 100%; + width: 100%; + max-width: 100%; + min-width: 990px; +} +.page-wrapper > * { + -webkit-flex-grow: 0; + flex-grow: 0; + -webkit-flex-shrink: 0; + flex-shrink: 0; + -webkit-flex-basis: auto; + flex-basis: auto; +} +.page-header { + text-align: right; +} +.page-header-wrapper { + background-color: #31302b; +} +.page-header:after { + content: ""; + display: table; + clear: both; +} +.page-header .logo { + margin-top: 5px; + float: left; + text-decoration: none; + display: inline-block; +} +.page-header .logo:before { + content: ""; + display: inline-block; + vertical-align: middle; + width: 109px; + height: 35px; + background-image: url("../images/logo.svg"); + background-size: 109px 70px; + background-repeat: no-repeat; +} +.page-header .logo:after { + display: inline-block; + vertical-align: middle; + margin-left: 10px; + content: attr(data-edition); + font-weight: 600; + font-size: 16px; + color: #ef672f; + margin-top: -2px; +} +.page-header .logo span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.page-header .logo span.focusable:active, +.page-header .logo span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.page-header .logo span.focusable:active, +.page-header .logo span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.page-header .dropdown-menu { + border: 0; +} +.admin-user { + display: inline-block; + vertical-align: top; + position: relative; + text-align: left; +} +.admin-user-account { + text-decoration: none; + display: inline-block; + padding: 12px 14px; + color: #f2ebde; +} +.admin-user-account:after { + font-family: "MUI-Icons"; + content: "\e02c"; + font-size: 13px; + line-height: 13px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; + margin: -3px 0 0; +} +.admin-user-account:link, +.admin-user-account:visited { + color: #f2ebde; +} +.admin-user-account:focus, +.admin-user-account:active, +.admin-user-account:hover { + color: #f2ebde; + text-decoration: none; +} +.active .admin-user-account { + background-color: #FFF; + color: #676056; +} +.admin-user-menu { + padding: 15px; + white-space: nowrap; + margin-top: 0; +} +.admin-user-menu li { + border: 0; + padding: 0; +} +.admin-user-menu li:hover { + background: transparent; +} +.admin-user-menu a { + display: block; + color: #676056; + font-size: 13px; + font-weight: 400; + line-height: 1.385; + padding: 3px 12px 3px; + text-decoration: none; +} +.admin-user-menu a:focus, +.admin-user-menu a:hover { + text-decoration: underline; +} +.admin-user-menu a:hover { + color: #ffffff; + background: #989287; + text-decoration: none; +} +.admin-user-menu a span:before { + content: "("; +} +.admin-user-menu a span:after { + content: ")"; +} +.page-actions.fixed .page-actions-buttons { + padding-right: 15px; +} +.page-main-actions { + background: #e0dace; + color: #645d53; + padding: 15px; + margin-left: auto; + margin-right: auto; + box-sizing: border-box; +} +.page-main-actions:before, +.page-main-actions:after { + content: ""; + display: table; +} +.page-main-actions:after { + clear: both; +} +.page-main-actions:before, +.page-main-actions:after { + content: ""; + display: table; +} +.page-main-actions:after { + clear: both; +} +.page-main-actions .page-actions { + float: right; +} +.page-main-actions .page-actions .page-actions-buttons { + float: right; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + justify-content: flex-end; +} +.page-main-actions .page-actions button, +.page-main-actions .page-actions .action-add.mselect-button-add { + margin-left: 13px; +} +.page-main-actions .page-actions button.primary, +.page-main-actions .page-actions .action-add.mselect-button-add.primary { + float: right; + -ms-flex-order: 2; + -webkit-order: 2; + order: 2; +} +.page-main-actions .page-actions button.save:not(.primary), +.page-main-actions .page-actions .action-add.mselect-button-add.save:not(.primary) { + float: right; + -ms-flex-order: 1; + -webkit-order: 1; + order: 1; +} +.page-main-actions .page-actions button.back, +.page-main-actions .page-actions button.action-back, +.page-main-actions .page-actions button.delete, +.page-main-actions .page-actions .action-add.mselect-button-add.back, +.page-main-actions .page-actions .action-add.mselect-button-add.action-back, +.page-main-actions .page-actions .action-add.mselect-button-add.delete { + background-image: none; + background: none; + 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; + margin: 0 13px; +} +.page-main-actions .page-actions button.back:focus, +.page-main-actions .page-actions button.action-back:focus, +.page-main-actions .page-actions button.delete:focus, +.page-main-actions .page-actions button.back:active, +.page-main-actions .page-actions button.action-back:active, +.page-main-actions .page-actions button.delete:active, +.page-main-actions .page-actions .action-add.mselect-button-add.back:focus, +.page-main-actions .page-actions .action-add.mselect-button-add.action-back:focus, +.page-main-actions .page-actions .action-add.mselect-button-add.delete:focus, +.page-main-actions .page-actions .action-add.mselect-button-add.back:active, +.page-main-actions .page-actions .action-add.mselect-button-add.action-back:active, +.page-main-actions .page-actions .action-add.mselect-button-add.delete:active { + background: none; + border: none; +} +.page-main-actions .page-actions button.back:hover, +.page-main-actions .page-actions button.action-back:hover, +.page-main-actions .page-actions button.delete:hover, +.page-main-actions .page-actions .action-add.mselect-button-add.back:hover, +.page-main-actions .page-actions .action-add.mselect-button-add.action-back:hover, +.page-main-actions .page-actions .action-add.mselect-button-add.delete:hover { + background: none; + border: none; +} +.page-main-actions .page-actions button.back.disabled, +.page-main-actions .page-actions button.action-back.disabled, +.page-main-actions .page-actions button.delete.disabled, +.page-main-actions .page-actions button.back[disabled], +.page-main-actions .page-actions button.action-back[disabled], +.page-main-actions .page-actions button.delete[disabled], +fieldset[disabled] .page-main-actions .page-actions button.back, +fieldset[disabled] .page-main-actions .page-actions button.action-back, +fieldset[disabled] .page-main-actions .page-actions button.delete, +.page-main-actions .page-actions .action-add.mselect-button-add.back.disabled, +.page-main-actions .page-actions .action-add.mselect-button-add.action-back.disabled, +.page-main-actions .page-actions .action-add.mselect-button-add.delete.disabled, +.page-main-actions .page-actions .action-add.mselect-button-add.back[disabled], +.page-main-actions .page-actions .action-add.mselect-button-add.action-back[disabled], +.page-main-actions .page-actions .action-add.mselect-button-add.delete[disabled], +fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.back, +fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.action-back, +fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.delete { + cursor: not-allowed; + pointer-events: none; + opacity: 0.5; +} +.ie .page-main-actions .page-actions button.back, +.ie .page-main-actions .page-actions button.action-back, +.ie .page-main-actions .page-actions button.delete, +.ie .page-main-actions .page-actions .action-add.mselect-button-add.back, +.ie .page-main-actions .page-actions .action-add.mselect-button-add.action-back, +.ie .page-main-actions .page-actions .action-add.mselect-button-add.delete { + margin-top: 6px; +} +.page-main-actions .page-actions button.delete, +.page-main-actions .page-actions .action-add.mselect-button-add.delete { + color: #e22626; + float: left; + -ms-flex-order: -1; + -webkit-order: -1; + order: -1; +} +.page-main-actions .page-actions button.back, +.page-main-actions .page-actions button.action-back, +.page-main-actions .page-actions .action-add.mselect-button-add.back, +.page-main-actions .page-actions .action-add.mselect-button-add.action-back { + float: left; + -ms-flex-order: -1; + -webkit-order: -1; + order: -1; + display: inline-block; + text-decoration: none; +} +.page-main-actions .page-actions button.back:before, +.page-main-actions .page-actions button.action-back:before, +.page-main-actions .page-actions .action-add.mselect-button-add.back:before, +.page-main-actions .page-actions .action-add.mselect-button-add.action-back:before { + font-family: 'icons-blank-theme'; + content: '\e625'; + font-size: inherit; + line-height: normal; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; + margin: 0 2px 0 0; +} +.page-main-actions .page-actions .actions-split { + margin-left: 13px; + float: right; + -ms-flex-order: 2; + -webkit-order: 2; + order: 2; +} +.page-main-actions .page-actions .actions-split button.primary, +.page-main-actions .page-actions .actions-split .action-add.mselect-button-add.primary { + float: left; +} +.page-main-actions .page-actions .actions-split .dropdown-menu { + text-align: left; +} +.page-main-actions .page-actions .actions-split .dropdown-menu .item { + display: block; +} +.page-main-actions .page-actions.fixed { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 10; + padding: 0; + background: -webkit-linear-gradient(top, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%); + background: -ms-linear-gradient(top, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%); + background: linear-gradient(to bottom, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%); + background: #e0dace; +} +.page-main-actions .page-actions.fixed .page-actions-inner { + position: relative; + padding-top: 15px; + padding-bottom: 15px; + min-height: 36px; + text-align: right; + box-sizing: border-box; +} +.page-main-actions .page-actions.fixed .page-actions-inner:before, +.page-main-actions .page-actions.fixed .page-actions-inner:after { + content: ""; + display: table; +} +.page-main-actions .page-actions.fixed .page-actions-inner:after { + clear: both; +} +.page-main-actions .page-actions.fixed .page-actions-inner:before, +.page-main-actions .page-actions.fixed .page-actions-inner:after { + content: ""; + display: table; +} +.page-main-actions .page-actions.fixed .page-actions-inner:after { + clear: both; +} +.page-main-actions .page-actions.fixed .page-actions-inner:before { + text-align: left; + content: attr(data-title); + float: left; + font-size: 20px; + max-width: 50%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.lt-ie10 .page-main-actions .page-actions.fixed .page-actions-inner { + background: #f5f2ed; +} +.page-main-actions .store-switcher { + margin-top: 5px; +} +.store-switcher { + display: inline-block; + font-size: 13px; +} +.store-switcher .label { + margin-right: 5px; +} +.store-switcher .actions.dropdown { + display: inline-block; + position: relative; +} +.store-switcher .actions.dropdown:before, +.store-switcher .actions.dropdown:after { + content: ""; + display: table; +} +.store-switcher .actions.dropdown:after { + clear: both; +} +.store-switcher .actions.dropdown:before, +.store-switcher .actions.dropdown:after { + content: ""; + display: table; +} +.store-switcher .actions.dropdown:after { + clear: both; +} +.store-switcher .actions.dropdown .action.toggle { + cursor: pointer; + display: inline-block; + text-decoration: none; +} +.store-switcher .actions.dropdown .action.toggle:after { + font-family: 'icons-blank-theme'; + content: '\e607'; + font-size: 22px; + line-height: 20px; + color: #645d53; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +.store-switcher .actions.dropdown .action.toggle:hover:after { + color: #645d53; +} +.store-switcher .actions.dropdown .action.toggle:active:after { + color: #645d53; +} +.store-switcher .actions.dropdown .action.toggle.active { + display: inline-block; + text-decoration: none; +} +.store-switcher .actions.dropdown .action.toggle.active:after { + font-family: 'icons-blank-theme'; + content: '\e618'; + font-size: 22px; + line-height: 20px; + color: #645d53; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +.store-switcher .actions.dropdown .action.toggle.active:hover:after { + color: #645d53; +} +.store-switcher .actions.dropdown .action.toggle.active:active:after { + color: #645d53; +} +.store-switcher .actions.dropdown .dropdown-menu { + margin: 0; + padding: 0; + list-style: none none; + box-sizing: border-box; + background: #ffffff; + border: 1px #ada89e solid; + position: absolute; + z-index: 100; + top: 100%; + min-width: 195px; + margin-top: 4px; + display: none; + box-shadow: 0 3px 3px rgba(0, 0, 0, 0.15); +} +.store-switcher .actions.dropdown .dropdown-menu li { + margin: 0; + padding: 0; +} +.store-switcher .actions.dropdown .dropdown-menu li:hover { + background: transparent; + cursor: pointer; +} +.store-switcher .actions.dropdown.active { + overflow: visible; +} +.store-switcher .actions.dropdown.active .dropdown-menu { + display: block; +} +.store-switcher .actions.dropdown .action.toggle { + background-image: none; + background: none; + 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; + color: #026294; + line-height: normal; + margin-top: 2px; + vertical-align: middle; +} +.store-switcher .actions.dropdown .action.toggle:focus, +.store-switcher .actions.dropdown .action.toggle:active { + background: none; + border: none; +} +.store-switcher .actions.dropdown .action.toggle:hover { + background: none; + border: none; +} +.store-switcher .actions.dropdown .action.toggle.disabled, +.store-switcher .actions.dropdown .action.toggle[disabled], +fieldset[disabled] .store-switcher .actions.dropdown .action.toggle { + cursor: not-allowed; + pointer-events: none; + opacity: 0.5; +} +.store-switcher .actions.dropdown ul.dropdown-menu { + margin-top: 4px; + padding-top: 5px; + left: 0; +} +.store-switcher .actions.dropdown ul.dropdown-menu li { + border: 0; + cursor: default; +} +.store-switcher .actions.dropdown ul.dropdown-menu li:hover { + cursor: default; +} +.store-switcher .actions.dropdown ul.dropdown-menu li a, +.store-switcher .actions.dropdown ul.dropdown-menu li span { + padding: 5px 13px; + display: block; + color: #645d53; +} +.store-switcher .actions.dropdown ul.dropdown-menu li a { + text-decoration: none; +} +.store-switcher .actions.dropdown ul.dropdown-menu li a:hover { + background: #edf9fb; +} +.store-switcher .actions.dropdown ul.dropdown-menu li span { + color: #ababab; + cursor: default; +} +.store-switcher .actions.dropdown ul.dropdown-menu li.current span { + color: #645d53; + background: #eee; +} +.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store a, +.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store span { + padding-left: 26px; +} +.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store-view a, +.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store-view span { + padding-left: 39px; +} +.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar { + border-top: 1px #ededed solid; + margin-top: 10px; +} +.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar a { + display: inline-block; + text-decoration: none; + display: block; +} +.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar a:before { + font-family: 'icons-blank-theme'; + content: '\e606'; + font-size: 20px; + line-height: normal; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: text-top; + text-align: center; + margin: 0 3px 0 -4px; +} +.tooltip { + display: inline-block; + margin-left: 5px; +} +.tooltip .help span, +.tooltip .help a { + width: 16px; + height: 16px; + text-align: center; + background: rgba(194, 186, 169, 0.5); + cursor: pointer; + border-radius: 10px; + vertical-align: middle; + display: inline-block; + text-decoration: none; +} +.tooltip .help span:hover, +.tooltip .help a:hover { + background: #c2baa9; +} +.tooltip .help span > span, +.tooltip .help a > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.tooltip .help span > span.focusable:active, +.tooltip .help a > span.focusable:active, +.tooltip .help span > span.focusable:focus, +.tooltip .help a > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.tooltip .help span > span.focusable:active, +.tooltip .help a > span.focusable:active, +.tooltip .help span > span.focusable:focus, +.tooltip .help a > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.tooltip .help span:before, +.tooltip .help a:before { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + content: '?'; + font-size: 13px; + line-height: 16px; + color: #5a534a; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; +} +.tooltip .help span:before, +.tooltip .help a:before { + font-weight: 700; +} +.tooltip .tooltip-content { + display: none; + position: absolute; + max-width: 200px; + margin-top: 10px; + margin-left: -19px; + padding: 4px 8px; + border-radius: 3px; + background: #000; + background: rgba(49, 48, 43, 0.8); + color: #fff; + text-shadow: none; + z-index: 20; +} +.tooltip .tooltip-content:before { + content: ''; + position: absolute; + width: 0; + height: 0; + top: -5px; + left: 20px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000; + opacity: .8; +} +.tooltip .tooltip-content.loading { + position: absolute; +} +.tooltip .tooltip-content.loading:before { + border-bottom-color: rgba(0, 0, 0, 0.3); +} +.tooltip:hover > .tooltip-content { + display: block; +} +button, +.action-add.mselect-button-add { + border-radius: 2px; + background-image: none; + background: #f2ebde; + padding: 6px 13px; + color: #645d53; + border: 1px solid #ada89e; + cursor: pointer; + display: inline-block; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 1.3rem; + font-weight: 500; + line-height: 1.4rem; + box-sizing: border-box; + margin: 0; + vertical-align: middle; +} +button:focus, +button:active, +.action-add.mselect-button-add:focus, +.action-add.mselect-button-add:active { + background: #cac3b4; + border: 1px solid #989287; +} +button:hover, +.action-add.mselect-button-add:hover { + background: #cac3b4; +} +button.disabled, +button[disabled], +fieldset[disabled] button, +.action-add.mselect-button-add.disabled, +.action-add.mselect-button-add[disabled], +fieldset[disabled] .action-add.mselect-button-add { + cursor: default; + pointer-events: none; + opacity: 0.5; +} +button.primary, +.action-add.mselect-button-add.primary { + background-image: none; + background: #007dbd; + padding: 6px 13px; + color: #ffffff; + border: 1px solid #0a6c9f; + cursor: pointer; + display: inline-block; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 1.3rem; + font-weight: 500; + box-sizing: border-box; + vertical-align: middle; +} +button.primary:focus, +button.primary:active, +.action-add.mselect-button-add.primary:focus, +.action-add.mselect-button-add.primary:active { + background: #026294; + border: 1px solid #004c74; + color: #ffffff; +} +button.primary:hover, +.action-add.mselect-button-add.primary:hover { + background: #026294; + border: 1px solid #026294; +} +button.primary.disabled, +button.primary[disabled], +fieldset[disabled] button.primary, +.action-add.mselect-button-add.primary.disabled, +.action-add.mselect-button-add.primary[disabled], +fieldset[disabled] .action-add.mselect-button-add.primary { + cursor: default; + pointer-events: none; + opacity: 0.5; +} +.actions-split { + display: inline-block; + position: relative; + vertical-align: middle; +} +.actions-split button, +.actions-split .action-add.mselect-button-add { + margin-left: 0!important; +} +.actions-split:before, +.actions-split:after { + content: ""; + display: table; +} +.actions-split:after { + clear: both; +} +.actions-split:before, +.actions-split:after { + content: ""; + display: table; +} +.actions-split:after { + clear: both; +} +.actions-split .action-default { + float: left; + margin: 0; +} +.actions-split .action-toggle { + float: right; + margin: 0; +} +.actions-split button.action-default, +.actions-split .action-add.mselect-button-add.action-default { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.actions-split button + .action-toggle, +.actions-split .action-add.mselect-button-add + .action-toggle { + border-left: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.actions-split .action-toggle { + padding: 6px 5px; + display: inline-block; + text-decoration: none; +} +.actions-split .action-toggle > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.actions-split .action-toggle > span.focusable:active, +.actions-split .action-toggle > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.actions-split .action-toggle > span.focusable:active, +.actions-split .action-toggle > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.actions-split .action-toggle:after { + font-family: 'icons-blank-theme'; + content: '\e607'; + font-size: 22px; + line-height: 14px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +.actions-split .action-toggle:hover:after { + color: inherit; +} +.actions-split .action-toggle:active:after { + color: inherit; +} +.actions-split .action-toggle.active { + display: inline-block; + text-decoration: none; +} +.actions-split .action-toggle.active > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.actions-split .action-toggle.active > span.focusable:active, +.actions-split .action-toggle.active > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.actions-split .action-toggle.active > span.focusable:active, +.actions-split .action-toggle.active > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.actions-split .action-toggle.active:after { + font-family: 'icons-blank-theme'; + content: '\e618'; + font-size: 22px; + line-height: 14px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +.actions-split .action-toggle.active:hover:after { + color: inherit; +} +.actions-split .action-toggle.active:active:after { + color: inherit; +} +.actions-split .dropdown-menu { + margin: 0; + padding: 0; + list-style: none none; + box-sizing: border-box; + background: #ffffff; + border: 1px solid #bbbbbb; + position: absolute; + z-index: 100; + top: 100%; + min-width: 175px; + margin-top: 4px; + display: none; + box-shadow: 0 3px 3px rgba(0, 0, 0, 0.15); +} +.actions-split .dropdown-menu li { + margin: 0; + padding: 3px 5px; +} +.actions-split .dropdown-menu li:hover { + background: #e8e8e8; + cursor: pointer; +} +.actions-split .dropdown-menu:before, +.actions-split .dropdown-menu:after { + content: ""; + position: absolute; + display: block; + width: 0; + height: 0; + border-bottom-style: solid; +} +.actions-split .dropdown-menu:before { + z-index: 99; + border: solid 6px; + border-color: transparent transparent #ffffff transparent; +} +.actions-split .dropdown-menu:after { + z-index: 98; + border: solid 7px; + border-color: transparent transparent #bbbbbb transparent; +} +.actions-split .dropdown-menu:before { + top: -12px; + right: 10px; +} +.actions-split .dropdown-menu:after { + top: -14px; + right: 9px; +} +.actions-split.active { + overflow: visible; +} +.actions-split.active .dropdown-menu { + display: block; +} +.actions-split .action-toggle:after { + height: 13px; +} +.page-content:after { + content: ""; + display: table; + clear: both; +} +.page-wrapper > .page-content { + margin-bottom: 20px; +} +.page-footer { + padding: 15px 0; +} +.page-footer-wrapper { + background-color: #e0dacf; + margin-top: auto; +} +.page-footer:after { + content: ""; + display: table; + clear: both; +} +.footer-legal { + float: right; + width: 550px; +} +.footer-legal .link-report, +.footer-legal .magento-version, +.footer-legal .copyright { + font-size: 13px; +} +.footer-legal:before { + content: ""; + display: inline-block; + vertical-align: middle; + position: absolute; + z-index: 1; + margin-top: 2px; + margin-left: -35px; + width: 30px; + height: 35px; + background-size: 109px 70px; + background: url("../images/logo.svg") no-repeat 0 -21px; +} +.icon-error { + margin-left: 15px; + color: #c00815; + font-size: 11px; +} +.icon-error:before { + font-family: 'MUI-Icons'; + content: "\e086"; + font-size: 13px; + line-height: 13px; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; + margin: -1px 5px 0 0; +} +.ui-widget-overlay { + position: fixed; +} +.control .nested { + padding: 0; +} +.control *:first-child { + margin-bottom: 0; +} +.field-tooltip { + display: inline-block; + vertical-align: top; + margin-top: 5px; + position: relative; + z-index: 1; + width: 0; + overflow: visible; +} +.field-choice .field-tooltip { + margin-top: 10px; +} +.field-tooltip:hover { + z-index: 99; +} +.field-tooltip-action { + position: relative; + z-index: 2; + margin-left: 18px; + width: 22px; + height: 22px; + display: inline-block; + cursor: pointer; +} +.field-tooltip-action:before { + content: "?"; + font-weight: 500; + font-size: 18px; + display: inline-block; + overflow: hidden; + height: 22px; + border-radius: 11px; + line-height: 22px; + width: 22px; + text-align: center; + color: #ffffff; + background-color: #514943; +} +.field-tooltip-action span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.field-tooltip-action span.focusable:active, +.field-tooltip-action span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.field-tooltip-action span.focusable:active, +.field-tooltip-action span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.control-text:focus + .field-tooltip-content, +.field-tooltip:hover .field-tooltip-content { + display: block; +} +.field-tooltip-content { + display: none; + position: absolute; + z-index: 1; + width: 320px; + background: #fff8d7; + padding: 15px 25px; + right: -66px; + border: 1px solid #adadad; + border-radius: 1px; + bottom: 42px; + box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.3); +} +.field-tooltip-content:after, +.field-tooltip-content:before { + content: ""; + display: block; + width: 0; + height: 0; + border: 16px solid transparent; + border-top-color: #adadad; + position: absolute; + right: 20px; + top: 100%; + z-index: 3; +} +.field-tooltip-content:after { + border-top-color: #fff8d7; + margin-top: -1px; + z-index: 4; +} +.form__field.field-error .control [class*="control-"] { + border-color: #e22626; +} +.form__field.field-error .control [class*="control-"]:before { + border-color: #e22626; +} +.form__field .mage-error { + border: 1px solid #e22626; + display: block; + margin: 2px 0 0; + padding: 6px 10px 10px; + background: #fff8d6; + color: #555555; + font-size: 12px; + font-weight: 500; + box-sizing: border-box; + max-width: 380px; +} +.no-flexbox.no-flexboxlegacy .form__field .control-addon + .mage-error { + display: inline-block; + width: 100%; +} +.form__field { + position: relative; + z-index: 1; +} +.form__field:hover { + z-index: 2; +} +.control .form__field { + position: static; +} +.form__field[data-config-scope]:before { + content: attr(data-config-scope); + display: inline-block; + position: absolute; + color: #808080; + right: 0; + top: 6px; +} +.control .form__field[data-config-scope]:nth-child(n+2):before { + content: ""; +} +.form__field.field-disabled > .label { + color: #999999; +} +.form__field.field-disabled.field .control [class*="control-"][disabled] { + background-color: #e9e9e9; + opacity: .5; + color: #303030; + border-color: #adadad; +} +.control-fields .label ~ .control { + width: 100%; +} +.form__field { + border: 0; + padding: 0; +} +.form__field .note { + color: #303030; + padding: 0; + margin: 10px 0 0; + max-width: 380px; +} +.form__field .note:before { + display: none; +} +.form__field.form__field { + margin-bottom: 0; +} +.form__field.form__field + .form__field.form__field { + margin-top: 15px; +} +.form__field.form__field:not(.choice) ~ .choice { + margin-left: 20px; + margin-top: 5px; +} +.form__field.form__field.choice ~ .choice { + margin-top: 9px; +} +.form__field.form__field ~ .choice:last-child { + margin-bottom: 8px; +} +.fieldset > .form__field { + margin-bottom: 30px; +} +.form__field .label { + color: #303030; +} +.form__field:not(.choice) > .label { + font-size: 14px; + font-weight: 600; + width: 30%; + padding-right: 30px; + padding-top: 0; + line-height: 33px; + white-space: nowrap; +} +.form__field:not(.choice) > .label:before { + content: "."; + visibility: hidden; + width: 0; + margin-left: -7px; + overflow: hidden; +} +.form__field:not(.choice) > .label span { + white-space: normal; + display: inline-block; + vertical-align: middle; + line-height: 1.2; +} +.form__field.required > .label:after { + content: ""; + margin-left: 0; +} +.form__field.required > .label span:after { + content: "*"; + color: #eb5202; + display: inline; + font-weight: 500; + font-size: 16px; + margin-top: 2px; + position: absolute; + z-index: 1; + margin-left: 10px; +} +.form__field .control-file { + margin-top: 6px; +} +.form__field .control-select { + line-height: 33px; +} +.form__field .control-select:not([multiple]), +.form__field .control-text { + height: 33px; + max-width: 380px; +} +.form__field .control-addon { + max-width: 380px; +} +.form__field .control-textarea, +.form__field .control-select, +.form__field .control-text { + border: 1px solid #adadad; + border-radius: 1px; + padding: 0 10px; + color: #303030; + background-color: #ffffff; + font-weight: 500; + font-size: 15px; + min-width: 11em; +} +.form__field .control-textarea:focus, +.form__field .control-select:focus, +.form__field .control-text:focus { + outline: 0; + border-color: #007bdb; + box-shadow: none; +} +.form__field .control-text { + line-height: auto; +} +.form__field .control-textarea { + padding-top: 6px; + padding-bottom: 6px; + line-height: 1.18em; +} +.form__field .control-select[multiple], +.form__field .control-textarea { + width: 100%; + height: calc(6 * 1.2em + 14px); +} +.form__field .control-value { + display: inline-block; + padding: 6px 10px; +} +.form__field .control-fields .form__field:nth-child(n+2):not(.choice) > .label { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.form__field .control-fields .form__field:nth-child(n+2):not(.choice) > .label.focusable:active, +.form__field .control-fields .form__field:nth-child(n+2):not(.choice) > .label.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.form__field .control-fields .form__field:nth-child(n+2):not(.choice) > .label.focusable:active, +.form__field .control-fields .form__field:nth-child(n+2):not(.choice) > .label.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.form__field .control-select { + padding: 0; +} +.form__field .control-select option { + box-sizing: border-box; + padding: 4px 10px; + display: block; +} +.form__field .control-select optgroup { + font-weight: 600; + display: block; + padding: 4px 10px; + line-height: 33px; + list-style: inside; + font-style: normal; +} +.form__field .control-range > .form__field:nth-child(2):before { + content: "\2014"; + content: ":"; + display: inline-block; + margin-left: -25px; + float: left; + width: 20px; + line-height: 33px; + text-align: center; +} +.form__field.choice { + position: relative; + z-index: 1; + padding-top: 8px; + padding-left: 26px; + padding-right: 0; +} +.form__field.choice .label { + font-weight: 500; + padding: 0; + display: inline; + float: none; + line-height: 18px; +} +.form__field.choice input { + position: absolute; + top: 8px; + margin-top: 3px!important; +} +.form__field.choice input[disabled] + .label { + opacity: .5; + cursor: not-allowed; +} +.control > .form__field.choice { + max-width: 380px; +} +.control > .form__field.choice:nth-child(1):nth-last-child(2), +.control > .form__field.choice:nth-child(2):nth-last-child(1) { + display: inline-block; +} +.control > .form__field.choice:nth-child(1):nth-last-child(2) + .choice, +.control > .form__field.choice:nth-child(2):nth-last-child(1) + .choice { + margin-left: 41px; + margin-top: 0; +} +.control > .form__field.choice:nth-child(1):nth-last-child(2) + .choice:before, +.control > .form__field.choice:nth-child(2):nth-last-child(1) + .choice:before { + content: ""; + position: absolute; + display: inline-block; + height: 20px; + top: 8px; + left: -20px; + width: 1px; + background: #cccccc; +} +.form__field.choice .label { + cursor: pointer; +} +.form__field.choice .label:before { + content: ""; + position: absolute; + z-index: 1; + border: 1px solid #adadad; + width: 14px; + height: 14px; + top: 10px; + left: 0; + border-radius: 2px; + background: url("../Magento_Ui/images/choice_bkg.png") no-repeat -100% -100%; +} +.form__field.choice input:focus + .label:before { + outline: 0; + border-color: #007bdb; +} +.form__field.choice .control-radio + .label:before { + border-radius: 8px; +} +.form__field.choice .control-radio:checked + .label:before { + background-position: -26px -1px; +} +.form__field.choice .control-checkbox:checked + .label:before { + background-position: -1px -1px; +} +.form__field.choice input { + opacity: 0; +} +.fieldset > .form__field.choice { + margin-left: 30%; +} +.form__field .control-after, +.form__field .control-before { + border: 0; + color: #858585; + font-weight: 300; + font-size: 15px; + line-height: 33px; + display: inline-block; + height: 33px; + box-sizing: border-box; + padding: 0 3px; +} +.no-flexbox.no-flexboxlegacy .form__field .control-before, +.no-flexbox.no-flexboxlegacy .form__field .control-addon { + float: left; + white-space: nowrap; +} +.form__field .control-addon { + display: inline-flex; + max-width: 380px; + width: 100%; + flex-flow: row nowrap; + position: relative; + z-index: 1; +} +.form__field .control-addon > * { + position: relative; + z-index: 1; +} +.form__field .control-addon .control-text[disabled][type], +.form__field .control-addon .control-select[disabled][type], +.form__field .control-addon .control-select, +.form__field .control-addon .control-text { + background: transparent!important; + border: 0; + width: auto; + vertical-align: top; + order: 1; + flex: 1; +} +.form__field .control-addon .control-text[disabled][type]:focus, +.form__field .control-addon .control-select[disabled][type]:focus, +.form__field .control-addon .control-select:focus, +.form__field .control-addon .control-text:focus { + box-shadow: none; +} +.form__field .control-addon .control-text[disabled][type]:focus + label:before, +.form__field .control-addon .control-select[disabled][type]:focus + label:before, +.form__field .control-addon .control-select:focus + label:before, +.form__field .control-addon .control-text:focus + label:before { + outline: 0; + border-color: #007bdb; +} +.form__field .control-addon .control-text[disabled][type] + label, +.form__field .control-addon .control-select[disabled][type] + label, +.form__field .control-addon .control-select + label, +.form__field .control-addon .control-text + label { + padding-left: 10px; + position: static!important; + z-index: 0; +} +.form__field .control-addon .control-text[disabled][type] + label > *, +.form__field .control-addon .control-select[disabled][type] + label > *, +.form__field .control-addon .control-select + label > *, +.form__field .control-addon .control-text + label > * { + vertical-align: top; + position: relative; + z-index: 2; +} +.form__field .control-addon .control-text[disabled][type] + label:before, +.form__field .control-addon .control-select[disabled][type] + label:before, +.form__field .control-addon .control-select + label:before, +.form__field .control-addon .control-text + label:before { + box-sizing: border-box; + border-radius: 1px; + border: 1px solid #adadad; + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 0; + background: #fff; +} +.form__field .control-addon .control-text[disabled][type][disabled] + label:before, +.form__field .control-addon .control-select[disabled][type][disabled] + label:before, +.form__field .control-addon .control-select[disabled] + label:before, +.form__field .control-addon .control-text[disabled] + label:before { + opacity: .5; + background: #e9e9e9; +} +.form__field .control-after { + order: 3; +} +.form__field .control-after:last-child { + padding-right: 10px; +} +.form__field .control-before { + order: 0; +} +.form__field .control-some { + display: flex; +} +.form__field [class*="control-grouped"] { + display: table; + width: 100%; + table-layout: fixed; + box-sizing: border-box; +} +.form__field [class*="control-grouped"] > .form__field { + display: table-cell; + width: 50%; + vertical-align: top; +} +.form__field [class*="control-grouped"] > .form__field > .control { + width: 100%; + float: none; +} +.form__field [class*="control-grouped"] > .form__field:nth-child(n+2) { + padding-left: 20px; +} +.form__field [class*="control-grouped"] > .form__field:nth-child(n+2):not(.choice) .label { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.form__field [class*="control-grouped"] > .form__field:nth-child(n+2):not(.choice) .label.focusable:active, +.form__field [class*="control-grouped"] > .form__field:nth-child(n+2):not(.choice) .label.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.form__field [class*="control-grouped"] > .form__field:nth-child(n+2):not(.choice) .label.focusable:active, +.form__field [class*="control-grouped"] > .form__field:nth-child(n+2):not(.choice) .label.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.form__field [required] { + box-shadow: none; +} +fieldset.form__field { + position: relative; +} +fieldset.form__field [class*="control-grouped"] > .form__field:first-child > .label, +fieldset.form__field .control-fields > .form__field:first-child > .label { + position: absolute; + left: 0; + top: 0; + opacity: 0; + cursor: pointer; + width: 30%; +} +.control-text + .ui-datepicker-trigger { + background-image: none; + background: none; + border: 0; + margin: 0; + padding: 0; + -moz-box-sizing: content-box; + box-shadow: none; + text-shadow: none; + line-height: inherit; + font-weight: 400; + text-decoration: none; + margin-left: -40px; + display: inline-block; +} +.control-text + .ui-datepicker-trigger img { + display: none; +} +.control-text + .ui-datepicker-trigger:focus, +.control-text + .ui-datepicker-trigger:active { + background: none; + border: none; +} +.control-text + .ui-datepicker-trigger:hover { + background: none; + border: none; +} +.control-text + .ui-datepicker-trigger.disabled, +.control-text + .ui-datepicker-trigger[disabled], +fieldset[disabled] .control-text + .ui-datepicker-trigger { + cursor: not-allowed; + pointer-events: none; + opacity: 0.5; +} +.control-text + .ui-datepicker-trigger > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.control-text + .ui-datepicker-trigger > span.focusable:active, +.control-text + .ui-datepicker-trigger > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.control-text + .ui-datepicker-trigger > span.focusable:active, +.control-text + .ui-datepicker-trigger > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.control-text + .ui-datepicker-trigger:after { + font-family: 'icons-blank-theme'; + content: '\e612'; + font-size: 38px; + line-height: 33px; + color: #514943; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +[class*="tab-nav-item"]:not(ul):active, +[class*="tab-nav-item"]:not(ul):focus { + box-shadow: none; + outline: none; +} +.customer-index-edit .col-2-left-layout, +.customer-index-edit .col-1-layout { + background: #fff; +} +.customer-index-edit { + background: #fff; +} +.customer-index-edit .col-2-left-layout { + background: #fff; +} +.customer-index-edit .main-col { + padding-left: 40px; +} +.customer-index-edit .page-main-actions { + background: transparent; +} +.tab-nav.block { + margin-bottom: 40px; +} +.tab-nav.block:first-child { + margin-top: 16px; +} +.tab-nav.block .block-title { + padding: 7px 20px; +} +.tab-nav-items { + padding: 0; + border: 1px solid #d3d3d3; + box-shadow: 0 0 4px rgba(50, 50, 50, 0.35); + margin: 0 0 40px; + background: #f7f7f7; +} +.tab-nav-item { + padding: 0; + list-style-type: none; + border-bottom: 1px solid #e0e0e0; + position: relative; + margin: 0 15px; + z-index: 1; +} +.tab-nav-item:last-child { + border-bottom: 0; +} +.tab-nav-item.ui-state-active { + z-index: 2; + background: #FFF; + padding: 1px 14px; + border: 2px solid #eb5202; + margin: -1px; +} +.tab-nav-item.ui-state-active .tab-nav-item-link { + padding: 13px 15px 13px; + color: #eb5202; +} +.tab-nav-item.ui-tabs-loading { + position: relative; + z-index: 1; +} +.tab-nav-item.ui-tabs-loading:before { + content: ""; + display: block; + position: absolute; + z-index: 2; + background: url("../images/loader-2.gif") no-repeat 50% 50%; + background-size: 120px; + width: 20px; + height: 20px; + top: 13px; + left: -10px; +} +.tab-nav-item.ui-tabs-loading.ui-state-active:before { + top: 12px; + left: 4px; +} +.tab-nav-item-link { + display: block; + padding: 15px; + color: #666666; + line-height: 1; +} +.tab-nav-item-link:focus, +.tab-nav-item-link:active, +.tab-nav-item-link:hover { + outline: 0; + color: #eb5202; + text-decoration: none; +} +.ui-state-active .tab-nav-item-link { + color: #666666; + font-weight: 600; +} +.tab-nav-item-link.changed { + font-style: italic; +} +.listing-tiles { + overflow: hidden; + margin-top: -10px; + margin-left: -10px; +} +.listing-tiles .listing-tile { + background-color: #f2ebde; + display: block; + width: 238px; + height: 200px; + float: left; + border: 1px solid #676056; + margin-top: 10px; + margin-left: 10px; + border-radius: 4px; + text-align: center; +} +.listing-tiles .listing-tile.disabled { + border-color: red; +} +.listing-tiles .listing-tile.enabled { + border-color: green; +} +.listing .disabled { + color: red; +} +.listing .enabled { + color: green; +} +.pager { + text-align: left; + padding-bottom: 10px; +} +.pager:before, +.pager:after { + content: ""; + display: table; +} +.pager:after { + clear: both; +} +.pager:before, +.pager:after { + content: ""; + display: table; +} +.pager:after { + clear: both; +} +.pager [data-part=left] { + display: inline-block; + width: 45%; + float: left; + text-align: left; +} +.pager [data-part=right] { + display: inline-block; + width: 45%; + text-align: right; + float: right; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.pager .action-next { + cursor: pointer; +} +.pager .action-previous { + cursor: pointer; +} +.pager { + text-align: left; +} +.pager [data-part=left] { + display: inline-block; + width: 45%; + text-align: left; +} +.pager [data-part=right] { + display: inline-block; + width: 45%; + text-align: right; + float: right; +} +.grid .col-title { + min-width: 90px; + text-align: center; +} +.grid-actions [data-part=search] { + display: inline-block; + margin: 0 30px; +} +.grid-actions [data-part=search] input[type=text] { + vertical-align: bottom; + width: 460px; +} +.grid .actions-split .dropdown-menu { + right: auto; + left: auto; + text-align: left; + color: #676056; + font-weight: normal; +} +.grid .actions-split .dropdown-menu:after { + right: auto; + left: 9px; +} +.grid .actions-split .dropdown-menu:before { + right: auto; + left: 10px; +} +.grid .grid-actions { + padding: 10px 0; +} +.grid .hor-scroll { + padding-top: 10px; +} +.grid .select-box { + display: inline-block; + vertical-align: top; + margin: -12px -10px -7px; + padding: 12px 10px 7px; + width: 100%; +} +.filters-toggle { + background: #f2ebde; + padding: 6px 13px; + color: #645d53; + border: 1px solid #ada89e; + cursor: pointer; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 1.3rem; + font-weight: 500; + line-height: 1.4rem; + box-sizing: border-box; + margin: 3px; + vertical-align: middle; + display: inline-block; + background-image: none; + background: none; + 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; +} +.filters-toggle:after { + font-family: 'icons-blank-theme'; + content: '\e607'; + font-size: 30px; + line-height: 15px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +.filters-toggle:hover:after { + color: inherit; +} +.filters-toggle:active:after { + color: inherit; +} +.filters-toggle:focus, +.filters-toggle:active { + background: #cac3b4; + border: 1px solid #989287; +} +.filters-toggle:hover { + background: #cac3b4; +} +.filters-toggle.disabled, +.filters-toggle[disabled], +fieldset[disabled] .filters-toggle { + cursor: default; + pointer-events: none; + opacity: 0.5; +} +.filters-toggle:focus, +.filters-toggle:active { + background: none; + border: none; +} +.filters-toggle:hover { + background: none; + border: none; +} +.filters-toggle.disabled, +.filters-toggle[disabled], +fieldset[disabled] .filters-toggle { + cursor: not-allowed; + pointer-events: none; + opacity: 0.5; +} +.filters-toggle:after { + margin-top: 2px; + margin-left: -3px; +} +.filters-toggle.active:after { + content: '\e618'; +} +.filters-current { + padding: 10px 0; + display: none; +} +.filters-current.active { + display: block; +} +.filters-items { + margin: 0; + padding: 0; + list-style: none none; + display: inline; +} +.filters-item { + display: inline-block; + margin: 0 5px 5px 0; + padding: 2px 2px 2px 4px; + border-radius: 3px; + background: #f7f3eb; +} +.filters-item .item-label { + font-weight: 600; +} +.filters-item .item-label:after { + content: ": "; +} +.filters-item .action-remove { + background-image: none; + background: #f2ebde; + padding: 6px 13px; + color: #645d53; + border: 1px solid #ada89e; + cursor: pointer; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 1.3rem; + font-weight: 500; + line-height: 1.4rem; + box-sizing: border-box; + margin: 3px; + vertical-align: middle; + display: inline-block; + text-decoration: none; + padding: 0; +} +.filters-item .action-remove > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.filters-item .action-remove > span.focusable:active, +.filters-item .action-remove > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.filters-item .action-remove > span.focusable:active, +.filters-item .action-remove > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.filters-item .action-remove:before { + font-family: 'icons-blank-theme'; + content: '\e616'; + font-size: 16px; + line-height: 16px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +.filters-item .action-remove:hover:before { + color: inherit; +} +.filters-item .action-remove:active:before { + color: inherit; +} +.filters-item .action-remove:focus, +.filters-item .action-remove:active { + background: #cac3b4; + border: 1px solid #989287; +} +.filters-item .action-remove:hover { + background: #cac3b4; +} +.filters-item .action-remove.disabled, +.filters-item .action-remove[disabled], +fieldset[disabled] .filters-item .action-remove { + cursor: default; + pointer-events: none; + opacity: 0.5; +} +.filters-form { + position: relative; + z-index: 1; + margin: 14px 0; + background: #fff; + border: 1px solid #bbb; + box-shadow: 0 3px 3px rgba(0, 0, 0, 0.15); +} +.filters-form .action-close { + position: absolute; + top: 3px; + right: 7px; + background: #f2ebde; + padding: 6px 13px; + color: #645d53; + border: 1px solid #ada89e; + cursor: pointer; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 1.3rem; + font-weight: 500; + line-height: 1.4rem; + box-sizing: border-box; + margin: 3px; + vertical-align: middle; + display: inline-block; + background-image: none; + background: none; + 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; +} +.filters-form .action-close > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.filters-form .action-close > span.focusable:active, +.filters-form .action-close > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.filters-form .action-close > span.focusable:active, +.filters-form .action-close > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.filters-form .action-close:before { + font-family: 'icons-blank-theme'; + content: '\e616'; + font-size: 42px; + line-height: 42px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +.filters-form .action-close:hover:before { + color: inherit; +} +.filters-form .action-close:active:before { + color: inherit; +} +.filters-form .action-close:focus, +.filters-form .action-close:active { + background: #cac3b4; + border: 1px solid #989287; +} +.filters-form .action-close:hover { + background: #cac3b4; +} +.filters-form .action-close.disabled, +.filters-form .action-close[disabled], +fieldset[disabled] .filters-form .action-close { + cursor: default; + pointer-events: none; + opacity: 0.5; +} +.filters-form .action-close:focus, +.filters-form .action-close:active { + background: none; + border: none; +} +.filters-form .action-close:hover { + background: none; + border: none; +} +.filters-form .action-close.disabled, +.filters-form .action-close[disabled], +fieldset[disabled] .filters-form .action-close { + cursor: not-allowed; + pointer-events: none; + opacity: 0.5; +} +.filters-actions { + margin: 18px; + text-align: right; +} +.filters-fieldset { + padding-bottom: 0; +} +.filters-fieldset .field { + border: 0; + margin: 0 0 20px; + box-sizing: border-box; + display: inline-block; + padding: 0 12px 0 0; + width: 33.33333333%; + vertical-align: top; +} +.filters-fieldset .field:before, +.filters-fieldset .field:after { + content: ""; + display: table; +} +.filters-fieldset .field:after { + clear: both; +} +.filters-fieldset .field:before, +.filters-fieldset .field:after { + content: ""; + display: table; +} +.filters-fieldset .field:after { + clear: both; +} +.filters-fieldset .field.choice:before, +.filters-fieldset .field.no-label:before { + box-sizing: border-box; + content: " "; + height: 1px; + float: left; + padding: 6px 15px 0 0; + width: 35%; +} +.filters-fieldset .field .description { + box-sizing: border-box; + float: left; + padding: 6px 15px 0 0; + text-align: right; + width: 35%; +} +.filters-fieldset .field:not(.choice) > .label { + box-sizing: border-box; + float: left; + padding: 6px 15px 0 0; + text-align: right; + width: 35%; +} +.filters-fieldset .field:not(.choice) > .control { + float: left; + width: 65%; +} +.filters-fieldset .field:last-child { + margin-bottom: 0; +} +.filters-fieldset .field + .fieldset { + clear: both; +} +.filters-fieldset .field > .label { + font-weight: 700; +} +.filters-fieldset .field > .label + br { + display: none; +} +.filters-fieldset .field .choice input { + vertical-align: top; +} +.filters-fieldset .field .fields.group:before, +.filters-fieldset .field .fields.group:after { + content: ""; + display: table; +} +.filters-fieldset .field .fields.group:after { + clear: both; +} +.filters-fieldset .field .fields.group:before, +.filters-fieldset .field .fields.group:after { + content: ""; + display: table; +} +.filters-fieldset .field .fields.group:after { + clear: both; +} +.filters-fieldset .field .fields.group .field { + box-sizing: border-box; + float: left; +} +.filters-fieldset .field .fields.group.group-2 .field { + width: 50% !important; +} +.filters-fieldset .field .fields.group.group-3 .field { + width: 33.3% !important; +} +.filters-fieldset .field .fields.group.group-4 .field { + width: 25% !important; +} +.filters-fieldset .field .fields.group.group-5 .field { + width: 20% !important; +} +.filters-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%; +} +.filters-fieldset .field .addon textarea, +.filters-fieldset .field .addon select, +.filters-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; +} +.filters-fieldset .field .addon .addbefore, +.filters-fieldset .field .addon .addafter { + -ms-flex-order: 3; + -webkit-order: 3; + order: 3; + display: inline-block; + box-sizing: border-box; + background: #ffffff; + border: 1px solid #c2c2c2; + border-radius: 1px; + height: 32px; + width: 100%; + padding: 0 9px; + font-size: 14px; + font-family: 'Open Sans', '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; +} +.filters-fieldset .field .addon .addbefore:disabled, +.filters-fieldset .field .addon .addafter:disabled { + opacity: 0.5; +} +.filters-fieldset .field .addon .addbefore::-moz-placeholder, +.filters-fieldset .field .addon .addafter::-moz-placeholder { + color: #c2c2c2; +} +.filters-fieldset .field .addon .addbefore::-webkit-input-placeholder, +.filters-fieldset .field .addon .addafter::-webkit-input-placeholder { + color: #c2c2c2; +} +.filters-fieldset .field .addon .addbefore:-ms-input-placeholder, +.filters-fieldset .field .addon .addafter:-ms-input-placeholder { + color: #c2c2c2; +} +.filters-fieldset .field .addon .addbefore { + float: left; + -ms-flex-order: 1; + -webkit-order: 1; + order: 1; +} +.filters-fieldset .field .additional { + margin-top: 10px; +} +.filters-fieldset .field.required > .label:after { + content: '*'; + font-size: 1.2rem; + color: #e02b27; + margin: 0 0 0 5px; +} +.filters-fieldset .field .note { + font-size: 1.2rem; + margin: 3px 0 0; + padding: 0; + display: inline-block; + text-decoration: none; +} +.filters-fieldset .field .note:before { + font-family: 'icons-blank-theme'; + content: '\e618'; + font-size: 24px; + line-height: 12px; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.filters-fieldset .field .label { + color: #676056; + font-size: 13px; + font-weight: 600; + margin: 0; +} +.filters .field-date .group .hasDatepicker { + width: 100%; + padding-right: 30px; +} +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger { + background-image: none; + background: none; + border: 0; + margin: 0; + padding: 0; + -moz-box-sizing: content-box; + box-shadow: none; + text-shadow: none; + line-height: inherit; + font-weight: 400; + text-decoration: none; + margin-left: -33px; + display: inline-block; + width: 30px; +} +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger img { + display: none; +} +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger:focus, +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger:active { + background: none; + border: none; +} +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger:hover { + background: none; + border: none; +} +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger.disabled, +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger[disabled], +fieldset[disabled] .filters .field-date .group .hasDatepicker + .ui-datepicker-trigger { + cursor: not-allowed; + pointer-events: none; + opacity: 0.5; +} +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger > span.focusable:active, +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger > span.focusable:active, +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.filters .field-date .group .hasDatepicker + .ui-datepicker-trigger:after { + font-family: 'icons-blank-theme'; + content: '\e612'; + font-size: 35px; + line-height: 30px; + color: #514943; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: middle; + text-align: center; +} +.filters .field-range .group .field { + margin-bottom: 0; +} +.filters .field-range .group .control { + width: 100%; + box-sizing: border-box; + padding-right: 0; + position: relative; + z-index: 1; +} +/* [data-part=filter-form] { + width: 650px; + left: 150px; + + background: #fff; + border: 1px solid #bbb; + position: absolute; + z-index: 100; + box-shadow: 0 3px 3px rgba(0, 0, 0, .15); + margin-top: 4px; + + .title { + position: relative; + padding: 5px 18px; + + .close { + position: absolute; + font-size: .8em; + right: 10px; + top: 12px; + cursor: pointer; + + &:hover, + &:active { + text-decoration: underline; + } + } + } + + > .actions { + padding: 5px 18px 36px; + } +} */ +.mass-select { + position: relative; + margin: -6px -10px; + padding: 6px 2px 6px 10px; + z-index: 1; + white-space: nowrap; +} +.mass-select.active { + background: rgba(0, 0, 0, 0.2); +} +.mass-select-toggle { + background: #f2ebde; + padding: 6px 13px; + color: #645d53; + border: 1px solid #ada89e; + cursor: pointer; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 1.3rem; + font-weight: 500; + line-height: 1.4rem; + box-sizing: border-box; + margin: 3px; + vertical-align: middle; + display: inline-block; + background-image: none; + background: none; + 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; +} +.mass-select-toggle > span { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.mass-select-toggle > span.focusable:active, +.mass-select-toggle > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.mass-select-toggle > span.focusable:active, +.mass-select-toggle > span.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +.mass-select-toggle:before { + font-family: 'icons-blank-theme'; + content: '\e607'; + font-size: 30px; + line-height: 15px; + color: inherit; + overflow: hidden; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0; +} +.mass-select-toggle:hover:before { + color: inherit; +} +.mass-select-toggle:active:before { + color: inherit; +} +.mass-select-toggle:focus, +.mass-select-toggle:active { + background: #cac3b4; + border: 1px solid #989287; +} +.mass-select-toggle:hover { + background: #cac3b4; +} +.mass-select-toggle.disabled, +.mass-select-toggle[disabled], +fieldset[disabled] .mass-select-toggle { + cursor: default; + pointer-events: none; + opacity: 0.5; +} +.mass-select-toggle:focus, +.mass-select-toggle:active { + background: none; + border: none; +} +.mass-select-toggle:hover { + background: none; + border: none; +} +.mass-select-toggle.disabled, +.mass-select-toggle[disabled], +fieldset[disabled] .mass-select-toggle { + cursor: not-allowed; + pointer-events: none; + opacity: 0.5; +} +.mass-select-toggle:before { + margin-top: -2px; + text-indent: -5px; + color: #fff; +} +.mass-select-toggle:hover:before { + color: #fff; +} +.mass-select-toggle:active:before, +.mass-select-toggle.active:before { + content: '\e618'; +} +.mass-select-field { + display: inline; +} +.mass-select-menu { + display: none; + position: absolute; + top: 100%; + left: 0; + text-align: left; + margin: 0; + padding: 0; + list-style: none none; + background: #fff; + border: 1px solid #bbb; + min-width: 175px; + box-shadow: 0 3px 3px rgba(0, 0, 0, 0.15); +} +.mass-select-menu li { + margin: 0; + padding: 4px 15px; + border-bottom: 1px solid #E5E5E5; +} +.mass-select-menu li:hover { + background: #e8e8e8; + cursor: pointer; +} +.mass-select-menu span { + font-weight: normal; + font-size: 13px; + color: #645D53; +} +.mass-select-menu.active { + display: block; +} +.grid-loading-mask { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.5); + z-index: 100; +} +.grid-loading-mask .grid-loader { + position: absolute; + margin: auto; + left: 0; + top: 0; + right: 0; + bottom: 0; + width: 218px; + height: 149px; + background: url('../images/loader-2.gif') 50% 50% no-repeat; +} +/* Price field */ +.addon input { + border-width: 1px 0 1px 1px; +} +.addon input ~ .addafter strong { + display: inline-block; + background: #fff; + line-height: 24px; + margin: 0 3px 0 -2px; + padding-left: 4px; + padding-right: 4px; + position: relative; + font-size: 12px; + top: 0; +} +.addon input:focus ~ .addafter { + border-color: #75b9f0; + box-shadow: 0 0 8px rgba(82, 168, 236, 0.6); +} +.addon input:focus ~ .addafter strong { + margin-top: 0; +} +.addon .addafter { + background: none; + color: #a6a6a6; + border-width: 1px 1px 1px 0; + border-radius: 2px 2px 0 0; + padding: 0; + border-color: #ada89e; +} +.addon .pager input { + border-width: 1px; +} +.field .control input[type='text'][disabled], +.field .control input[type='text'][disabled] ~ .addafter, +.field .control select[disabled], +.field .control select[disabled] ~ .addafter { + background-color: #fff; + border-color: #eee; + box-shadow: none; + color: #999; +} +.field .control input[type='text'][disabled] ~ .addafter strong, +.field .control select[disabled] ~ .addafter strong { + background-color: #fff; +} +.field-price.addon { + direction: rtl; +} +.field-price.addon > * { + direction: ltr; +} +.field-price.addon .addafter { + border-width: 1px 0 1px 1px; + border-radius: 2px 0 0 2px; +} +.field-price.addon input:first-child { + border-radius: 0 2px 2px 0; +} +.field-price input { + border-width: 1px 1px 1px 0; +} +.field-price input:focus { + box-shadow: 0 0 8px rgba(82, 168, 236, 0.6); +} +.field-price input:focus ~ label.addafter { + box-shadow: 0 0 8px rgba(82, 168, 236, 0.6); +} +.field-price input ~ label.addafter strong { + margin-left: 2px; + margin-right: -2px; +} +.field-price.addon > input { + width: 99px; + float: left; +} +.field-price .control { + position: relative; +} +.field-price label.mage-error { + position: absolute; + left: 0; + top: 30px; +} +.version-fieldset .grid-actions { + border-bottom: 1px solid #f2ebde; + margin: 0 0 15px; + padding: 0 0 15px; +} +.navigation > ul, +.message-system, +.page-header, +.page-actions.fixed .page-actions-inner, +.page-content, +.page-footer { + width: auto; + min-width: 960px; + max-width: 1300px; + margin: 0 auto; + padding-left: 15px; + padding-right: 15px; + box-sizing: border-box; + width: 100%; +} +.pager label.page, +.filters .field-range .group .label, +.mass-select-field .label { + clip: rect(0, 0, 0, 0); + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.visually-hidden.focusable:active, +.visually-hidden.focusable:focus, +.pager label.page.focusable:active, +.pager label.page.focusable:focus, +.filters .field-range .group .label.focusable:active, +.filters .field-range .group .label.focusable:focus, +.mass-select-field .label.focusable:active, +.mass-select-field .label.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} +table th.required:after, +.data-table th.required-entry:after, +.data-table td.required-entry:after, +.grid-actions .filter.required .label span:after, +.grid-actions .required:after, +.accordion .config .data-table td.required-entry:after { + content: '*'; + color: #e22626; + font-weight: normal; + margin-left: 3px; +} +.grid th.required:after, +.grid th .required:after { + content: '*'; + color: #f9d4d4; + font-weight: normal; + margin-left: 3px; +} +.grid td.col-period, +.grid td.col-date, +.grid td.col-date_to, +.grid td.col-date_from, +.grid td.col-ended_at, +.grid td.col-created_at, +.grid td.col-updated_at, +.grid td.col-customer_since, +.grid td.col-session_start_time, +.grid td.col-last_activity, +.grid td.col-email, +.grid td.col-name, +.grid td.col-sku, +.grid td.col-firstname, +.grid td.col-lastname, +.grid td.col-title, +.grid td.col-label, +.grid td.col-product, +.grid td.col-set_name, +.grid td.col-websites, +.grid td.col-time, +.grid td.col-billing_name, +.grid td.col-shipping_name, +.grid td.col-phone, +.grid td.col-type, +.product-options .grouped-items-table .col-name, +.product-options .grouped-items-table .col-sku, +.sales-order-create-index .data-table .col-product, +[class^=' adminhtml-rma-'] .fieldset-wrapper .data-table td, +[class^=' adminhtml-rma-'] .grid .col-product_sku, +[class^=' adminhtml-rma-'] .grid .col-product_name, +.col-grid_segment_name, +.adminhtml-catalog-event-index .col-category, +[class^=' catalog-search'] .col-search_query, +[class^=' catalog-search'] .col-synonym_for, +[class^=' catalog-search'] .col-redirect, +.adminhtml-urlrewrite-index .col-request_path, +.adminhtml-cms-page-index .col-title, +.adminhtml-cms-page-index .col-identifier, +.adminhtml-cms-hierarchy-index .col-title, +.adminhtml-cms-hierarchy-index .col-identifier, +.col-banner_name, +.adminhtml-widget-instance-index .col-title, +.reports-index-search .col-query_text, +.adminhtml-rma-item-attribute-index .grid .col-attr-code, +.adminhtml-system-store-index .grid td, +.catalog-product-attribute-index .col-attr-code, +.catalog-product-attribute-index .col-label, +.adminhtml-export-index .col-code, +.adminhtml-logging-index .grid .col-fullaction, +.adminhtml-system-variable-index .grid .col-code, +.adminhtml-logging-index .grid .col-info, +.dashboard-secondary .dashboard-item tr > td:first-child, +.ui-tabs-panel .dashboard-data .col-name, +.data-table-td-max .data-table td, +[class^=' adminhtml-rma-'] .fieldset-wrapper .accordion .config .data-table td, +.data-table-td-max .accordion .config .data-table td, +.order-account-information .data-table td, +[class^=' adminhtml-rma-'] .rma-request-details .data-table td { + overflow: hidden; + text-overflow: ellipsis; +} +td.col-period, +td.col-date, +td.col-date_to, +td.col-date_from, +td.col-ended_at, +td.col-created_at, +td.col-updated_at, +td.col-customer_since, +td.col-session_start_time, +td.col-time, +td.col-sku, +td.col-type, +[class^=' adminhtml-rma-'] #rma_items_grid_table .headings th, +.adminhtml-process-list .col-action a, +.adminhtml-process-list .col-mode { + white-space: nowrap; +} +table thead tr th:first-child, +table tfoot tr th:first-child, +table tfoot tr td:first-child { + border-left: 0; +} +table thead tr th:last-child, +table tfoot tr th:last-child, +table tfoot tr td:last-child { + border-right: 0; +} +.form-inline .grid-actions .label, +.form-inline .massaction .label { + padding: 0; + width: auto; +} +.grid .col-action, +.grid .col-actions, +.grid .col-qty, +.grid .col-purchases, +.catalog-product-edit .ui-tabs-panel .grid .col-price, +.catalog-product-edit .ui-tabs-panel .grid .col-position { + width: 50px; +} +.grid .col-order-number, +.grid .col-real_order_id, +.grid .col-invoice-number, +.grid .col-increment_id, +.grid .col-transaction-id, +.grid .col-parent-transaction-id, +.grid .col-reference_id, +.grid .col-status, +.grid .col-price, +.grid .col-position, +.grid .col-base_grand_total, +.grid .col-grand_total, +.grid .col-sort_order, +.grid .col-carts, +.grid .col-priority, +.grid .col-severity, +.sales-order-create-index .col-in_products, +[class^=' reports-'] [class^='col-total'], +[class^=' reports-'] [class^='col-average'], +[class^=' reports-'] [class^='col-ref-'], +[class^=' reports-'] [class^='col-rate'], +[class^=' reports-'] [class^='col-tax-amount'], +[class^=' adminhtml-customer-'] .col-required, +.adminhtml-rma-item-attribute-index .col-required, +[class^=' adminhtml-customer-'] .col-system, +.adminhtml-rma-item-attribute-index .col-system, +[class^=' adminhtml-customer-'] .col-is_visible, +.adminhtml-rma-item-attribute-index .col-is_visible, +[class^=' adminhtml-customer-'] .col-sort_order, +.adminhtml-rma-item-attribute-index .col-sort_order, +.catalog-product-attribute-index [class^=' col-is_'], +.catalog-product-attribute-index .col-required, +.catalog-product-attribute-index .col-system, +.adminhtml-test-index .col-is_listed, +[class^=' tests-report-test'] [class^='col-inv-'] { + width: 70px; +} +.grid .col-phone, +.sales-order-view .grid .col-period, +.sales-order-create-index .col-phone, +[class^=' adminhtml-rma-'] .grid .col-product_sku, +.adminhtml-rma-edit .col-product, +.adminhtml-rma-edit .col-sku, +.catalog-product-edit .ui-tabs-panel .grid .col-name, +.catalog-product-edit .ui-tabs-panel .grid .col-type, +.catalog-product-edit .ui-tabs-panel .grid .col-sku, +.customer-index-index .grid .col-customer_since, +.customer-index-index .grid .col-billing_country_id, +[class^=' customer-index-'] .fieldset-wrapper .grid .col-created_at, +[class^=' customer-index-'] .accordion .grid .col-created_at { + max-width: 70px; + width: 70px; +} +.sales-order-view .grid .col-name, +.sales-order-create-index .data-table .col-product, +[class^=' adminhtml-rma-'] .grid .col-name, +[class^=' adminhtml-rma-'] .grid .col-product, +[class^=' catalog-search'] .col-search_query, +[class^=' catalog-search'] .col-synonym_for, +[class^=' catalog-search'] .col-redirect, +.adminhtml-urlrewrite-index .col-request_path, +.reports-report-shopcart-abandoned .grid .col-name, +.tax-rule-index .grid .col-title, +.adminhtml-rma-item-attribute-index .grid .col-attr-code, +.dashboard-secondary .dashboard-item tr > td:first-child { + max-width: 150px; + width: 150px; +} +[class^=' sales-order-'] .grid .col-name, +.catalog-category-edit .grid .col-name, +.adminhtml-catalog-event-index .col-category, +.adminhtml-banner-edit .grid .col-name, +.reports-report-product-lowstock .grid .col-sku, +.newsletter-problem-index .grid .col-name, +.newsletter-problem-index .grid .col-subject, +.newsletter-problem-index .grid .col-product, +.adminhtml-rma-item-attribute-index .grid .col-label, +.adminhtml-export-index .col-label, +.adminhtml-export-index .col-code, +.adminhtml-scheduled-operation-index .grid .col-name, +.adminhtml-logging-index .grid .col-fullaction, +.test-report-customer-wishlist-wishlist .grid .col-name, +.test-report-customer-wishlist-wishlist .grid .col-subject, +.test-report-customer-wishlist-wishlist .grid .col-product { + max-width: 220px; + width: 220px; +} +.grid .col-period, +.grid .col-date, +.grid .col-date_to, +.grid .col-date_from, +.grid .col-ended_at, +.grid .col-created_at, +.grid .col-updated_at, +.grid .col-customer_since, +.grid .col-session_start_time, +.grid .col-last_activity, +.grid .col-email, +.grid .col-items_total, +.grid .col-firstname, +.grid .col-lastname, +.grid .col-status-default, +.grid .col-websites, +.grid .col-time, +.grid .col-billing_name, +.grid .col-shipping_name, +.sales-order-index .grid .col-name, +.product-options .grouped-items-table .col-name, +.product-options .grouped-items-table .col-sku, +[class^=' sales-order-view'] .grid .col-customer_name, +[class^=' adminhtml-rma-'] .grid .col-product_name, +.catalog-product-index .grid .col-name, +.catalog-product-review-index .grid .col-name, +.catalog-product-review-index .grid .col-title, +.customer-index-edit .ui-tabs-panel .grid .col-name, +.review-product-index .grid .col-name, +.adminhtml-cms-page-index .col-title, +.adminhtml-cms-page-index .col-identifier, +.catalog-product-attribute-index .col-attr-code, +.catalog-product-attribute-index .col-label, +.adminhtml-logging-index .grid .col-info { + max-width: 110px; + width: 110px; +} +.grid .col-name, +.grid .col-product, +.col-banner_name, +.adminhtml-widget-instance-index .col-title, +[class^=' adminhtml-customer-'] .col-label, +.adminhtml-rma-item-attribute-index .col-label, +.adminhtml-system-variable-index .grid .col-code, +.ui-tabs-panel .dashboard-data .col-name, +.adminhtml-test-index .col-label { + max-width: 370px; + width: 370px; +} +.col-grid_segment_name, +.reports-index-search .col-query_text { + max-width: 570px; + width: 570px; +} +[class^=' adminhtml-rma-'] .fieldset-wrapper .data-table td, +.reports-report-product-lowstock .grid .col-name, +.reports-report-shopcart-product .grid .col-name, +.reports-report-review-customer .grid .col-name, +[class^=' adminhtml-rma-'] .fieldset-wrapper .accordion .config .data-table td { + max-width: 670px; + width: 670px; +} +.reports-report-sales-invoiced .grid .col-period, +.reports-report-sales-refunde .grid .col-period, +[class^=' tests-report-test'] .grid .col-period { + width: auto; +} +.grid .col-select, +.grid .col-id, +.grid .col-number { + width: 40px; +} +.sales-order-create-index .grid, +.sales-order-create-index .grid-actions, +.adminhtml-export-index .grid-actions, +.adminhtml-export-index .grid { + padding-left: 0; + padding-right: 0; +} +[class^=' adminhtml-rma-'] .col-actions a, +[class^=' customer-index-'] .col-action a, +.adminhtml-notification-index .col-actions a { + display: block; + margin: 0 0 3px; + white-space: nowrap; +} +.data-table-td-max .accordion .config .data-table td, +.order-account-information .data-table td, +[class^=' adminhtml-rma-'] .rma-request-details .data-table td { + max-width: 250px; + width: 250px; +} +.catalog-product-edit .ui-tabs-panel .grid .hor-scroll, +.catalog-product-index .grid .hor-scroll, +.review-product-index .grid .hor-scroll, +.adminhtml-rma-edit .hor-scroll { + overflow-x: auto; +} +.add-clearer:after, +.massaction:after, +.navigation > ul:after { + content: ""; + display: table; + clear: both; +} +.test-content { + width: calc(20px + 100*0.2); +} +.test-content:before { + content: '.test {\A ' attr(data-attribute) ': 0.2em;' '\A content:\''; + white-space: pre; +} +.test-content:after { + content: ' Test\';\A}' "\A" '\A.test + .test._other ~ ul > li' " {\A height: @var;\A content: ' + ';\A}"; + white-space: pre; +} diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/css/styles.magento.min.css b/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/css/styles.magento.min.css new file mode 100644 index 0000000000000..f99db6c75b791 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/_files/static/css/styles.magento.min.css @@ -0,0 +1 @@ +table>caption{margin-bottom:5px}table thead{background:#676056;color:#f7f3eb}table thead .headings{background:#807a6e}table thead a{color:#f7f3eb;display:block}table thead a label{color:#f7f3eb;cursor:pointer;display:block}table thead a:hover,table thead a:focus{color:#dac7a2;text-decoration:none}table tfoot{background:#f2ebde;color:#676056}table tfoot tr th,table tfoot tr td{text-align:left}table th{background:transparent;border:solid #cac3b4;border-width:0 1px;font-size:14px;padding:6px 10px;text-align:center}table td{border:solid #cac3b4;border-width:0 1px;padding:6px 10px 7px;vertical-align:top}table tbody tr td{background:#fff;color:#676056;padding-top:12px}table tbody tr td:first-child{border-left:0}table tbody tr td:first-child input[type="checkbox"]{margin:0}table tbody tr td:last-child{border-right:0}table tbody tr:last-child th,table tbody tr:last-child td{border-bottom-width:1px}table tbody tr:nth-child(odd) td,table tbody tr:nth-child(odd) th{background-color:#f7f3eb}table tbody.even tr td{background:#fff}table tbody.odd tr td{background:#f7f3eb}table .dropdown-menu li{padding:7px 15px;line-height:14px;cursor:pointer}table .col-draggable .draggable-handle{float:left;position:relative;top:0}.not-sort{padding-right:10px}.sort-arrow-asc,.sort-arrow-desc{padding-right:10px;position:relative}.sort-arrow-asc:after,.sort-arrow-desc:after{right:-11px;top:-1px;position:absolute;width:23px}.sort-arrow-asc:hover:after,.sort-arrow-desc:hover:after{color:#dac7a2}.sort-arrow-asc{display:inline-block;text-decoration:none}.sort-arrow-asc:after{font-family:'icons-blank-theme';content:'\e626';font-size:13px;line-height:inherit;color:#f7f3eb;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.sort-arrow-asc:hover:after{color:#dac7a2}.sort-arrow-desc{display:inline-block;text-decoration:none}.sort-arrow-desc:after{font-family:'icons-blank-theme';content:'\e623';font-size:13px;line-height:inherit;color:#f7f3eb;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.sort-arrow-desc:hover:after{color:#dac7a2}.grid-actions .input-text,.pager .input-text,.massaction .input-text,.filter .input-text,.grid-actions select,.pager select,.massaction select,.filter select,.grid-actions .select,.pager .select,.massaction .select,.filter .select{border-color:#989287;box-shadow:none;border-radius:1px;height:28px;margin:0 10px 0 0}.filter th{border:0 solid #676056;padding:6px 3px;vertical-align:top}.filter .ui-datepicker-trigger{cursor:pointer;margin-top:2px}.filter .input-text{padding:0 5px}.filter .range-line:not(:last-child){margin-bottom:5px}.filter .date{padding-right:28px;position:relative;display:inline-block;text-decoration:none}.filter .date .hasDatepicker{vertical-align:top;width:99%}.filter .date img{cursor:pointer;height:25px;width:25px;right:0;position:absolute;vertical-align:middle;z-index:2;opacity:0}.filter .date:before{font-family:'icons-blank-theme';content:'\e612';font-size:42px;line-height:30px;color:#f7f3eb;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.filter .date:hover:before{color:#dac7a2}.filter .date:before{height:29px;margin-left:5px;position:absolute;right:-3px;top:-3px;width:35px}.filter select{border-color:#cac3b4;margin:0;padding:0;width:99%}.filter input.input-text{border-color:#cac3b4;margin:0;width:99%}.filter input.input-text::-webkit-input-placeholder{color:#989287 !important;text-transform:lowercase}.filter input.input-text::-moz-placeholder{color:#989287 !important;text-transform:lowercase}.filter input.input-text:-moz-placeholder{color:#989287 !important;text-transform:lowercase}.filter input.input-text:-ms-input-placeholder{color:#989287 !important;text-transform:lowercase}.grid{background:#fff;color:#676056;font-size:13px;font-weight:400;padding:15px}.grid table{width:100%}.grid tbody tr.selected th,.grid tbody tr.selected td,.grid tbody tr:hover th,.grid tbody tr:hover td,.grid tbody tr:nth-child(odd):hover th,.grid tbody tr:nth-child(odd):hover td{background-color:#f2ebde;cursor:pointer}.grid tbody tr.selected th.empty-text,.grid tbody tr.selected td.empty-text,.grid tbody tr:hover th.empty-text,.grid tbody tr:hover td.empty-text,.grid tbody tr:nth-child(odd):hover th.empty-text,.grid tbody tr:nth-child(odd):hover td.empty-text{background-color:#f7f3eb;cursor:default}.grid .empty-text{font:400 20px/1.2 'Open Sans',sans-serif;text-align:center;white-space:nowrap}.grid .col-sku{max-width:100px;width:100px}.grid .col-select,.grid .col-massaction{text-align:center}.grid .editable .input-text{width:65px}.grid .col-actions .action-select{background:#fff;border-color:#989287;height:28px;margin:0;padding:4px 4px 5px;width:80px}.grid .col-position.editable{white-space:nowrap}.grid .col-position.editable .input-text{margin:-7px 5px 0;width:70%}.eq-ie9 .hor-scroll{display:inline-block;min-height:0;overflow-y:hidden;overflow-x:auto;width:100%}.data-table{border-collapse:separate;width:100%}.data-table thead,.data-table tfoot,.data-table th,.accordion .config .data-table thead th,.accordion .config .data-table tfoot td,.accordion .config .accordion .config .data-table tfoot td th{background:#fff;color:#676056;font-size:13px;font-weight:600}.data-table th{text-align:left}.data-table thead th,.accordion .config .data-table thead th th,.accordion .config .data-table tfoot td th,.accordion .config .accordion .config .data-table tfoot td th th{border:solid #c9c2b8;border-width:0 0 1px;padding:7px}.data-table td,.data-table tbody tr th,.data-table tbody tr td,.accordion .config .data-table td{background:#fff;border-width:0;padding:5px 7px;vertical-align:middle}.data-table tbody tr:nth-child(odd) th,.data-table tbody tr:nth-child(odd) td,.accordion .config .data-table tbody tr:nth-child(odd) td{background:#fbfaf6}.data-table tbody.odd tr th,.data-table tbody.odd tr td{background:#fbfaf6}.data-table tbody.even tr th,.data-table tbody.even tr td{background:#fff}.data-table tfoot tr:last-child th,.data-table tfoot tr:last-child td,.data-table .accordion .config .data-table tfoot tr:last-child td{border:0}.data-table.order-tables tbody td{vertical-align:top}.data-table.order-tables tbody:hover tr th,.data-table.order-tables tbody:hover tr td{background:#f7f3eb}.data-table.order-tables tfoot td{background:#f2ebde;color:#676056;font-size:13px;font-weight:600}.data-table input[type="text"]{width:98%;padding-left:1%;padding-right:1%}.data-table select{margin:0;box-sizing:border-box}.data-table .col-actions .actions-split{margin-top:4px}.data-table .col-actions .actions-split [class^='action-']{background:none;border:1px solid #c8c3b5;padding:3px 5px;color:#bbb3a6;font-size:12px}.data-table .col-actions .actions-split [class^='action-']:first-child{border-right:0}.data-table .col-actions .actions-split .dropdown-menu{margin-top:-1px}.data-table .col-actions .actions-split .dropdown-menu a{display:block;color:#333;text-decoration:none}.data-table .col-actions .actions-split.active .action-toggle{position:relative;border-bottom-right-radius:0;box-shadow:none;background:#fff}.data-table .col-actions .actions-split.active .action-toggle:after{position:absolute;top:100%;left:0;right:0;height:2px;margin-top:-1px;background:#fff;content:'';z-index:2}.data-table .col-actions .actions-split.active .action-toggle .dropdown-menu{border-top-right-radius:0}.data-table .col-default{white-space:nowrap;text-align:center;vertical-align:middle}.data-table .col-delete{text-align:center;width:32px}.data-table .col-file{white-space:nowrap}.data-table .col-file input,.data-table .col-file .input-text{margin:0 5px;width:40%}.data-table .col-file input:first-child,.data-table .col-file .input-text:first-child{margin-left:0}.data-table .col-actions-add{padding:10px 0}.grid-actions{background:#fff;font-size:13px;line-height:28px;padding:10px 15px;position:relative}.grid-actions+.grid{padding-top:5px}.grid-actions .export,.grid-actions .filter-actions{float:right;margin-left:10px;vertical-align:top}.grid-actions .import{display:block;vertical-align:top}.grid-actions .action-reset{background:none;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;margin:6px 10px 0 0;vertical-align:top}.grid-actions .action-reset:visited{color:purple;text-decoration:none}.grid-actions .action-reset:hover{color:#006bb4;text-decoration:underline}.grid-actions .action-reset:active{color:#ff5501;text-decoration:underline}.grid-actions .action-reset:hover{color:#006bb4}.grid-actions .action-reset:hover,.grid-actions .action-reset:active,.grid-actions .action-reset:focus{background:none;border:0}.grid-actions .action-reset.disabled,.grid-actions .action-reset[disabled],fieldset[disabled] .grid-actions .action-reset{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.grid-actions .import .label,.grid-actions .export .label,.massaction>.entry-edit .label{margin:0 14px 0 0;vertical-align:inherit}.grid-actions .import .action-,.grid-actions .export .action-,.grid-actions .filter-actions .action-,.massaction>.entry-edit .action-{vertical-align:inherit}.grid-actions .filter .date{float:left;margin:0 15px 0 0;position:relative}.grid-actions .filter .date:before{color:#676056;top:1px}.grid-actions .filter .date:hover:before{color:#31302b}.grid-actions .filter .label{margin:0}.grid-actions .filter .hasDatepicker{margin:0 5px;width:80px}.grid-actions .filter .show-by .select{margin-left:5px;padding:4px 4px 5px;vertical-align:top;width:auto}.grid-actions .filter.required:after{content:''}.grid-actions img{vertical-align:middle;height:22px;width:22px}.grid-actions .validation-advice{background:#f9d4d4;border:1px solid #e22626;border-radius:3px;color:#e22626;margin:5px 0 0;padding:3px 7px;position:absolute;white-space:nowrap;z-index:5}.grid-actions .validation-advice:before{width:0;height:0;border:5px solid transparent;border-bottom-color:#e22626;content:'';left:50%;margin-left:-5px;position:absolute;top:-11px}.grid-actions input[type="text"].validation-failed{border-color:#e22626;box-shadow:0 0 8px rgba(226,38,38,.6)}.grid-actions .link-feed{white-space:nowrap}.pager{font-size:13px}.grid .pager{margin:15px 0 0;position:relative;text-align:center}.pager .pages-total-found{margin-right:25px}.pager .view-pages .select{margin:0 5px}.pager .link-feed{font-size:12px;margin:7px 15px 0 0;position:absolute;right:0;top:0}.pager .action-previous,.pager .action-next{background:none;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;line-height:.6;overflow:hidden;width:20px}.pager .action-previous:visited,.pager .action-next:visited{color:purple;text-decoration:none}.pager .action-previous:hover,.pager .action-next:hover{color:#006bb4;text-decoration:underline}.pager .action-previous:active,.pager .action-next:active{color:#ff5501;text-decoration:underline}.pager .action-previous:hover,.pager .action-next:hover{color:#006bb4}.pager .action-previous:hover,.pager .action-next:hover,.pager .action-previous:active,.pager .action-next:active,.pager .action-previous:focus,.pager .action-next:focus{background:none;border:0}.pager .action-previous.disabled,.pager .action-next.disabled,.pager .action-previous[disabled],.pager .action-next[disabled],fieldset[disabled] .pager .action-previous,fieldset[disabled] .pager .action-next{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.pager .action-previous:before,.pager .action-next:before{margin-left:-10px}.pager .action-previous.disabled,.pager .action-next.disabled{opacity:.3}.pager .action-previous{display:inline-block;text-decoration:none}.pager .action-previous>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pager .action-previous>span.focusable:active,.pager .action-previous>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-previous>span.focusable:active,.pager .action-previous>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:40px;line-height:inherit;color:#026294;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.pager .action-previous:hover:before{color:#007dbd}.pager .action-next{display:inline-block;text-decoration:none}.pager .action-next>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pager .action-next>span.focusable:active,.pager .action-next>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-next>span.focusable:active,.pager .action-next>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.pager .action-next:before{font-family:'icons-blank-theme';content:'\e608';font-size:40px;line-height:inherit;color:#026294;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.pager .action-next:hover:before{color:#007dbd}.pager .input-text{height:25px;line-height:16px;margin-right:5px;text-align:center;width:25px;vertical-align:top}.pager .pages-total{line-height:25px;vertical-align:top}.massaction{background:#fff;border-top:1px solid #f2ebde;font-size:13px;line-height:28px;padding:15px 15px 0}.massaction>.entry-edit{float:right}.massaction>.entry-edit .field-row{display:inline-block;vertical-align:top}.massaction>.entry-edit .validation-advice{display:none !important}.massaction>.entry-edit .form-inline{display:inline-block}.massaction>.entry-edit .label{padding:0;width:auto}.massaction>.entry-edit .action-{vertical-align:top}.massaction .select.validation-failed{border:1px dashed #e22626;background:#f9d4d4}.grid-severity-critical,.grid-severity-major,.grid-severity-notice,.grid-severity-minor{background:#feeee1;border:1px solid #ed4f2e;color:#ed4f2e;display:block;padding:0 3px;font-weight:bold;line-height:17px;text-transform:uppercase;text-align:center}.grid-severity-critical,.grid-severity-major{border-color:#e22626;background:#f9d4d4;color:#e22626}.grid-severity-notice{border-color:#5b8116;background:#d0e5a9;color:#185b00}.grid tbody td input[type="text"],.data-table tbody td input[type="text"],.grid tbody th input[type="text"],.data-table tbody th input[type="text"],.grid tbody td .input-text,.data-table tbody td .input-text,.grid tbody th .input-text,.data-table tbody th .input-text,.grid tbody td select,.data-table tbody td select,.grid tbody th select,.data-table tbody th select,.grid tbody td .select,.data-table tbody td .select,.grid tbody th .select,.data-table tbody th .select{width:99%}.ui-tabs-panel .grid .col-sku{max-width:150px;width:150px}.col-indexer_status,.col-indexer_mode{width:160px}.fieldset-wrapper .grid-actions+.grid{padding-top:15px}.fieldset-wrapper .grid-actions{padding:10px 0 0}.fieldset-wrapper .grid{padding:0}.fieldset-wrapper .massaction{padding:0;border-top:0;margin-bottom:15px}.accordion .grid{padding:0}.ui-dialog-content .grid-actions,.ui-dialog-content .grid{padding-left:0;padding-right:0}.qty-table td{border:0;padding:0 5px 3px}.sales-order-create-index .sales-order-create-index .grid table .action-configure{float:right}.sales-order-create-index .data-table .border td{padding-bottom:15px}.sales-order-create-index .actions.update{margin:10px 0}.adminhtml-order-shipment-new .grid .col-product{max-width:770px;width:770px}.customer-index-index .grid .col-name{max-width:90px;width:90px}.customer-index-index .grid .col-billing_region{width:70px}.adminhtml-cms-hierarchy-index .col-title,.adminhtml-cms-hierarchy-index .col-identifier{max-width:410px;width:410px}.adminhtml-widget-instance-edit .grid-chooser .control{margin-top:-19px;width:80%}.eq-ie9 .adminhtml-widget-instance-edit .grid-chooser .control{margin-top:-18px}.adminhtml-widget-instance-edit .grid-chooser .control .grid-actions{padding:0 0 15px}.adminhtml-widget-instance-edit .grid-chooser .control .grid{padding:0}.adminhtml-widget-instance-edit .grid-chooser .control .addon input:last-child,.adminhtml-widget-instance-edit .grid-chooser .control .addon select:last-child{border-radius:0}.reports-report-product-sold .grid .col-name{max-width:720px;width:720px}.adminhtml-system-store-index .grid td{max-width:310px}.adminhtml-system-currency-index .grid{padding-top:0}.adminhtml-system-currency-index .col-currency-edit-rate{min-width:40px}.adminhtml-system-currency-index .col-base-currency{font-weight:bold}.adminhtml-system-currency-index .old-rate{display:block;margin-top:3px;text-align:center}.adminhtml-system-currency-index .hor-scroll{overflow-x:auto;min-width:970px}.adminhtml-system-currencysymbol-index .col-currency{width:35%}.adminhtml-system-currencysymbol-index .grid .input-text{margin:0 10px 0 0;width:50%}.catalog-product-set-index .col-set_name{max-width:930px;width:930px}.adminhtml-export-index .grid td{vertical-align:middle}.adminhtml-export-index .grid .input-text-range{margin:0 10px 0 5px;width:37%}.adminhtml-export-index .grid .input-text-range-date{margin:0 5px;width:32%}.adminhtml-export-index .ui-datepicker-trigger{display:inline-block;margin:-3px 10px 0 0;vertical-align:middle}.adminhtml-notification-index .grid .col-select,.adminhtml-cache-index .grid .col-select,.adminhtml-process-list .grid .col-select,.indexer-indexer-list .grid .col-select{width:10px}@font-face{font-family:'icons-blank-theme';src:url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot');src:url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot?#iefix') format('embedded-opentype'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf') format('truetype'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg#icons-blank-theme') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'icons-blank-theme';src:url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot');src:url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot?#iefix') format('embedded-opentype'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2') format('woff2'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff') format('woff'),url('../fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf') format('truetype');font-weight:normal;font-style:normal}.navigation{background-color:#676056;position:relative;z-index:5}.navigation .level-0.reverse>.submenu{right:1px}.navigation>ul{position:relative;text-align:right}.navigation .level-0>.submenu{display:none;position:absolute;top:100%;padding:19px 13px}.navigation .level-0>.submenu a{display:block;color:#676056;font-size:13px;font-weight:400;line-height:1.385;padding:3px 12px 3px;text-decoration:none}.navigation .level-0>.submenu a:focus,.navigation .level-0>.submenu a:hover{text-decoration:underline}.navigation .level-0>.submenu a:hover{color:#fff;background:#989287;text-decoration:none}.navigation .level-0>.submenu li{margin-bottom:1px}.navigation .level-0>.submenu a[href="#"]{cursor:default;display:block;color:#676056;font-size:14px;font-weight:700;line-height:1;margin:7px 0 6px;padding:0 12px}.navigation .level-0>.submenu a[href="#"]:focus,.navigation .level-0>.submenu a[href="#"]:hover{color:#676056;font-size:14px;font-weight:700;background:none;text-decoration:none}.navigation .level-0{display:inline-block;float:left;text-align:left;transition:display .15s ease-out}.navigation .level-0>a{background:none;display:block;padding:12px 13px 0;color:#f2ebde;font-size:13px;font-weight:600;text-transform:uppercase;text-decoration:none;transition:background .15s ease-out}.navigation .level-0>a:after{content:"";display:block;margin-top:10px;height:3px;font-size:0}.navigation .level-0.active>a{font-weight:700}.navigation .level-0.active>a:after{background:#ef672f}.navigation .level-0.hover.recent>a{background:#fff;color:#676056;font-size:13px;font-weight:600}.navigation .level-0.hover.recent>a:after{background:none}.navigation .level-0.hover.recent.active>a{font-weight:700}.navigation .level-0>.submenu{opacity:0;visibility:hidden}.navigation .level-0.recent.hover>.submenu{opacity:1;visibility:visible}.no-js .navigation .level-0:hover>.submenu,.no-js .navigation .level-0.hover>.submenu,.no-js .navigation .level-0>a:focus+.submenu{display:block}.navigation .level-0>.submenu{background:#fff;box-shadow:0 3px 3px rgba(50,50,50,.15)}.navigation .level-0>.submenu li{max-width:200px}.navigation .level-0>.submenu>ul{white-space:nowrap}.navigation .level-0>.submenu .column{display:inline-block;margin-left:40px;vertical-align:top}.navigation .level-0>.submenu .column:first-child{margin-left:0}.navigation .level-0 .submenu .level-1{white-space:normal}.navigation .level-0.parent .submenu .level-1.parent{margin:17px 0 25px}.navigation .level-0.parent .level-1.parent:first-child{margin-top:0}.navigation .level-2 .submenu{margin-left:7px}.navigation .level-0>.submenu .level-2>a[href="#"]{font-size:13px;margin-top:10px;margin-left:7px}.navigation .level-2>.submenu a{font-size:12px;line-height:1.231}.navigation .level-0>.submenu .level-3>a[href="#"],.navigation .level-3 .submenu{margin-left:15px}.navigation .level-0.item-system,.navigation .level-0.item-stores{float:none}.navigation .level-0.item-system>.submenu,.navigation .level-0.item-stores>.submenu{left:auto;right:1px}.adminhtml-dashboard-index .col-1-layout{max-width:1300px;border:0;border-radius:0;padding:0;background:#f7f3eb}.dashboard-inner{padding-top:35px}.dashboard-inner:before,.dashboard-inner:after{content:"";display:table}.dashboard-inner:after{clear:both}.dashboard-inner:before,.dashboard-inner:after{content:"";display:table}.dashboard-inner:after{clear:both}.dashboard-secondary{float:left;width:32%;margin:0 1.5%}.dashboard-main{float:right;width:65%}.dashboard-diagram-chart{max-width:100%;height:auto}.dashboard-diagram-nodata,.dashboard-diagram-switcher{padding:20px 0}.dashboard-diagram-image{background:#fff url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%}.dashboard-container .ui-tabs-panel{background-color:#fff;min-height:40px;padding:15px}.dashboard-store-stats{margin-top:35px}.dashboard-store-stats .ui-tabs-panel{background:#fff url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%}.dashboard-item{margin-bottom:30px}.dashboard-item-header{margin-left:5px}.dashboard-item.dashboard-item-primary{margin-bottom:35px}.dashboard-item.dashboard-item-primary .title{font-size:22px;margin-bottom:5px}.dashboard-item.dashboard-item-primary .dashboard-sales-value{display:block;text-align:right;font-weight:600;font-size:30px;margin-right:12px;padding-bottom:5px}.dashboard-item.dashboard-item-primary:first-child{color:#ef672f}.dashboard-item.dashboard-item-primary:first-child .title{color:#ef672f}.dashboard-totals{background:#fff;padding:50px 15px 25px}.dashboard-totals-list{margin:0;padding:0;list-style:none none}.dashboard-totals-list:before,.dashboard-totals-list:after{content:"";display:table}.dashboard-totals-list:after{clear:both}.dashboard-totals-list:before,.dashboard-totals-list:after{content:"";display:table}.dashboard-totals-list:after{clear:both}.dashboard-totals-item{float:left;width:18%;margin-left:7%;padding-top:15px;border-top:2px solid #cac3b4}.dashboard-totals-item:first-child{margin-left:0}.dashboard-totals-label{display:block;font-size:16px;font-weight:600;padding-bottom:2px}.dashboard-totals-value{color:#ef672f;font-size:20px}.dashboard-data{width:100%}.dashboard-data thead{background:transparent}.dashboard-data thead tr{background:none}.dashboard-data th,.dashboard-data td{border:0;padding:10px 12px;text-align:right}.dashboard-data th:first-child,.dashboard-data td:first-child{text-align:left}.dashboard-data th{color:#676056;font-weight:600}.dashboard-data td{background-color:transparent}.dashboard-data tbody tr:hover td{background-color:transparent}.dashboard-data tbody tr:nth-child(odd) td,.dashboard-data tbody tr:nth-child(odd):hover td,.dashboard-data tbody tr:nth-child(odd) th,.dashboard-data tbody tr:nth-child(odd):hover th{background-color:#e1dbcf}.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd) td,.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd):hover td,.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd) th,.ui-tabs-panel .dashboard-data tbody tr:nth-child(odd):hover th{background-color:#f7f3eb}.dashboard-data td.empty-text{text-align:center}.ui-tabs-panel .dashboard-data{background-color:#fff}.mage-dropdown-dialog.ui-dialog .ui-dialog-content{overflow:visible}.mage-dropdown-dialog.ui-dialog .ui-dialog-buttonpane{padding:0}.message-system-inner{background:#f7f3eb;border:1px solid #c0bbaf;border-top:0;border-radius:0 0 5px 5px;float:right;overflow:hidden}.message-system-unread .message-system-inner{float:none}.message-system-list{margin:0;padding:0;list-style:none;float:left}.message-system .message-system-list{width:75%}.message-system-list li{padding:5px 13px 7px 36px;position:relative}.message-system-short{padding:5px 13px 7px;float:right}.message-system-short span{display:inline-block;margin-left:7px;border-left:1px #d1ccc3 solid}.message-system-short span:first-child{border:0;margin-left:0}.message-system-short a{padding-left:27px;position:relative;height:16px}.message-system .message-system-short a:before,.message-system-list li:before{font-family:'MUI-Icons';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;height:16px;width:16px;font-size:16px;line-height:16px;text-align:center;position:absolute;left:7px;top:2px}.message-system-list li:before{top:5px;left:13px}.message-system .message-system-short .warning a:before,.message-system-list li.warning:before{content:"\e006";color:#f2a825}.message-system .message-system-short .error a:before,.message-system-list li.error:before{content:"\e086";font-family:'MUI-Icons';color:#c00815}.ui-dialog .message-system-list{margin-bottom:25px}.sales-order-create-index .order-errors .notice{color:#ed4f2e;font-size:11px;margin:5px 0 0}.order-errors .fieldset-wrapper-title .title{box-sizing:border-box;background:#fffbf0;border:1px solid #d87e34;border-radius:5px;color:#676056;font-size:14px;margin:20px 0;padding:10px 26px 10px 35px;position:relative}.order-errors .fieldset-wrapper-title .title:before{position:absolute;left:11px;top:50%;margin-top:-11px;width:auto;height:auto;font-family:'MUI-Icons';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;font-size:16px;line-height:inherit;content:'\e046';color:#d87e34}.search-global.miniform{position:relative;z-index:1000;display:inline-block;vertical-align:top;margin:6px 10px 0}.search-global.miniform .mage-suggest{border:0;border-radius:0}.search-global-actions{display:none}.search-global-field{margin:0}.search-global-field .label{position:absolute;right:4px;z-index:2;cursor:pointer;display:inline-block;text-decoration:none}.search-global-field .label>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.search-global-field .label>span.focusable:active,.search-global-field .label>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.search-global-field .label>span.focusable:active,.search-global-field .label>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.search-global-field .label:before{font-family:'MUI-Icons';content:"\e01f";font-size:18px;line-height:29px;color:#cac3b4;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.search-global-field .control{width:48px;overflow:hidden;opacity:0;transition:all .3s ease}.search-global-field .control input[type="text"]{background:transparent;border:0;width:100%}.search-global-field.active{z-index:2}.search-global-field.active .label:before{display:none}.search-global-field.active .control{overflow:visible;opacity:1;transition:all .3s ease;width:300px}.search-global-menu{box-sizing:border-box;display:block;width:100%}.notifications-summary{display:inline-block;text-align:left;position:relative;z-index:1}.notifications-summary.active{z-index:999}.notifications-action{color:#f2ebde;padding:12px 22px 11px 22px;text-transform:capitalize;display:inline-block;text-decoration:none}.notifications-action:before{font-family:"MUI-Icons";content:"\e06e";font-size:18px;line-height:18px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.notifications-action:visited,.notifications-action:focus,.notifications-action:active,.notifications-action:hover{color:#f2ebde;text-decoration:none}.notifications-action.active{background-color:#FFF;color:#676056}.notifications-action .text{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.notifications-action .text.focusable:active,.notifications-action .text.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-action .text.focusable:active,.notifications-action .text.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-action .qty.counter{display:inline-block;background:#ed4f2e;color:#f2ebde;font-size:12px;line-height:12px;font-weight:bold;padding:1px 3px;position:absolute;top:6px;left:50%;border-radius:4px}.notifications-list{width:300px;padding:0;margin:0}.notifications-list .last{padding:10px;text-align:center;font-size:12px}.notifications-summary .notifications-entry{padding:15px;color:#676056;font-size:11px;font-weight:400}.notifications-entry{position:relative;z-index:1}.notifications-entry:hover .action{display:block}.notifications-entry-title{padding-right:15px;color:#ed4f2e;font-size:12px;font-weight:600;display:block;margin-bottom:10px}.notifications-entry-description{line-height:1.3;display:block;max-height:3.9em;overflow:hidden;margin-bottom:10px;text-overflow:ellipsis}.notifications-close.action{position:absolute;z-index:1;top:12px;right:12px;display:inline-block;background-image:none;background:none;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;display:none}.notifications-close.action>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.notifications-close.action>span.focusable:active,.notifications-close.action>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-close.action>span.focusable:active,.notifications-close.action>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-close.action:before{font-family:'MUI-Icons';content:"\e07f";font-size:16px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.notifications-close.action:focus,.notifications-close.action:active{background:none;border:0}.notifications-close.action:hover{background:none;border:0}.notifications-close.action.disabled,.notifications-close.action[disabled],fieldset[disabled] .notifications-close.action{cursor:not-allowed;pointer-events:none;opacity:.5}.notifications-dialog-content{display:none}.notifications-critical .notifications-entry-title{padding-left:25px;display:inline-block;text-decoration:none}.notifications-critical .notifications-entry-title:before{font-family:'MUI-Icons';content:"\e086";font-size:18px;line-height:18px;color:#c00815;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.notifications-critical .notifications-entry-title:before{position:absolute;margin-left:-25px}.notifications-dialog-content .notifications-entry-time{color:#8c867e;font-size:13px;font-family:Helvetica,Arial,sans-serif;position:absolute;right:17px;bottom:27px;text-align:right}.notifications-url{display:inline-block;text-decoration:none}.notifications-url>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.notifications-url>span.focusable:active,.notifications-url>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-url>span.focusable:active,.notifications-url>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.notifications-url:after{font-family:'MUI-Icons';content:"\e084";font-size:16px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:-2px 0 0 10px}.notifications-dialog-content .notifications-entry-title{font-size:15px}.locale-switcher-field{white-space:nowrap;float:left}.locale-switcher-field .control,.locale-switcher-field .label{vertical-align:middle;margin:0 10px 0 0;display:inline-block}.locale-switcher-select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;border:1px solid #ada89e;max-width:200px;height:31px;background:url("../images/select-bg.svg") no-repeat 100% 50%;background-size:30px 60px;padding-right:29px;text-indent:.01px;text-overflow:''}.locale-switcher-select::-ms-expand{display:none}.lt-ie10 .locale-switcher-select{background-image:none;padding-right:4px}@-moz-document url-prefix(){.locale-switcher-select{background-image:none}}@-moz-document url-prefix(){.locale-switcher-select{background-image:none}}.mage-suggest{text-align:left;box-sizing:border-box;position:relative;display:inline-block;vertical-align:top;width:100%;background-color:#fff;border:1px solid #ada89e;border-radius:2px}.mage-suggest:after{position:absolute;top:3px;right:3px;bottom:0;width:22px;text-align:center;font-family:'MUI-Icons';font-style:normal;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;content:'\e01f';font-size:18px;color:#b2b2b2}.mage-suggest input[type="search"],.mage-suggest input.search{width:100%;border:0;background:none;padding-right:30px}.mage-suggest.category-select input[type="search"],.mage-suggest.category-select input.search{height:26px}.mage-suggest-dropdown{position:absolute;left:0;right:0;top:100%;margin:1px -1px 0 -1px;border:1px solid #cac2b5;background:#fff;box-shadow:0 2px 4px rgba(0,0,0,.2);z-index:990}.mage-suggest-dropdown ul{margin:0;padding:0;list-style:none}.mage-suggest-dropdown li{border-bottom:1px solid #e5e5e5;padding:0}.mage-suggest-dropdown li a{display:block}.mage-suggest-dropdown li a.ui-state-focus{background:#f5f5f5}.mage-suggest-dropdown li a,.mage-suggest-dropdown .jstree li a:hover,.mage-suggest-dropdown .jstree .jstree-hovered,.mage-suggest-dropdown .jstree .jstree-clicked{padding:6px 12px 5px;text-decoration:none;color:#333}.mage-suggest-dropdown .jstree li a:hover,.mage-suggest-dropdown .jstree .jstree-hovered,.mage-suggest-dropdown .jstree .jstree-clicked{border:0}.mage-suggest-dropdown .jstree li{border-bottom:0}.mage-suggest-dropdown .jstree li a{display:inline-block}.mage-suggest-dropdown .jstree .mage-suggest-selected>a{color:#000;background:#f1ffeb}.field-category_ids .mage-suggest-dropdown,.field-new_category_parent .mage-suggest-dropdown{max-height:200px;overflow:auto}.mage-suggest-dropdown .jstree .mage-suggest-selected>a:hover,.mage-suggest-dropdown .jstree .mage-suggest-selected>.jstree-hovered,.mage-suggest-dropdown .jstree .mage-suggest-selected>.jstree-clicked,.mage-suggest-dropdown .jstree .mage-suggest-selected.mage-suggest-not-active>.jstree-hovered,.mage-suggest-dropdown .jstree .mage-suggest-selected.mage-suggest-not-active>.jstree-clicked{background:#e5ffd9}.mage-suggest-dropdown .jstree .mage-suggest-not-active>a{color:#d4d4d4}.mage-suggest-dropdown .jstree .mage-suggest-not-active>a:hover,.mage-suggest-dropdown .jstree .mage-suggest-not-active>.jstree-hovered,.mage-suggest-dropdown .jstree .mage-suggest-not-active>.jstree-clicked{background:#f5f5f5}.mage-suggest-dropdown .category-path{font-size:11px;margin-left:10px;color:#9ba8b5}.suggest-expandable .action-dropdown .action-toggle{display:inline-block;max-width:500px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:none;border:0;box-shadow:none;color:#676056;font-size:12px;padding:5px 4px;filter:none}.suggest-expandable .action-dropdown .action-toggle span{display:inline}.suggest-expandable .action-dropdown .action-toggle:before{display:inline-block;float:right;margin-left:4px;font-size:13px;color:#b2b0ad}.suggest-expandable .action-dropdown .action-toggle:hover:before{color:#7e7e7e}.suggest-expandable .dropdown-menu{margin:1px 0 0;left:0;right:auto;width:245px;z-index:4}.suggest-expandable .mage-suggest{border:0;border-radius:3px 3px 0 0}.suggest-expandable .mage-suggest:after{top:10px;right:8px}.suggest-expandable .mage-suggest-inner .title{margin:0;padding:0 10px 4px;text-transform:uppercase;color:#a6a098;font-size:12px;border-bottom:1px solid #e5e5e5}.suggest-expandable .mage-suggest-inner>input[type="search"],.suggest-expandable .mage-suggest-inner>input.search{position:relative;margin:6px 5px 5px;padding-right:20px;border:1px solid #ada89e;width:236px;z-index:1}.suggest-expandable .mage-suggest-inner>input.ui-autocomplete-loading,.suggest-expandable .mage-suggest-inner>input.mage-suggest-state-loading{background:#fff url("../mui/images/ajax-loader-small.gif") no-repeat 190px 50%}.suggest-expandable .mage-suggest-dropdown{margin-top:0;border-top:0;border-radius:0 0 3px 3px;max-height:300px;overflow:auto;width:100%;float:left}.suggest-expandable .mage-suggest-dropdown ul{margin:0;padding:0;list-style:none}.suggest-expandable .action-show-all:hover,.suggest-expandable .action-show-all:active,.suggest-expandable .action-show-all:focus,.suggest-expandable .action-show-all[disabled]{border-top:1px solid #e5e5e5;display:block;width:100%;padding:8px 10px 10px;text-align:left;font:12px/1.333 Arial,Verdana,sans-serif;color:#676056}.product-actions .suggest-expandable{max-width:500px;float:left;margin-top:1px}.page-actions.fixed #product-template-suggest-container{display:none}.catalog-category-edit .col-2-left-layout:before{display:none}.category-content .ui-tabs-panel .fieldset{padding-top:40px}.category-content .ui-tabs-panel .fieldset .legend{display:none}.attributes-edit-form .field:not(.field-weight) .addon{display:block;position:relative}.attributes-edit-form .field:not(.field-weight) .addon input[type="text"]{border-width:1px}.attributes-edit-form .field:not(.field-weight) .addon .addafter{display:block;border:0;height:auto;width:auto}.attributes-edit-form .field:not(.field-weight) .addon input:focus~.addafter{box-shadow:none}.attributes-edit-form .with-addon .textarea{margin:0}.attributes-edit-form .attribute-change-checkbox{display:block;margin-top:5px}.attributes-edit-form .attribute-change-checkbox .label{float:none;padding:0;width:auto}.attributes-edit-form .attribute-change-checkbox .checkbox{margin-right:5px;width:auto}.attributes-edit-form .field-price .addon>input,.attributes-edit-form .field-special_price .addon>input,.attributes-edit-form .field-gift_wrapping_price .addon>input,.attributes-edit-form .field-msrp .addon>input,.attributes-edit-form .field-gift_wrapping_price .addon>input{padding-left:23px}.attributes-edit-form .field-price .addafter>strong,.attributes-edit-form .field-special_price .addafter>strong,.attributes-edit-form .field-gift_wrapping_price .addafter>strong,.attributes-edit-form .field-msrp .addafter>strong,.attributes-edit-form .field-gift_wrapping_price .addafter>strong{left:5px;position:absolute;top:3px}.attributes-edit-form .field.type-price input:focus+label,.attributes-edit-form .field-price input:focus+label,.attributes-edit-form .field-special_price input:focus+label,.attributes-edit-form .field-msrp input:focus+label,.attributes-edit-form .field-weight input:focus+label{box-shadow:none}.attributes-edit-form .field-special_from_date>.control .input-text,.attributes-edit-form .field-special_to_date>.control .input-text,.attributes-edit-form .field-news_from_date>.control .input-text,.attributes-edit-form .field-news_to_date>.control .input-text,.attributes-edit-form .field-custom_design_from>.control .input-text,.attributes-edit-form .field-custom_design_to>.control .input-text{border-width:1px;width:130px}.attributes-edit-form .field-weight .fields-group-2 .control{padding-right:27px}.attributes-edit-form .field-weight .fields-group-2 .control .addafter+.addafter{border-width:1px 1px 1px 0;border-style:solid;height:28px;right:0;position:absolute;top:0}.attributes-edit-form .field-weight .fields-group-2 .control .addafter strong{line-height:28px}.attributes-edit-form .field-weight .fields-group-2 .control>input:focus+.addafter+.addafter{box-shadow:0 0 8px rgba(82,168,236,.6)}.attributes-edit-form .field-gift_message_available .addon>input[type="checkbox"],.attributes-edit-form .field-gift_wrapping_available .addon>input[type="checkbox"]{width:auto;margin-right:5px}.attributes-edit-form .fieldset>.addafter{display:none}.advanced-inventory-edit .field.choice{display:block;margin:3px 0 0}.advanced-inventory-edit .field.choice .label{padding-top:1px}.product-actions:before,.product-actions:after{content:"";display:table}.product-actions:after{clear:both}.product-actions:before,.product-actions:after{content:"";display:table}.product-actions:after{clear:both}.product-actions .switcher{float:right}#configurable-attributes-container .actions-select{display:inline-block;position:relative}#configurable-attributes-container .actions-select:before,#configurable-attributes-container .actions-select:after{content:"";display:table}#configurable-attributes-container .actions-select:after{clear:both}#configurable-attributes-container .actions-select:before,#configurable-attributes-container .actions-select:after{content:"";display:table}#configurable-attributes-container .actions-select:after{clear:both}#configurable-attributes-container .actions-select .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}#configurable-attributes-container .actions-select .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#configurable-attributes-container .actions-select .action.toggle:hover:after{color:inherit}#configurable-attributes-container .actions-select .action.toggle:active:after{color:inherit}#configurable-attributes-container .actions-select .action.toggle.active{display:inline-block;text-decoration:none}#configurable-attributes-container .actions-select .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:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#configurable-attributes-container .actions-select .action.toggle.active:hover:after{color:inherit}#configurable-attributes-container .actions-select .action.toggle.active:active:after{color:inherit}#configurable-attributes-container .actions-select 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)}#configurable-attributes-container .actions-select ul.dropdown li{margin:0;padding:3px 5px}#configurable-attributes-container .actions-select ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}#configurable-attributes-container .actions-select.active{overflow:visible}#configurable-attributes-container .actions-select.active ul.dropdown{display:block}#configurable-attributes-container .actions-select .action.toggle{padding:1px 8px;border:1px solid #ada89e;background:#fff;border-radius:0 2px 2px 0}#configurable-attributes-container .actions-select .action.toggle:after{width:14px;text-indent:-2px}#configurable-attributes-container .actions-select ul.dropdown li:hover{background:#eef8fc}#configurable-attributes-container .actions-select ul.dropdown a{color:#333;text-decoration:none}#product-variations-matrix .actions-image-uploader{display:inline-block;position:relative;display:block;width:50px}#product-variations-matrix .actions-image-uploader:before,#product-variations-matrix .actions-image-uploader:after{content:"";display:table}#product-variations-matrix .actions-image-uploader:after{clear:both}#product-variations-matrix .actions-image-uploader:before,#product-variations-matrix .actions-image-uploader:after{content:"";display:table}#product-variations-matrix .actions-image-uploader:after{clear:both}#product-variations-matrix .actions-image-uploader .action.split{float:left;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle{float:right;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle{padding:6px 5px;display:inline-block;text-decoration:none}#product-variations-matrix .actions-image-uploader .action.toggle>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle:hover:after{color:inherit}#product-variations-matrix .actions-image-uploader .action.toggle:active:after{color:inherit}#product-variations-matrix .actions-image-uploader .action.toggle.active{display:inline-block;text-decoration:none}#product-variations-matrix .actions-image-uploader .action.toggle.active>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:active,#product-variations-matrix .actions-image-uploader .action.toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}#product-variations-matrix .actions-image-uploader .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}#product-variations-matrix .actions-image-uploader .action.toggle.active:hover:after{color:inherit}#product-variations-matrix .actions-image-uploader .action.toggle.active:active:after{color:inherit}#product-variations-matrix .actions-image-uploader 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)}#product-variations-matrix .actions-image-uploader ul.dropdown li{margin:0;padding:3px 5px}#product-variations-matrix .actions-image-uploader ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}#product-variations-matrix .actions-image-uploader.active{overflow:visible}#product-variations-matrix .actions-image-uploader.active ul.dropdown{display:block}#product-variations-matrix .actions-image-uploader .action.toggle{padding:0 2px;border:1px solid #b7b2a7;background:#fff;border-radius:0 4px 4px 0;border-left:0;height:33px}#product-variations-matrix .actions-image-uploader .action.toggle.no-display{display:none}#product-variations-matrix .actions-image-uploader .action.toggle:after{width:12px;text-indent:-5px}#product-variations-matrix .actions-image-uploader ul.dropdown{left:0;margin-left:0;width:100px}#product-variations-matrix .actions-image-uploader ul.dropdown li:hover{background:#eef8fc}#product-variations-matrix .actions-image-uploader ul.dropdown a{color:#333;text-decoration:none}.debugging-hints .page-actions{position:relative;z-index:1}.debugging-hints .page-actions .debugging-hint-template-file{left:auto !important;right:0 !important}.filter-segments{list-style:none;padding:0}.adminhtml-report-customer-test-detail .col-id{width:35px}.adminhtml-report-customer-test-detail .col-period{white-space:nowrap;width:70px}.adminhtml-report-customer-test-detail .col-zip{width:50px}.adminhtml-report-customer-test-segment .col-id{width:35px}.adminhtml-report-customer-test-segment .col-status{width:65px}.adminhtml-report-customer-test-segment .col-qty{width:145px}.adminhtml-report-customer-test-segment .col-segment,.adminhtml-report-customer-test-segment .col-website{width:35%}.adminhtml-report-customer-test-segment .col-select{width:45px}.test-custom-attributes{margin-bottom:20px}.adminhtml-test-index th.col-id{text-align:left}.adminhtml-test-index .col-price{text-align:right;width:50px}.adminhtml-test-index .col-actions{width:50px}.adminhtml-test-index .col-select{width:60px}.adminhtml-test-edit .field-image .control{line-height:28px}.adminhtml-test-edit .field-image a{display:inline-block;margin:0 5px 0 0}.adminhtml-test-edit .field-image img{vertical-align:middle}.adminhtml-test-new .field-image .input-file,.adminhtml-test-edit .field-image .input-file{display:inline-block;margin:0 15px 0 0;width:auto}.adminhtml-test-new .field-image .addafter,.adminhtml-test-edit .field-image .addafter{border:0;box-shadow:none;display:inline-block;margin:0 15px 0 0;height:auto;width:auto}.adminhtml-test-new .field-image .delete-image,.adminhtml-test-edit .field-image .delete-image{display:inline-block;white-space:nowrap}.adminhtml-test-edit .field-image .delete-image input{margin:-3px 5px 0 0;width:auto;display:inline-block}.adminhtml-test-edit .field-image .addon .delete-image input:focus+label{border:0;box-shadow:none}.adminhtml-test-index .col-id{width:35px}.adminhtml-test-index .col-status{white-space:normal;width:75px}.adminhtml-test-index .col-websites{white-space:nowrap;width:200px}.adminhtml-test-index .col-price .label{display:inline-block;min-width:60px;white-space:nowrap}.adminhtml-test-index .col-price .price-excl-tax .price,.adminhtml-test-index .col-price .price-incl-tax .price{font-weight:bold}.invitee_information,.inviter_information{width:48.9362%}.invitee_information{float:left}.inviter_information{float:right}.test_information .data-table th,.invitee_information .data-table th,.inviter_information .data-table th{width:20%;white-space:nowrap}.test_information .data-table textarea,.test_information .data-table input{width:100%}.tests-history ul{margin:0;padding-left:25px}.tests-history ul .status:before{display:inline-block;content:"|";margin:0 10px}.adminhtml-report-test-order .col-period{white-space:nowrap;width:70px}.adminhtml-report-test-order .col-inv-sent,.adminhtml-report-test-order .col-inv-acc,.adminhtml-report-test-order .col-acc,.adminhtml-report-test-order .col-rate{text-align:right;width:23%}.adminhtml-report-test-customer .col-id{width:35px}.adminhtml-report-test-customer .col-period{white-space:nowrap;width:70px}.adminhtml-report-test-customer .col-inv-sent,.adminhtml-report-test-customer .col-inv-acc{text-align:right;width:120px}.adminhtml-report-test-index .col-period{white-space:nowrap}.adminhtml-report-test-index .col-inv-sent,.adminhtml-report-test-index .col-inv-acc,.adminhtml-report-test-index .col-inv-disc,.adminhtml-report-test-index .col-inv-acc-rate,.adminhtml-report-test-index .col-inv-disc-rate{text-align:right;width:19%}.test_information .data-table,.invitee_information .data-table,.inviter_information .data-table{width:100%}.test_information .data-table tbody tr th,.invitee_information .data-table tbody tr th,.inviter_information .data-table tbody tr th{font-weight:bold}.test_information .data-table tbody tr td,.test_information .data-table tbody tr th,.invitee_information .data-table tbody tr td,.invitee_information .data-table tbody tr th,.inviter_information .data-table tbody tr td,.inviter_information .data-table tbody tr th{background-color:#fff;border:0;padding:9px 10px 10px;color:#666;vertical-align:top}.test_information .data-table tbody tr:nth-child(2n+1) td,.test_information .data-table tbody tr:nth-child(2n+1) th,.invitee_information .data-table tbody tr:nth-child(2n+1) td,.invitee_information .data-table tbody tr:nth-child(2n+1) th,.inviter_information .data-table tbody tr:nth-child(2n+1) td,.inviter_information .data-table tbody tr:nth-child(2n+1) th{background-color:#fbfaf6}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table .col-sort-order{width:80px}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td,[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td{vertical-align:top}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td select,[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td select{display:block;width:100%}[class^=" adminhtml-test-"] .fieldset-wrapper-content .data-table td .input-radio.global-scope,[class^=" adminhtml-test-"] .fieldset-wrapper-content .accordion .config .data-table td .input-radio.global-scope{margin-top:9px}.sales-order-create-index .ui-dialog .content>.test .field.text .input-text{width:100%}.sales-order-create-index .ui-dialog .content>.test .note .price{font-weight:600}.sales-order-create-index .ui-dialog .content>.test .note .price:before{content:": "}.sales-order-create-index .ui-dialog .content>.test .fixed.amount .label:after{content:": "}.sales-order-create-index .ui-dialog .content>.test .fixed.amount .control{display:inline-block;font-weight:600}.sales-order-create-index .ui-dialog .content>.test .fixed.amount .control .control-value{margin:-2px 0 0;padding:0}.eq-ie9 [class^=" adminhtml-test-"] .custom-options .data-table{word-wrap:normal;table-layout:auto}.rma-items .col-actions a.disabled,.newRma .col-actions a.disabled{cursor:default;opacity:.5}.rma-items .col-actions a.disabled:hover,.newRma .col-actions a.disabled:hover{text-decoration:none}.block.mselect-list .mselect-input{width:100%}.block.mselect-list .mselect-input-container .mselect-save{top:4px}.block.mselect-list .mselect-input-container .mselect-cancel{top:4px}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body,html{height:100%;min-height:100%}body{color:#676056;font-family:'Open Sans',sans-serif;line-height:1.33;font-weight:400;font-size:1.4rem;background:#f2ebde;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}body>*{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-basis:auto;flex-basis:auto}.page-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:100%;width:100%;max-width:100%;min-width:990px}.page-wrapper>*{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-basis:auto;flex-basis:auto}.page-header{text-align:right}.page-header-wrapper{background-color:#31302b}.page-header:after{content:"";display:table;clear:both}.page-header .logo{margin-top:5px;float:left;text-decoration:none;display:inline-block}.page-header .logo:before{content:"";display:inline-block;vertical-align:middle;width:109px;height:35px;background-image:url("../images/logo.svg");background-size:109px 70px;background-repeat:no-repeat}.page-header .logo:after{display:inline-block;vertical-align:middle;margin-left:10px;content:attr(data-edition);font-weight:600;font-size:16px;color:#ef672f;margin-top:-2px}.page-header .logo span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.page-header .logo span.focusable:active,.page-header .logo span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.page-header .logo span.focusable:active,.page-header .logo span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.page-header .dropdown-menu{border:0}.admin-user{display:inline-block;vertical-align:top;position:relative;text-align:left}.admin-user-account{text-decoration:none;display:inline-block;padding:12px 14px;color:#f2ebde}.admin-user-account:after{font-family:"MUI-Icons";content:"\e02c";font-size:13px;line-height:13px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:-3px 0 0}.admin-user-account:link,.admin-user-account:visited{color:#f2ebde}.admin-user-account:focus,.admin-user-account:active,.admin-user-account:hover{color:#f2ebde;text-decoration:none}.active .admin-user-account{background-color:#FFF;color:#676056}.admin-user-menu{padding:15px;white-space:nowrap;margin-top:0}.admin-user-menu li{border:0;padding:0}.admin-user-menu li:hover{background:transparent}.admin-user-menu a{display:block;color:#676056;font-size:13px;font-weight:400;line-height:1.385;padding:3px 12px 3px;text-decoration:none}.admin-user-menu a:focus,.admin-user-menu a:hover{text-decoration:underline}.admin-user-menu a:hover{color:#fff;background:#989287;text-decoration:none}.admin-user-menu a span:before{content:"("}.admin-user-menu a span:after{content:")"}.page-actions.fixed .page-actions-buttons{padding-right:15px}.page-main-actions{background:#e0dace;color:#645d53;padding:15px;margin-left:auto;margin-right:auto;box-sizing:border-box}.page-main-actions:before,.page-main-actions:after{content:"";display:table}.page-main-actions:after{clear:both}.page-main-actions:before,.page-main-actions:after{content:"";display:table}.page-main-actions:after{clear:both}.page-main-actions .page-actions{float:right}.page-main-actions .page-actions .page-actions-buttons{float:right;display:-webkit-flex;display:-ms-flexbox;display:flex;justify-content:flex-end}.page-main-actions .page-actions button,.page-main-actions .page-actions .action-add.mselect-button-add{margin-left:13px}.page-main-actions .page-actions button.primary,.page-main-actions .page-actions .action-add.mselect-button-add.primary{float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-main-actions .page-actions button.save:not(.primary),.page-main-actions .page-actions .action-add.mselect-button-add.save:not(.primary){float:right;-ms-flex-order:1;-webkit-order:1;order:1}.page-main-actions .page-actions button.back,.page-main-actions .page-actions button.action-back,.page-main-actions .page-actions button.delete,.page-main-actions .page-actions .action-add.mselect-button-add.back,.page-main-actions .page-actions .action-add.mselect-button-add.action-back,.page-main-actions .page-actions .action-add.mselect-button-add.delete{background-image:none;background:none;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;margin:0 13px}.page-main-actions .page-actions button.back:focus,.page-main-actions .page-actions button.action-back:focus,.page-main-actions .page-actions button.delete:focus,.page-main-actions .page-actions button.back:active,.page-main-actions .page-actions button.action-back:active,.page-main-actions .page-actions button.delete:active,.page-main-actions .page-actions .action-add.mselect-button-add.back:focus,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:focus,.page-main-actions .page-actions .action-add.mselect-button-add.delete:focus,.page-main-actions .page-actions .action-add.mselect-button-add.back:active,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:active,.page-main-actions .page-actions .action-add.mselect-button-add.delete:active{background:none;border:0}.page-main-actions .page-actions button.back:hover,.page-main-actions .page-actions button.action-back:hover,.page-main-actions .page-actions button.delete:hover,.page-main-actions .page-actions .action-add.mselect-button-add.back:hover,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:hover,.page-main-actions .page-actions .action-add.mselect-button-add.delete:hover{background:none;border:0}.page-main-actions .page-actions button.back.disabled,.page-main-actions .page-actions button.action-back.disabled,.page-main-actions .page-actions button.delete.disabled,.page-main-actions .page-actions button.back[disabled],.page-main-actions .page-actions button.action-back[disabled],.page-main-actions .page-actions button.delete[disabled],fieldset[disabled] .page-main-actions .page-actions button.back,fieldset[disabled] .page-main-actions .page-actions button.action-back,fieldset[disabled] .page-main-actions .page-actions button.delete,.page-main-actions .page-actions .action-add.mselect-button-add.back.disabled,.page-main-actions .page-actions .action-add.mselect-button-add.action-back.disabled,.page-main-actions .page-actions .action-add.mselect-button-add.delete.disabled,.page-main-actions .page-actions .action-add.mselect-button-add.back[disabled],.page-main-actions .page-actions .action-add.mselect-button-add.action-back[disabled],.page-main-actions .page-actions .action-add.mselect-button-add.delete[disabled],fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.back,fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.action-back,fieldset[disabled] .page-main-actions .page-actions .action-add.mselect-button-add.delete{cursor:not-allowed;pointer-events:none;opacity:.5}.ie .page-main-actions .page-actions button.back,.ie .page-main-actions .page-actions button.action-back,.ie .page-main-actions .page-actions button.delete,.ie .page-main-actions .page-actions .action-add.mselect-button-add.back,.ie .page-main-actions .page-actions .action-add.mselect-button-add.action-back,.ie .page-main-actions .page-actions .action-add.mselect-button-add.delete{margin-top:6px}.page-main-actions .page-actions button.delete,.page-main-actions .page-actions .action-add.mselect-button-add.delete{color:#e22626;float:left;-ms-flex-order:-1;-webkit-order:-1;order:-1}.page-main-actions .page-actions button.back,.page-main-actions .page-actions button.action-back,.page-main-actions .page-actions .action-add.mselect-button-add.back,.page-main-actions .page-actions .action-add.mselect-button-add.action-back{float:left;-ms-flex-order:-1;-webkit-order:-1;order:-1;display:inline-block;text-decoration:none}.page-main-actions .page-actions button.back:before,.page-main-actions .page-actions button.action-back:before,.page-main-actions .page-actions .action-add.mselect-button-add.back:before,.page-main-actions .page-actions .action-add.mselect-button-add.action-back:before{font-family:'icons-blank-theme';content:'\e625';font-size:inherit;line-height:normal;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:0 2px 0 0}.page-main-actions .page-actions .actions-split{margin-left:13px;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-main-actions .page-actions .actions-split button.primary,.page-main-actions .page-actions .actions-split .action-add.mselect-button-add.primary{float:left}.page-main-actions .page-actions .actions-split .dropdown-menu{text-align:left}.page-main-actions .page-actions .actions-split .dropdown-menu .item{display:block}.page-main-actions .page-actions.fixed{position:fixed;top:0;left:0;right:0;z-index:10;padding:0;background:-webkit-linear-gradient(top,#f5f2ed 0,#f5f2ed 56%,rgba(245,242,237,0) 100%);background:-ms-linear-gradient(top,#f5f2ed 0,#f5f2ed 56%,rgba(245,242,237,0) 100%);background:linear-gradient(to bottom,#f5f2ed 0,#f5f2ed 56%,rgba(245,242,237,0) 100%);background:#e0dace}.page-main-actions .page-actions.fixed .page-actions-inner{position:relative;padding-top:15px;padding-bottom:15px;min-height:36px;text-align:right;box-sizing:border-box}.page-main-actions .page-actions.fixed .page-actions-inner:before,.page-main-actions .page-actions.fixed .page-actions-inner:after{content:"";display:table}.page-main-actions .page-actions.fixed .page-actions-inner:after{clear:both}.page-main-actions .page-actions.fixed .page-actions-inner:before,.page-main-actions .page-actions.fixed .page-actions-inner:after{content:"";display:table}.page-main-actions .page-actions.fixed .page-actions-inner:after{clear:both}.page-main-actions .page-actions.fixed .page-actions-inner:before{text-align:left;content:attr(data-title);float:left;font-size:20px;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lt-ie10 .page-main-actions .page-actions.fixed .page-actions-inner{background:#f5f2ed}.page-main-actions .store-switcher{margin-top:5px}.store-switcher{display:inline-block;font-size:13px}.store-switcher .label{margin-right:5px}.store-switcher .actions.dropdown{display:inline-block;position:relative}.store-switcher .actions.dropdown:before,.store-switcher .actions.dropdown:after{content:"";display:table}.store-switcher .actions.dropdown:after{clear:both}.store-switcher .actions.dropdown:before,.store-switcher .actions.dropdown:after{content:"";display:table}.store-switcher .actions.dropdown:after{clear:both}.store-switcher .actions.dropdown .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.store-switcher .actions.dropdown .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:20px;color:#645d53;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.store-switcher .actions.dropdown .action.toggle:hover:after{color:#645d53}.store-switcher .actions.dropdown .action.toggle:active:after{color:#645d53}.store-switcher .actions.dropdown .action.toggle.active{display:inline-block;text-decoration:none}.store-switcher .actions.dropdown .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:20px;color:#645d53;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.store-switcher .actions.dropdown .action.toggle.active:hover:after{color:#645d53}.store-switcher .actions.dropdown .action.toggle.active:active:after{color:#645d53}.store-switcher .actions.dropdown .dropdown-menu{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px #ada89e solid;position:absolute;z-index:100;top:100%;min-width:195px;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.store-switcher .actions.dropdown .dropdown-menu li{margin:0;padding:0}.store-switcher .actions.dropdown .dropdown-menu li:hover{background:transparent;cursor:pointer}.store-switcher .actions.dropdown.active{overflow:visible}.store-switcher .actions.dropdown.active .dropdown-menu{display:block}.store-switcher .actions.dropdown .action.toggle{background-image:none;background:none;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;color:#026294;line-height:normal;margin-top:2px;vertical-align:middle}.store-switcher .actions.dropdown .action.toggle:focus,.store-switcher .actions.dropdown .action.toggle:active{background:none;border:0}.store-switcher .actions.dropdown .action.toggle:hover{background:none;border:0}.store-switcher .actions.dropdown .action.toggle.disabled,.store-switcher .actions.dropdown .action.toggle[disabled],fieldset[disabled] .store-switcher .actions.dropdown .action.toggle{cursor:not-allowed;pointer-events:none;opacity:.5}.store-switcher .actions.dropdown ul.dropdown-menu{margin-top:4px;padding-top:5px;left:0}.store-switcher .actions.dropdown ul.dropdown-menu li{border:0;cursor:default}.store-switcher .actions.dropdown ul.dropdown-menu li:hover{cursor:default}.store-switcher .actions.dropdown ul.dropdown-menu li a,.store-switcher .actions.dropdown ul.dropdown-menu li span{padding:5px 13px;display:block;color:#645d53}.store-switcher .actions.dropdown ul.dropdown-menu li a{text-decoration:none}.store-switcher .actions.dropdown ul.dropdown-menu li a:hover{background:#edf9fb}.store-switcher .actions.dropdown ul.dropdown-menu li span{color:#ababab;cursor:default}.store-switcher .actions.dropdown ul.dropdown-menu li.current span{color:#645d53;background:#eee}.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store a,.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store span{padding-left:26px}.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store-view a,.store-switcher .actions.dropdown ul.dropdown-menu .store-switcher-store-view span{padding-left:39px}.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar{border-top:1px #ededed solid;margin-top:10px}.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar a{display:inline-block;text-decoration:none;display:block}.store-switcher .actions.dropdown ul.dropdown-menu .dropdown-toolbar a:before{font-family:'icons-blank-theme';content:'\e606';font-size:20px;line-height:normal;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:text-top;text-align:center;margin:0 3px 0 -4px}.tooltip{display:inline-block;margin-left:5px}.tooltip .help span,.tooltip .help a{width:16px;height:16px;text-align:center;background:rgba(194,186,169,.5);cursor:pointer;border-radius:10px;vertical-align:middle;display:inline-block;text-decoration:none}.tooltip .help span:hover,.tooltip .help a:hover{background:#c2baa9}.tooltip .help span>span,.tooltip .help a>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.tooltip .help span>span.focusable:active,.tooltip .help a>span.focusable:active,.tooltip .help span>span.focusable:focus,.tooltip .help a>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.tooltip .help span>span.focusable:active,.tooltip .help a>span.focusable:active,.tooltip .help span>span.focusable:focus,.tooltip .help a>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.tooltip .help span:before,.tooltip .help a:before{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;content:'?';font-size:13px;line-height:16px;color:#5a534a;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center}.tooltip .help span:before,.tooltip .help a:before{font-weight:700}.tooltip .tooltip-content{display:none;position:absolute;max-width:200px;margin-top:10px;margin-left:-19px;padding:4px 8px;border-radius:3px;background:#000;background:rgba(49,48,43,.8);color:#fff;text-shadow:none;z-index:20}.tooltip .tooltip-content:before{content:'';position:absolute;width:0;height:0;top:-5px;left:20px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000;opacity:.8}.tooltip .tooltip-content.loading{position:absolute}.tooltip .tooltip-content.loading:before{border-bottom-color:rgba(0,0,0,.3)}.tooltip:hover>.tooltip-content{display:block}button,.action-add.mselect-button-add{border-radius:2px;background-image:none;background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:0;vertical-align:middle}button:focus,button:active,.action-add.mselect-button-add:focus,.action-add.mselect-button-add:active{background:#cac3b4;border:1px solid #989287}button:hover,.action-add.mselect-button-add:hover{background:#cac3b4}button.disabled,button[disabled],fieldset[disabled] button,.action-add.mselect-button-add.disabled,.action-add.mselect-button-add[disabled],fieldset[disabled] .action-add.mselect-button-add{cursor:default;pointer-events:none;opacity:.5}button.primary,.action-add.mselect-button-add.primary{background-image:none;background:#007dbd;padding:6px 13px;color:#fff;border:1px solid #0a6c9f;cursor:pointer;display:inline-block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;box-sizing:border-box;vertical-align:middle}button.primary:focus,button.primary:active,.action-add.mselect-button-add.primary:focus,.action-add.mselect-button-add.primary:active{background:#026294;border:1px solid #004c74;color:#fff}button.primary:hover,.action-add.mselect-button-add.primary:hover{background:#026294;border:1px solid #026294}button.primary.disabled,button.primary[disabled],fieldset[disabled] button.primary,.action-add.mselect-button-add.primary.disabled,.action-add.mselect-button-add.primary[disabled],fieldset[disabled] .action-add.mselect-button-add.primary{cursor:default;pointer-events:none;opacity:.5}.actions-split{display:inline-block;position:relative;vertical-align:middle}.actions-split button,.actions-split .action-add.mselect-button-add{margin-left:0 !important}.actions-split:before,.actions-split:after{content:"";display:table}.actions-split:after{clear:both}.actions-split:before,.actions-split:after{content:"";display:table}.actions-split:after{clear:both}.actions-split .action-default{float:left;margin:0}.actions-split .action-toggle{float:right;margin:0}.actions-split button.action-default,.actions-split .action-add.mselect-button-add.action-default{border-top-right-radius:0;border-bottom-right-radius:0}.actions-split button+.action-toggle,.actions-split .action-add.mselect-button-add+.action-toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.actions-split .action-toggle{padding:6px 5px;display:inline-block;text-decoration:none}.actions-split .action-toggle>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.actions-split .action-toggle>span.focusable:active,.actions-split .action-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle>span.focusable:active,.actions-split .action-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.actions-split .action-toggle:hover:after{color:inherit}.actions-split .action-toggle:active:after{color:inherit}.actions-split .action-toggle.active{display:inline-block;text-decoration:none}.actions-split .action-toggle.active>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.actions-split .action-toggle.active>span.focusable:active,.actions-split .action-toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle.active>span.focusable:active,.actions-split .action-toggle.active>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.actions-split .action-toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:14px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.actions-split .action-toggle.active:hover:after{color:inherit}.actions-split .action-toggle.active:active:after{color:inherit}.actions-split .dropdown-menu{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:175px;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.actions-split .dropdown-menu li{margin:0;padding:3px 5px}.actions-split .dropdown-menu li:hover{background:#e8e8e8;cursor:pointer}.actions-split .dropdown-menu:before,.actions-split .dropdown-menu:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.actions-split .dropdown-menu:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.actions-split .dropdown-menu:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.actions-split .dropdown-menu:before{top:-12px;right:10px}.actions-split .dropdown-menu:after{top:-14px;right:9px}.actions-split.active{overflow:visible}.actions-split.active .dropdown-menu{display:block}.actions-split .action-toggle:after{height:13px}.page-content:after{content:"";display:table;clear:both}.page-wrapper>.page-content{margin-bottom:20px}.page-footer{padding:15px 0}.page-footer-wrapper{background-color:#e0dacf;margin-top:auto}.page-footer:after{content:"";display:table;clear:both}.footer-legal{float:right;width:550px}.footer-legal .link-report,.footer-legal .magento-version,.footer-legal .copyright{font-size:13px}.footer-legal:before{content:"";display:inline-block;vertical-align:middle;position:absolute;z-index:1;margin-top:2px;margin-left:-35px;width:30px;height:35px;background-size:109px 70px;background:url("../images/logo.svg") no-repeat 0 -21px}.icon-error{margin-left:15px;color:#c00815;font-size:11px}.icon-error:before{font-family:'MUI-Icons';content:"\e086";font-size:13px;line-height:13px;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:-1px 5px 0 0}.ui-widget-overlay{position:fixed}.control .nested{padding:0}.control *:first-child{margin-bottom:0}.field-tooltip{display:inline-block;vertical-align:top;margin-top:5px;position:relative;z-index:1;width:0;overflow:visible}.field-choice .field-tooltip{margin-top:10px}.field-tooltip:hover{z-index:99}.field-tooltip-action{position:relative;z-index:2;margin-left:18px;width:22px;height:22px;display:inline-block;cursor:pointer}.field-tooltip-action:before{content:"?";font-weight:500;font-size:18px;display:inline-block;overflow:hidden;height:22px;border-radius:11px;line-height:22px;width:22px;text-align:center;color:#fff;background-color:#514943}.field-tooltip-action span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.field-tooltip-action span.focusable:active,.field-tooltip-action span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.field-tooltip-action span.focusable:active,.field-tooltip-action span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.control-text:focus+.field-tooltip-content,.field-tooltip:hover .field-tooltip-content{display:block}.field-tooltip-content{display:none;position:absolute;z-index:1;width:320px;background:#fff8d7;padding:15px 25px;right:-66px;border:1px solid #adadad;border-radius:1px;bottom:42px;box-shadow:0 2px 8px 0 rgba(0,0,0,.3)}.field-tooltip-content:after,.field-tooltip-content:before{content:"";display:block;width:0;height:0;border:16px solid transparent;border-top-color:#adadad;position:absolute;right:20px;top:100%;z-index:3}.field-tooltip-content:after{border-top-color:#fff8d7;margin-top:-1px;z-index:4}.form__field.field-error .control [class*="control-"]{border-color:#e22626}.form__field.field-error .control [class*="control-"]:before{border-color:#e22626}.form__field .mage-error{border:1px solid #e22626;display:block;margin:2px 0 0;padding:6px 10px 10px;background:#fff8d6;color:#555;font-size:12px;font-weight:500;box-sizing:border-box;max-width:380px}.no-flexbox.no-flexboxlegacy .form__field .control-addon+.mage-error{display:inline-block;width:100%}.form__field{position:relative;z-index:1}.form__field:hover{z-index:2}.control .form__field{position:static}.form__field[data-config-scope]:before{content:attr(data-config-scope);display:inline-block;position:absolute;color:gray;right:0;top:6px}.control .form__field[data-config-scope]:nth-child(n+2):before{content:""}.form__field.field-disabled>.label{color:#999}.form__field.field-disabled.field .control [class*="control-"][disabled]{background-color:#e9e9e9;opacity:.5;color:#303030;border-color:#adadad}.control-fields .label~.control{width:100%}.form__field{border:0;padding:0}.form__field .note{color:#303030;padding:0;margin:10px 0 0;max-width:380px}.form__field .note:before{display:none}.form__field.form__field{margin-bottom:0}.form__field.form__field+.form__field.form__field{margin-top:15px}.form__field.form__field:not(.choice)~.choice{margin-left:20px;margin-top:5px}.form__field.form__field.choice~.choice{margin-top:9px}.form__field.form__field~.choice:last-child{margin-bottom:8px}.fieldset>.form__field{margin-bottom:30px}.form__field .label{color:#303030}.form__field:not(.choice)>.label{font-size:14px;font-weight:600;width:30%;padding-right:30px;padding-top:0;line-height:33px;white-space:nowrap}.form__field:not(.choice)>.label:before{content:".";visibility:hidden;width:0;margin-left:-7px;overflow:hidden}.form__field:not(.choice)>.label span{white-space:normal;display:inline-block;vertical-align:middle;line-height:1.2}.form__field.required>.label:after{content:"";margin-left:0}.form__field.required>.label span:after{content:"*";color:#eb5202;display:inline;font-weight:500;font-size:16px;margin-top:2px;position:absolute;z-index:1;margin-left:10px}.form__field .control-file{margin-top:6px}.form__field .control-select{line-height:33px}.form__field .control-select:not([multiple]),.form__field .control-text{height:33px;max-width:380px}.form__field .control-addon{max-width:380px}.form__field .control-textarea,.form__field .control-select,.form__field .control-text{border:1px solid #adadad;border-radius:1px;padding:0 10px;color:#303030;background-color:#fff;font-weight:500;font-size:15px;min-width:11em}.form__field .control-textarea:focus,.form__field .control-select:focus,.form__field .control-text:focus{outline:0;border-color:#007bdb;box-shadow:none}.form__field .control-text{line-height:auto}.form__field .control-textarea{padding-top:6px;padding-bottom:6px;line-height:1.18em}.form__field .control-select[multiple],.form__field .control-textarea{width:100%;height:calc(6*1.2em + 14px)}.form__field .control-value{display:inline-block;padding:6px 10px}.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:active,.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:active,.form__field .control-fields .form__field:nth-child(n+2):not(.choice)>.label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field .control-select{padding:0}.form__field .control-select option{box-sizing:border-box;padding:4px 10px;display:block}.form__field .control-select optgroup{font-weight:600;display:block;padding:4px 10px;line-height:33px;list-style:inside;font-style:normal}.form__field .control-range>.form__field:nth-child(2):before{content:"\2014";content:":";display:inline-block;margin-left:-25px;float:left;width:20px;line-height:33px;text-align:center}.form__field.choice{position:relative;z-index:1;padding-top:8px;padding-left:26px;padding-right:0}.form__field.choice .label{font-weight:500;padding:0;display:inline;float:none;line-height:18px}.form__field.choice input{position:absolute;top:8px;margin-top:3px !important}.form__field.choice input[disabled]+.label{opacity:.5;cursor:not-allowed}.control>.form__field.choice{max-width:380px}.control>.form__field.choice:nth-child(1):nth-last-child(2),.control>.form__field.choice:nth-child(2):nth-last-child(1){display:inline-block}.control>.form__field.choice:nth-child(1):nth-last-child(2)+.choice,.control>.form__field.choice:nth-child(2):nth-last-child(1)+.choice{margin-left:41px;margin-top:0}.control>.form__field.choice:nth-child(1):nth-last-child(2)+.choice:before,.control>.form__field.choice:nth-child(2):nth-last-child(1)+.choice:before{content:"";position:absolute;display:inline-block;height:20px;top:8px;left:-20px;width:1px;background:#ccc}.form__field.choice .label{cursor:pointer}.form__field.choice .label:before{content:"";position:absolute;z-index:1;border:1px solid #adadad;width:14px;height:14px;top:10px;left:0;border-radius:2px;background:url("../Magento_Ui/images/choice_bkg.png") no-repeat -100% -100%}.form__field.choice input:focus+.label:before{outline:0;border-color:#007bdb}.form__field.choice .control-radio+.label:before{border-radius:8px}.form__field.choice .control-radio:checked+.label:before{background-position:-26px -1px}.form__field.choice .control-checkbox:checked+.label:before{background-position:-1px -1px}.form__field.choice input{opacity:0}.fieldset>.form__field.choice{margin-left:30%}.form__field .control-after,.form__field .control-before{border:0;color:#858585;font-weight:300;font-size:15px;line-height:33px;display:inline-block;height:33px;box-sizing:border-box;padding:0 3px}.no-flexbox.no-flexboxlegacy .form__field .control-before,.no-flexbox.no-flexboxlegacy .form__field .control-addon{float:left;white-space:nowrap}.form__field .control-addon{display:inline-flex;max-width:380px;width:100%;flex-flow:row nowrap;position:relative;z-index:1}.form__field .control-addon>*{position:relative;z-index:1}.form__field .control-addon .control-text[disabled][type],.form__field .control-addon .control-select[disabled][type],.form__field .control-addon .control-select,.form__field .control-addon .control-text{background:transparent !important;border:0;width:auto;vertical-align:top;order:1;flex:1}.form__field .control-addon .control-text[disabled][type]:focus,.form__field .control-addon .control-select[disabled][type]:focus,.form__field .control-addon .control-select:focus,.form__field .control-addon .control-text:focus{box-shadow:none}.form__field .control-addon .control-text[disabled][type]:focus+label:before,.form__field .control-addon .control-select[disabled][type]:focus+label:before,.form__field .control-addon .control-select:focus+label:before,.form__field .control-addon .control-text:focus+label:before{outline:0;border-color:#007bdb}.form__field .control-addon .control-text[disabled][type]+label,.form__field .control-addon .control-select[disabled][type]+label,.form__field .control-addon .control-select+label,.form__field .control-addon .control-text+label{padding-left:10px;position:static !important;z-index:0}.form__field .control-addon .control-text[disabled][type]+label>*,.form__field .control-addon .control-select[disabled][type]+label>*,.form__field .control-addon .control-select+label>*,.form__field .control-addon .control-text+label>*{vertical-align:top;position:relative;z-index:2}.form__field .control-addon .control-text[disabled][type]+label:before,.form__field .control-addon .control-select[disabled][type]+label:before,.form__field .control-addon .control-select+label:before,.form__field .control-addon .control-text+label:before{box-sizing:border-box;border-radius:1px;border:1px solid #adadad;content:"";display:block;position:absolute;top:0;left:0;width:100%;height:100%;z-index:0;background:#fff}.form__field .control-addon .control-text[disabled][type][disabled]+label:before,.form__field .control-addon .control-select[disabled][type][disabled]+label:before,.form__field .control-addon .control-select[disabled]+label:before,.form__field .control-addon .control-text[disabled]+label:before{opacity:.5;background:#e9e9e9}.form__field .control-after{order:3}.form__field .control-after:last-child{padding-right:10px}.form__field .control-before{order:0}.form__field .control-some{display:flex}.form__field [class*="control-grouped"]{display:table;width:100%;table-layout:fixed;box-sizing:border-box}.form__field [class*="control-grouped"]>.form__field{display:table-cell;width:50%;vertical-align:top}.form__field [class*="control-grouped"]>.form__field>.control{width:100%;float:none}.form__field [class*="control-grouped"]>.form__field:nth-child(n+2){padding-left:20px}.form__field [class*="control-grouped"]>.form__field:nth-child(n+2):not(.choice) .label{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form__field [class*="control-grouped"]>.form__field:nth-child(n+2):not(.choice) .label.focusable:active,.form__field [class*="control-grouped"]>.form__field:nth-child(n+2):not(.choice) .label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field [class*="control-grouped"]>.form__field:nth-child(n+2):not(.choice) .label.focusable:active,.form__field [class*="control-grouped"]>.form__field:nth-child(n+2):not(.choice) .label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.form__field [required]{box-shadow:none}fieldset.form__field{position:relative}fieldset.form__field [class*="control-grouped"]>.form__field:first-child>.label,fieldset.form__field .control-fields>.form__field:first-child>.label{position:absolute;left:0;top:0;opacity:0;cursor:pointer;width:30%}.control-text+.ui-datepicker-trigger{background-image:none;background:none;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;line-height:inherit;font-weight:400;text-decoration:none;margin-left:-40px;display:inline-block}.control-text+.ui-datepicker-trigger img{display:none}.control-text+.ui-datepicker-trigger:focus,.control-text+.ui-datepicker-trigger:active{background:none;border:0}.control-text+.ui-datepicker-trigger:hover{background:none;border:0}.control-text+.ui-datepicker-trigger.disabled,.control-text+.ui-datepicker-trigger[disabled],fieldset[disabled] .control-text+.ui-datepicker-trigger{cursor:not-allowed;pointer-events:none;opacity:.5}.control-text+.ui-datepicker-trigger>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.control-text+.ui-datepicker-trigger>span.focusable:active,.control-text+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.control-text+.ui-datepicker-trigger>span.focusable:active,.control-text+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.control-text+.ui-datepicker-trigger:after{font-family:'icons-blank-theme';content:'\e612';font-size:38px;line-height:33px;color:#514943;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}[class*="tab-nav-item"]:not(ul):active,[class*="tab-nav-item"]:not(ul):focus{box-shadow:none;outline:0}.customer-index-edit .col-2-left-layout,.customer-index-edit .col-1-layout{background:#fff}.customer-index-edit{background:#fff}.customer-index-edit .col-2-left-layout{background:#fff}.customer-index-edit .main-col{padding-left:40px}.customer-index-edit .page-main-actions{background:transparent}.tab-nav.block{margin-bottom:40px}.tab-nav.block:first-child{margin-top:16px}.tab-nav.block .block-title{padding:7px 20px}.tab-nav-items{padding:0;border:1px solid #d3d3d3;box-shadow:0 0 4px rgba(50,50,50,.35);margin:0 0 40px;background:#f7f7f7}.tab-nav-item{padding:0;list-style-type:none;border-bottom:1px solid #e0e0e0;position:relative;margin:0 15px;z-index:1}.tab-nav-item:last-child{border-bottom:0}.tab-nav-item.ui-state-active{z-index:2;background:#FFF;padding:1px 14px;border:2px solid #eb5202;margin:-1px}.tab-nav-item.ui-state-active .tab-nav-item-link{padding:13px 15px 13px;color:#eb5202}.tab-nav-item.ui-tabs-loading{position:relative;z-index:1}.tab-nav-item.ui-tabs-loading:before{content:"";display:block;position:absolute;z-index:2;background:url("../images/loader-2.gif") no-repeat 50% 50%;background-size:120px;width:20px;height:20px;top:13px;left:-10px}.tab-nav-item.ui-tabs-loading.ui-state-active:before{top:12px;left:4px}.tab-nav-item-link{display:block;padding:15px;color:#666;line-height:1}.tab-nav-item-link:focus,.tab-nav-item-link:active,.tab-nav-item-link:hover{outline:0;color:#eb5202;text-decoration:none}.ui-state-active .tab-nav-item-link{color:#666;font-weight:600}.tab-nav-item-link.changed{font-style:italic}.listing-tiles{overflow:hidden;margin-top:-10px;margin-left:-10px}.listing-tiles .listing-tile{background-color:#f2ebde;display:block;width:238px;height:200px;float:left;border:1px solid #676056;margin-top:10px;margin-left:10px;border-radius:4px;text-align:center}.listing-tiles .listing-tile.disabled{border-color:red}.listing-tiles .listing-tile.enabled{border-color:green}.listing .disabled{color:red}.listing .enabled{color:green}.pager{text-align:left;padding-bottom:10px}.pager:before,.pager:after{content:"";display:table}.pager:after{clear:both}.pager:before,.pager:after{content:"";display:table}.pager:after{clear:both}.pager [data-part=left]{display:inline-block;width:45%;float:left;text-align:left}.pager [data-part=right]{display:inline-block;width:45%;text-align:right;float:right;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.pager .action-next{cursor:pointer}.pager .action-previous{cursor:pointer}.pager{text-align:left}.pager [data-part=left]{display:inline-block;width:45%;text-align:left}.pager [data-part=right]{display:inline-block;width:45%;text-align:right;float:right}.grid .col-title{min-width:90px;text-align:center}.grid-actions [data-part=search]{display:inline-block;margin:0 30px}.grid-actions [data-part=search] input[type=text]{vertical-align:bottom;width:460px}.grid .actions-split .dropdown-menu{right:auto;left:auto;text-align:left;color:#676056;font-weight:normal}.grid .actions-split .dropdown-menu:after{right:auto;left:9px}.grid .actions-split .dropdown-menu:before{right:auto;left:10px}.grid .grid-actions{padding:10px 0}.grid .hor-scroll{padding-top:10px}.grid .select-box{display:inline-block;vertical-align:top;margin:-12px -10px -7px;padding:12px 10px 7px;width:100%}.filters-toggle{background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:none;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}.filters-toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:30px;line-height:15px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.filters-toggle:hover:after{color:inherit}.filters-toggle:active:after{color:inherit}.filters-toggle:focus,.filters-toggle:active{background:#cac3b4;border:1px solid #989287}.filters-toggle:hover{background:#cac3b4}.filters-toggle.disabled,.filters-toggle[disabled],fieldset[disabled] .filters-toggle{cursor:default;pointer-events:none;opacity:.5}.filters-toggle:focus,.filters-toggle:active{background:none;border:0}.filters-toggle:hover{background:none;border:0}.filters-toggle.disabled,.filters-toggle[disabled],fieldset[disabled] .filters-toggle{cursor:not-allowed;pointer-events:none;opacity:.5}.filters-toggle:after{margin-top:2px;margin-left:-3px}.filters-toggle.active:after{content:'\e618'}.filters-current{padding:10px 0;display:none}.filters-current.active{display:block}.filters-items{margin:0;padding:0;list-style:none none;display:inline}.filters-item{display:inline-block;margin:0 5px 5px 0;padding:2px 2px 2px 4px;border-radius:3px;background:#f7f3eb}.filters-item .item-label{font-weight:600}.filters-item .item-label:after{content:": "}.filters-item .action-remove{background-image:none;background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none;padding:0}.filters-item .action-remove>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.filters-item .action-remove>span.focusable:active,.filters-item .action-remove>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-item .action-remove>span.focusable:active,.filters-item .action-remove>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-item .action-remove:before{font-family:'icons-blank-theme';content:'\e616';font-size:16px;line-height:16px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.filters-item .action-remove:hover:before{color:inherit}.filters-item .action-remove:active:before{color:inherit}.filters-item .action-remove:focus,.filters-item .action-remove:active{background:#cac3b4;border:1px solid #989287}.filters-item .action-remove:hover{background:#cac3b4}.filters-item .action-remove.disabled,.filters-item .action-remove[disabled],fieldset[disabled] .filters-item .action-remove{cursor:default;pointer-events:none;opacity:.5}.filters-form{position:relative;z-index:1;margin:14px 0;background:#fff;border:1px solid #bbb;box-shadow:0 3px 3px rgba(0,0,0,.15)}.filters-form .action-close{position:absolute;top:3px;right:7px;background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:none;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}.filters-form .action-close>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.filters-form .action-close>span.focusable:active,.filters-form .action-close>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-form .action-close>span.focusable:active,.filters-form .action-close>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters-form .action-close:before{font-family:'icons-blank-theme';content:'\e616';font-size:42px;line-height:42px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.filters-form .action-close:hover:before{color:inherit}.filters-form .action-close:active:before{color:inherit}.filters-form .action-close:focus,.filters-form .action-close:active{background:#cac3b4;border:1px solid #989287}.filters-form .action-close:hover{background:#cac3b4}.filters-form .action-close.disabled,.filters-form .action-close[disabled],fieldset[disabled] .filters-form .action-close{cursor:default;pointer-events:none;opacity:.5}.filters-form .action-close:focus,.filters-form .action-close:active{background:none;border:0}.filters-form .action-close:hover{background:none;border:0}.filters-form .action-close.disabled,.filters-form .action-close[disabled],fieldset[disabled] .filters-form .action-close{cursor:not-allowed;pointer-events:none;opacity:.5}.filters-actions{margin:18px;text-align:right}.filters-fieldset{padding-bottom:0}.filters-fieldset .field{border:0;margin:0 0 20px;box-sizing:border-box;display:inline-block;padding:0 12px 0 0;width:33.33333333%;vertical-align:top}.filters-fieldset .field:before,.filters-fieldset .field:after{content:"";display:table}.filters-fieldset .field:after{clear:both}.filters-fieldset .field:before,.filters-fieldset .field:after{content:"";display:table}.filters-fieldset .field:after{clear:both}.filters-fieldset .field.choice:before,.filters-fieldset .field.no-label:before{box-sizing:border-box;content:" ";height:1px;float:left;padding:6px 15px 0 0;width:35%}.filters-fieldset .field .description{box-sizing:border-box;float:left;padding:6px 15px 0 0;text-align:right;width:35%}.filters-fieldset .field:not(.choice)>.label{box-sizing:border-box;float:left;padding:6px 15px 0 0;text-align:right;width:35%}.filters-fieldset .field:not(.choice)>.control{float:left;width:65%}.filters-fieldset .field:last-child{margin-bottom:0}.filters-fieldset .field+.fieldset{clear:both}.filters-fieldset .field>.label{font-weight:700}.filters-fieldset .field>.label+br{display:none}.filters-fieldset .field .choice input{vertical-align:top}.filters-fieldset .field .fields.group:before,.filters-fieldset .field .fields.group:after{content:"";display:table}.filters-fieldset .field .fields.group:after{clear:both}.filters-fieldset .field .fields.group:before,.filters-fieldset .field .fields.group:after{content:"";display:table}.filters-fieldset .field .fields.group:after{clear:both}.filters-fieldset .field .fields.group .field{box-sizing:border-box;float:left}.filters-fieldset .field .fields.group.group-2 .field{width:50% !important}.filters-fieldset .field .fields.group.group-3 .field{width:33.3% !important}.filters-fieldset .field .fields.group.group-4 .field{width:25% !important}.filters-fieldset .field .fields.group.group-5 .field{width:20% !important}.filters-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%}.filters-fieldset .field .addon textarea,.filters-fieldset .field .addon select,.filters-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}.filters-fieldset .field .addon .addbefore,.filters-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:'Open Sans','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}.filters-fieldset .field .addon .addbefore:disabled,.filters-fieldset .field .addon .addafter:disabled{opacity:.5}.filters-fieldset .field .addon .addbefore::-moz-placeholder,.filters-fieldset .field .addon .addafter::-moz-placeholder{color:#c2c2c2}.filters-fieldset .field .addon .addbefore::-webkit-input-placeholder,.filters-fieldset .field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.filters-fieldset .field .addon .addbefore:-ms-input-placeholder,.filters-fieldset .field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.filters-fieldset .field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.filters-fieldset .field .additional{margin-top:10px}.filters-fieldset .field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.filters-fieldset .field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.filters-fieldset .field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.filters-fieldset .field .label{color:#676056;font-size:13px;font-weight:600;margin:0}.filters .field-date .group .hasDatepicker{width:100%;padding-right:30px}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger{background-image:none;background:none;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;line-height:inherit;font-weight:400;text-decoration:none;margin-left:-33px;display:inline-block;width:30px}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger img{display:none}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:focus,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:active{background:none;border:0}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:hover{background:none;border:0}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger.disabled,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger[disabled],fieldset[disabled] .filters .field-date .group .hasDatepicker+.ui-datepicker-trigger{cursor:not-allowed;pointer-events:none;opacity:.5}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:active,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:active,.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.filters .field-date .group .hasDatepicker+.ui-datepicker-trigger:after{font-family:'icons-blank-theme';content:'\e612';font-size:35px;line-height:30px;color:#514943;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.filters .field-range .group .field{margin-bottom:0}.filters .field-range .group .control{width:100%;box-sizing:border-box;padding-right:0;position:relative;z-index:1}.mass-select{position:relative;margin:-6px -10px;padding:6px 2px 6px 10px;z-index:1;white-space:nowrap}.mass-select.active{background:rgba(0,0,0,.2)}.mass-select-toggle{background:#f2ebde;padding:6px 13px;color:#645d53;border:1px solid #ada89e;cursor:pointer;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.3rem;font-weight:500;line-height:1.4rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:none;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}.mass-select-toggle>span{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.mass-select-toggle>span.focusable:active,.mass-select-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.mass-select-toggle>span.focusable:active,.mass-select-toggle>span.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.mass-select-toggle:before{font-family:'icons-blank-theme';content:'\e607';font-size:30px;line-height:15px;color:inherit;overflow:hidden;speak:none;font-weight:normal;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.mass-select-toggle:hover:before{color:inherit}.mass-select-toggle:active:before{color:inherit}.mass-select-toggle:focus,.mass-select-toggle:active{background:#cac3b4;border:1px solid #989287}.mass-select-toggle:hover{background:#cac3b4}.mass-select-toggle.disabled,.mass-select-toggle[disabled],fieldset[disabled] .mass-select-toggle{cursor:default;pointer-events:none;opacity:.5}.mass-select-toggle:focus,.mass-select-toggle:active{background:none;border:0}.mass-select-toggle:hover{background:none;border:0}.mass-select-toggle.disabled,.mass-select-toggle[disabled],fieldset[disabled] .mass-select-toggle{cursor:not-allowed;pointer-events:none;opacity:.5}.mass-select-toggle:before{margin-top:-2px;text-indent:-5px;color:#fff}.mass-select-toggle:hover:before{color:#fff}.mass-select-toggle:active:before,.mass-select-toggle.active:before{content:'\e618'}.mass-select-field{display:inline}.mass-select-menu{display:none;position:absolute;top:100%;left:0;text-align:left;margin:0;padding:0;list-style:none none;background:#fff;border:1px solid #bbb;min-width:175px;box-shadow:0 3px 3px rgba(0,0,0,.15)}.mass-select-menu li{margin:0;padding:4px 15px;border-bottom:1px solid #e5e5e5}.mass-select-menu li:hover{background:#e8e8e8;cursor:pointer}.mass-select-menu span{font-weight:normal;font-size:13px;color:#645d53}.mass-select-menu.active{display:block}.grid-loading-mask{position:absolute;left:0;top:0;right:0;bottom:0;background:rgba(255,255,255,.5);z-index:100}.grid-loading-mask .grid-loader{position:absolute;margin:auto;left:0;top:0;right:0;bottom:0;width:218px;height:149px;background:url('../images/loader-2.gif') 50% 50% no-repeat}.addon input{border-width:1px 0 1px 1px}.addon input~.addafter strong{display:inline-block;background:#fff;line-height:24px;margin:0 3px 0 -2px;padding-left:4px;padding-right:4px;position:relative;font-size:12px;top:0}.addon input:focus~.addafter{border-color:#75b9f0;box-shadow:0 0 8px rgba(82,168,236,.6)}.addon input:focus~.addafter strong{margin-top:0}.addon .addafter{background:none;color:#a6a6a6;border-width:1px 1px 1px 0;border-radius:2px 2px 0 0;padding:0;border-color:#ada89e}.addon .pager input{border-width:1px}.field .control input[type='text'][disabled],.field .control input[type='text'][disabled]~.addafter,.field .control select[disabled],.field .control select[disabled]~.addafter{background-color:#fff;border-color:#eee;box-shadow:none;color:#999}.field .control input[type='text'][disabled]~.addafter strong,.field .control select[disabled]~.addafter strong{background-color:#fff}.field-price.addon{direction:rtl}.field-price.addon>*{direction:ltr}.field-price.addon .addafter{border-width:1px 0 1px 1px;border-radius:2px 0 0 2px}.field-price.addon input:first-child{border-radius:0 2px 2px 0}.field-price input{border-width:1px 1px 1px 0}.field-price input:focus{box-shadow:0 0 8px rgba(82,168,236,.6)}.field-price input:focus~label.addafter{box-shadow:0 0 8px rgba(82,168,236,.6)}.field-price input~label.addafter strong{margin-left:2px;margin-right:-2px}.field-price.addon>input{width:99px;float:left}.field-price .control{position:relative}.field-price label.mage-error{position:absolute;left:0;top:30px}.version-fieldset .grid-actions{border-bottom:1px solid #f2ebde;margin:0 0 15px;padding:0 0 15px}.navigation>ul,.message-system,.page-header,.page-actions.fixed .page-actions-inner,.page-content,.page-footer{width:auto;min-width:960px;max-width:1300px;margin:0 auto;padding-left:15px;padding-right:15px;box-sizing:border-box;width:100%}.pager label.page,.filters .field-range .group .label,.mass-select-field .label{clip:rect(0,0,0,0);border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visually-hidden.focusable:active,.visually-hidden.focusable:focus,.pager label.page.focusable:active,.pager label.page.focusable:focus,.filters .field-range .group .label.focusable:active,.filters .field-range .group .label.focusable:focus,.mass-select-field .label.focusable:active,.mass-select-field .label.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}table th.required:after,.data-table th.required-entry:after,.data-table td.required-entry:after,.grid-actions .filter.required .label span:after,.grid-actions .required:after,.accordion .config .data-table td.required-entry:after{content:'*';color:#e22626;font-weight:normal;margin-left:3px}.grid th.required:after,.grid th .required:after{content:'*';color:#f9d4d4;font-weight:normal;margin-left:3px}.grid td.col-period,.grid td.col-date,.grid td.col-date_to,.grid td.col-date_from,.grid td.col-ended_at,.grid td.col-created_at,.grid td.col-updated_at,.grid td.col-customer_since,.grid td.col-session_start_time,.grid td.col-last_activity,.grid td.col-email,.grid td.col-name,.grid td.col-sku,.grid td.col-firstname,.grid td.col-lastname,.grid td.col-title,.grid td.col-label,.grid td.col-product,.grid td.col-set_name,.grid td.col-websites,.grid td.col-time,.grid td.col-billing_name,.grid td.col-shipping_name,.grid td.col-phone,.grid td.col-type,.product-options .grouped-items-table .col-name,.product-options .grouped-items-table .col-sku,.sales-order-create-index .data-table .col-product,[class^=' adminhtml-rma-'] .fieldset-wrapper .data-table td,[class^=' adminhtml-rma-'] .grid .col-product_sku,[class^=' adminhtml-rma-'] .grid .col-product_name,.col-grid_segment_name,.adminhtml-catalog-event-index .col-category,[class^=' catalog-search'] .col-search_query,[class^=' catalog-search'] .col-synonym_for,[class^=' catalog-search'] .col-redirect,.adminhtml-urlrewrite-index .col-request_path,.adminhtml-cms-page-index .col-title,.adminhtml-cms-page-index .col-identifier,.adminhtml-cms-hierarchy-index .col-title,.adminhtml-cms-hierarchy-index .col-identifier,.col-banner_name,.adminhtml-widget-instance-index .col-title,.reports-index-search .col-query_text,.adminhtml-rma-item-attribute-index .grid .col-attr-code,.adminhtml-system-store-index .grid td,.catalog-product-attribute-index .col-attr-code,.catalog-product-attribute-index .col-label,.adminhtml-export-index .col-code,.adminhtml-logging-index .grid .col-fullaction,.adminhtml-system-variable-index .grid .col-code,.adminhtml-logging-index .grid .col-info,.dashboard-secondary .dashboard-item tr>td:first-child,.ui-tabs-panel .dashboard-data .col-name,.data-table-td-max .data-table td,[class^=' adminhtml-rma-'] .fieldset-wrapper .accordion .config .data-table td,.data-table-td-max .accordion .config .data-table td,.order-account-information .data-table td,[class^=' adminhtml-rma-'] .rma-request-details .data-table td{overflow:hidden;text-overflow:ellipsis}td.col-period,td.col-date,td.col-date_to,td.col-date_from,td.col-ended_at,td.col-created_at,td.col-updated_at,td.col-customer_since,td.col-session_start_time,td.col-time,td.col-sku,td.col-type,[class^=' adminhtml-rma-'] #rma_items_grid_table .headings th,.adminhtml-process-list .col-action a,.adminhtml-process-list .col-mode{white-space:nowrap}table thead tr th:first-child,table tfoot tr th:first-child,table tfoot tr td:first-child{border-left:0}table thead tr th:last-child,table tfoot tr th:last-child,table tfoot tr td:last-child{border-right:0}.form-inline .grid-actions .label,.form-inline .massaction .label{padding:0;width:auto}.grid .col-action,.grid .col-actions,.grid .col-qty,.grid .col-purchases,.catalog-product-edit .ui-tabs-panel .grid .col-price,.catalog-product-edit .ui-tabs-panel .grid .col-position{width:50px}.grid .col-order-number,.grid .col-real_order_id,.grid .col-invoice-number,.grid .col-increment_id,.grid .col-transaction-id,.grid .col-parent-transaction-id,.grid .col-reference_id,.grid .col-status,.grid .col-price,.grid .col-position,.grid .col-base_grand_total,.grid .col-grand_total,.grid .col-sort_order,.grid .col-carts,.grid .col-priority,.grid .col-severity,.sales-order-create-index .col-in_products,[class^=' reports-'] [class^='col-total'],[class^=' reports-'] [class^='col-average'],[class^=' reports-'] [class^='col-ref-'],[class^=' reports-'] [class^='col-rate'],[class^=' reports-'] [class^='col-tax-amount'],[class^=' adminhtml-customer-'] .col-required,.adminhtml-rma-item-attribute-index .col-required,[class^=' adminhtml-customer-'] .col-system,.adminhtml-rma-item-attribute-index .col-system,[class^=' adminhtml-customer-'] .col-is_visible,.adminhtml-rma-item-attribute-index .col-is_visible,[class^=' adminhtml-customer-'] .col-sort_order,.adminhtml-rma-item-attribute-index .col-sort_order,.catalog-product-attribute-index [class^=' col-is_'],.catalog-product-attribute-index .col-required,.catalog-product-attribute-index .col-system,.adminhtml-test-index .col-is_listed,[class^=' tests-report-test'] [class^='col-inv-']{width:70px}.grid .col-phone,.sales-order-view .grid .col-period,.sales-order-create-index .col-phone,[class^=' adminhtml-rma-'] .grid .col-product_sku,.adminhtml-rma-edit .col-product,.adminhtml-rma-edit .col-sku,.catalog-product-edit .ui-tabs-panel .grid .col-name,.catalog-product-edit .ui-tabs-panel .grid .col-type,.catalog-product-edit .ui-tabs-panel .grid .col-sku,.customer-index-index .grid .col-customer_since,.customer-index-index .grid .col-billing_country_id,[class^=' customer-index-'] .fieldset-wrapper .grid .col-created_at,[class^=' customer-index-'] .accordion .grid .col-created_at{max-width:70px;width:70px}.sales-order-view .grid .col-name,.sales-order-create-index .data-table .col-product,[class^=' adminhtml-rma-'] .grid .col-name,[class^=' adminhtml-rma-'] .grid .col-product,[class^=' catalog-search'] .col-search_query,[class^=' catalog-search'] .col-synonym_for,[class^=' catalog-search'] .col-redirect,.adminhtml-urlrewrite-index .col-request_path,.reports-report-shopcart-abandoned .grid .col-name,.tax-rule-index .grid .col-title,.adminhtml-rma-item-attribute-index .grid .col-attr-code,.dashboard-secondary .dashboard-item tr>td:first-child{max-width:150px;width:150px}[class^=' sales-order-'] .grid .col-name,.catalog-category-edit .grid .col-name,.adminhtml-catalog-event-index .col-category,.adminhtml-banner-edit .grid .col-name,.reports-report-product-lowstock .grid .col-sku,.newsletter-problem-index .grid .col-name,.newsletter-problem-index .grid .col-subject,.newsletter-problem-index .grid .col-product,.adminhtml-rma-item-attribute-index .grid .col-label,.adminhtml-export-index .col-label,.adminhtml-export-index .col-code,.adminhtml-scheduled-operation-index .grid .col-name,.adminhtml-logging-index .grid .col-fullaction,.test-report-customer-wishlist-wishlist .grid .col-name,.test-report-customer-wishlist-wishlist .grid .col-subject,.test-report-customer-wishlist-wishlist .grid .col-product{max-width:220px;width:220px}.grid .col-period,.grid .col-date,.grid .col-date_to,.grid .col-date_from,.grid .col-ended_at,.grid .col-created_at,.grid .col-updated_at,.grid .col-customer_since,.grid .col-session_start_time,.grid .col-last_activity,.grid .col-email,.grid .col-items_total,.grid .col-firstname,.grid .col-lastname,.grid .col-status-default,.grid .col-websites,.grid .col-time,.grid .col-billing_name,.grid .col-shipping_name,.sales-order-index .grid .col-name,.product-options .grouped-items-table .col-name,.product-options .grouped-items-table .col-sku,[class^=' sales-order-view'] .grid .col-customer_name,[class^=' adminhtml-rma-'] .grid .col-product_name,.catalog-product-index .grid .col-name,.catalog-product-review-index .grid .col-name,.catalog-product-review-index .grid .col-title,.customer-index-edit .ui-tabs-panel .grid .col-name,.review-product-index .grid .col-name,.adminhtml-cms-page-index .col-title,.adminhtml-cms-page-index .col-identifier,.catalog-product-attribute-index .col-attr-code,.catalog-product-attribute-index .col-label,.adminhtml-logging-index .grid .col-info{max-width:110px;width:110px}.grid .col-name,.grid .col-product,.col-banner_name,.adminhtml-widget-instance-index .col-title,[class^=' adminhtml-customer-'] .col-label,.adminhtml-rma-item-attribute-index .col-label,.adminhtml-system-variable-index .grid .col-code,.ui-tabs-panel .dashboard-data .col-name,.adminhtml-test-index .col-label{max-width:370px;width:370px}.col-grid_segment_name,.reports-index-search .col-query_text{max-width:570px;width:570px}[class^=' adminhtml-rma-'] .fieldset-wrapper .data-table td,.reports-report-product-lowstock .grid .col-name,.reports-report-shopcart-product .grid .col-name,.reports-report-review-customer .grid .col-name,[class^=' adminhtml-rma-'] .fieldset-wrapper .accordion .config .data-table td{max-width:670px;width:670px}.reports-report-sales-invoiced .grid .col-period,.reports-report-sales-refunde .grid .col-period,[class^=' tests-report-test'] .grid .col-period{width:auto}.grid .col-select,.grid .col-id,.grid .col-number{width:40px}.sales-order-create-index .grid,.sales-order-create-index .grid-actions,.adminhtml-export-index .grid-actions,.adminhtml-export-index .grid{padding-left:0;padding-right:0}[class^=' adminhtml-rma-'] .col-actions a,[class^=' customer-index-'] .col-action a,.adminhtml-notification-index .col-actions a{display:block;margin:0 0 3px;white-space:nowrap}.data-table-td-max .accordion .config .data-table td,.order-account-information .data-table td,[class^=' adminhtml-rma-'] .rma-request-details .data-table td{max-width:250px;width:250px}.catalog-product-edit .ui-tabs-panel .grid .hor-scroll,.catalog-product-index .grid .hor-scroll,.review-product-index .grid .hor-scroll,.adminhtml-rma-edit .hor-scroll{overflow-x:auto}.add-clearer:after,.massaction:after,.navigation>ul:after{content:"";display:table;clear:both}.test-content{width:calc(20px + 100*0.2)}.test-content:before{content:'.test {\A ' attr(data-attribute) ': 0.2em;' '\A content:\'';white-space:pre}.test-content:after{content:' Test\';\A}' "\A" '\A.test + .test._other ~ ul > li' " {\A height: @var;\A content: ' + ';\A}";white-space:pre} \ No newline at end of file diff --git a/dev/tests/integration/testsuite/Magento/PageCache/Block/System/Config/Form/Field/ExportTest.php b/dev/tests/integration/testsuite/Magento/PageCache/Block/System/Config/Form/Field/ExportTest.php new file mode 100644 index 0000000000000..f5a343241c2e8 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/PageCache/Block/System/Config/Form/Field/ExportTest.php @@ -0,0 +1,27 @@ +dispatch('backend/admin/system_config/edit/section/system/'); + $body = $this->getResponse()->getBody(); + $this->assertContains('system_full_page_cache_varnish_export_button_version3', $body); + $this->assertContains('system_full_page_cache_varnish_export_button_version4', $body); + $this->assertContains('[id^=system_full_page_cache_varnish_export_button_version]', $body); + } +} diff --git a/dev/tests/integration/testsuite/Magento/ToolkitFramework/ApplicationTest.php b/dev/tests/integration/testsuite/Magento/ToolkitFramework/ApplicationTest.php index 2944d2c796a16..79ceb680af749 100644 --- a/dev/tests/integration/testsuite/Magento/ToolkitFramework/ApplicationTest.php +++ b/dev/tests/integration/testsuite/Magento/ToolkitFramework/ApplicationTest.php @@ -35,12 +35,21 @@ public static function setUpBeforeClass() public function testTest() { - $fixturesArray = \Magento\ToolkitFramework\FixtureSet::getInstance()->getFixtures(); $config = \Magento\ToolkitFramework\Config::getInstance(); - $config->loadConfig(self::$_generatorWorkingDir . '/profiles/small.xml'); + $config->loadConfig(__DIR__ . '/_files/small.xml'); + /** @var \Magento\TestFramework\Application $itfApplication */ + $itfApplication = \Magento\TestFramework\Helper\Bootstrap::getInstance()->getBootstrap()->getApplication(); + $shell = $this->getMock('Magento\Framework\Shell', [], [], '', false); - foreach ($fixturesArray as $fixture) { - $this->applyFixture(self::$_generatorWorkingDir . '/fixtures/' . $fixture['file']); + $application = new \Magento\ToolkitFramework\Application( + $itfApplication->getTempDir(), + $shell, + $itfApplication->getInitParams() + ); + + $application->bootstrap(); + foreach ($application->loadFixtures()->getFixtures() as $fixture) { + $fixture->execute(); } } diff --git a/dev/tests/integration/testsuite/Magento/ToolkitFramework/_files/small.xml b/dev/tests/integration/testsuite/Magento/ToolkitFramework/_files/small.xml new file mode 100644 index 0000000000000..38fbb61b0e12e --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/ToolkitFramework/_files/small.xml @@ -0,0 +1,22 @@ + + + + + 1 + 1 + 1 + 30 + 10 + 5 + 3 + 1 + 1 + 1 + 5 + + 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 84b33ddc2a8d5..9f65be6b18f32 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -1794,6 +1794,7 @@ ['Magento\Core\Model\Page\Asset\MergeableInterface', 'Magento\Framework\View\Asset\MergeableInterface'], ['Magento\Core\Model\Page\Asset\Merged', 'Magento\Framework\View\Asset\Merged'], ['Magento\Core\Model\Page\Asset\Minified', 'Magento\Framework\View\Asset\Minified'], + ['Magento\Framework\View\Asset\Minified', 'Magento\Framework\View\Asset\Minified\MutablePathAsset'], ['Magento\Core\Model\Page\Asset\MinifyService', 'Magento\Framework\View\Asset\MinifyService'], ['Magento\Core\Model\Page\Asset\PublicFile', 'Magento\Framework\View\Asset\PublicFile'], ['Magento\Core\Model\Page\Asset\Remote', 'Magento\Framework\View\Asset\Remote'], diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/CategoryTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/CategoryTest.php index 410d476b1e7b3..5bb59398af219 100644 --- a/dev/tests/unit/testsuite/Magento/Catalog/Model/CategoryTest.php +++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/CategoryTest.php @@ -309,4 +309,90 @@ protected function getCategoryModel() ] ); } + + public function reindexFlatEnabledTestDataProvider() + { + return [ + 'set 1' => [false, false, 1, 1], + 'set 2' => [true, false, 0, 1], + 'set 3' => [false, true, 1, 0], + 'set 4' => [true, true, 0, 0], + ]; + } + + /** + * @param $flatScheduled + * @param $productScheduled + * @param $expectedFlatReindexCalls + * @param $expectedProductReindexCall + * + * @dataProvider reindexFlatEnabledTestDataProvider + */ + public function testReindexFlatEnabled($flatScheduled, $productScheduled, $expectedFlatReindexCalls, $expectedProductReindexCall) + { + $affectedProductIds = ["1", "2"]; + $this->category->setAffectedProductIds($affectedProductIds); + $pathIds = ['path/1/2', 'path/2/3']; + $this->category->setData('path_ids', $pathIds); + $this->category->setId('123'); + + $this->flatState->expects($this->any()) + ->method('isFlatEnabled') + ->will($this->returnValue(true)); + + $this->flatIndexer->expects($this->exactly(1))->method('isScheduled')->will($this->returnValue($flatScheduled)); + $this->flatIndexer->expects($this->exactly($expectedFlatReindexCalls))->method('reindexRow')->with('123'); + + $this->productIndexer->expects($this->exactly(1))->method('isScheduled')->will($this->returnValue($productScheduled)); + $this->productIndexer->expects($this->exactly($expectedProductReindexCall))->method('reindexList')->with($pathIds); + + $this->indexerRegistry->expects($this->at(0)) + ->method('get') + ->with(Indexer\Category\Flat\State::INDEXER_ID) + ->will($this->returnValue($this->flatIndexer)); + + $this->indexerRegistry->expects($this->at(1)) + ->method('get') + ->with(Indexer\Category\Product::INDEXER_ID) + ->will($this->returnValue($this->productIndexer)); + + $this->category->reindex(); + } + + public function reindexFlatDisabledTestDataProvider() + { + return [ + 'set 1' => [false, 1], + 'set 2' => [true, 0], + ]; + } + + /** + * @param $productScheduled + * @param $expectedProductReindexCall + * + * @dataProvider reindexFlatDisabledTestDataProvider + */ + public function testReindexFlatDisabled($productScheduled, $expectedProductReindexCall) + { + $affectedProductIds = ["1", "2"]; + $this->category->setAffectedProductIds($affectedProductIds); + $pathIds = ['path/1/2', 'path/2/3']; + $this->category->setData('path_ids', $pathIds); + $this->category->setId('123'); + + $this->flatState->expects($this->any()) + ->method('isFlatEnabled') + ->will($this->returnValue(false)); + + $this->productIndexer->expects($this->exactly(1))->method('isScheduled')->will($this->returnValue($productScheduled)); + $this->productIndexer->expects($this->exactly($expectedProductReindexCall))->method('reindexList')->with($pathIds); + + $this->indexerRegistry->expects($this->at(0)) + ->method('get') + ->with(Indexer\Category\Product::INDEXER_ID) + ->will($this->returnValue($this->productIndexer)); + + $this->category->reindex(); + } } diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/ProductTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/ProductTest.php index e6f84eafedf50..6a5c305ee7559 100644 --- a/dev/tests/unit/testsuite/Magento/Catalog/Model/ProductTest.php +++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/ProductTest.php @@ -104,6 +104,11 @@ class ProductTest extends \PHPUnit_Framework_TestCase */ private $categoryRepository; + /** + * @var \Magento\Catalog\Helper\Product|\PHPUnit_Framework_MockObject_MockObject + */ + private $_catalogProduct; + /** * @var \Magento\Catalog\Model\Product\Image\Cache|\PHPUnit_Framework_MockObject_MockObject */ @@ -218,6 +223,14 @@ public function setUp() $this->indexerRegistryMock = $this->getMock('Magento\Indexer\Model\IndexerRegistry', ['get'], [], '', false); $this->categoryRepository = $this->getMock('Magento\Catalog\Api\CategoryRepositoryInterface'); + $this->_catalogProduct = $this->getMock( + 'Magento\Catalog\Helper\Product', + ['isDataForProductCategoryIndexerWasChanged'], + [], + '', + false + ); + $this->imageCache = $this->getMockBuilder('Magento\Catalog\Model\Product\Image\Cache') ->disableOriginalConstructor() ->getMock(); @@ -242,10 +255,12 @@ public function setUp() 'stockItemBuilder' => $this->stockItemBuilderMock, 'indexerRegistry' => $this->indexerRegistryMock, 'categoryRepository' => $this->categoryRepository, + 'catalogProduct' => $this->_catalogProduct, 'imageCacheFactory' => $this->imageCacheFactory, 'data' => ['id' => 1] ] ); + } public function testGetAttributes() @@ -349,6 +364,7 @@ public function testIsInStock() public function testIndexerAfterDeleteCommitProduct() { + $this->model->isDeleted(true); $this->categoryIndexerMock->expects($this->once())->method('reindexRow'); $this->productFlatProcessor->expects($this->once())->method('reindexRow'); $this->productPriceProcessor->expects($this->once())->method('reindexRow'); @@ -356,12 +372,36 @@ public function testIndexerAfterDeleteCommitProduct() $this->model->afterDeleteCommit(); } - public function testReindex() + /** + * @param $productChanged + * @param $isScheduled + * @param $productFlatCount + * @param $categoryIndexerCount + * + * @dataProvider getProductReindexProvider + */ + public function testReindex($productChanged, $isScheduled, $productFlatCount, $categoryIndexerCount) { - $this->categoryIndexerMock->expects($this->once())->method('reindexRow'); - $this->productFlatProcessor->expects($this->once())->method('reindexRow'); - $this->prepareCategoryIndexer(); - $this->assertNull($this->model->reindex()); + $this->model->setData('entity_id', 1); + $this->_catalogProduct->expects($this->once())->method('isDataForProductCategoryIndexerWasChanged')->willReturn($productChanged); + $this->productFlatProcessor->expects($this->exactly($productFlatCount))->method('reindexRow'); + $this->indexerRegistryMock->expects($this->exactly($productFlatCount)) + ->method('get') + ->with(\Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID) + ->will($this->returnValue($this->categoryIndexerMock)); + $this->categoryIndexerMock->expects($this->any())->method('isScheduled')->will($this->returnValue($isScheduled)); + $this->categoryIndexerMock->expects($this->exactly($categoryIndexerCount))->method('reindexRow'); + + $this->model->reindex(); + } + + public function getProductReindexProvider() + { + return array( + 'set 1' => [true, false, 1, 1], + 'set 2' => [true, true, 1, 0], + 'set 3' => [false, false, 0, 0] + ); } public function testPriceReindexCallback() diff --git a/dev/tests/unit/testsuite/Magento/Framework/App/StaticResourceTest.php b/dev/tests/unit/testsuite/Magento/Framework/App/StaticResourceTest.php index 96f474e92fa55..29b2bc71174ad 100644 --- a/dev/tests/unit/testsuite/Magento/Framework/App/StaticResourceTest.php +++ b/dev/tests/unit/testsuite/Magento/Framework/App/StaticResourceTest.php @@ -55,6 +55,11 @@ class StaticResourceTest extends \PHPUnit_Framework_TestCase */ private $object; + /** + * @var \Magento\Framework\View\Asset\MinifyService|\PHPUnit_Framework_MockObject_MockObject + */ + private $minifyService; + protected function setUp() { $this->state = $this->getMock('Magento\Framework\App\State', [], [], '', false); @@ -67,6 +72,11 @@ protected function setUp() $this->configLoader = $this->getMock( 'Magento\Framework\App\ObjectManager\ConfigLoader', [], [], '', false ); + $this->minifyService = $this->getMockBuilder('Magento\Framework\View\Asset\MinifyService') + ->disableOriginalConstructor() + ->setMethods(['getAssets']) + ->getMock(); + $this->object = new \Magento\Framework\App\StaticResource( $this->state, $this->response, @@ -76,6 +86,7 @@ protected function setUp() $this->moduleList, $this->objectManager, $this->configLoader, + $this->minifyService, $this->getMockForAbstractClass('\Magento\Framework\View\DesignInterface') ); } @@ -142,6 +153,7 @@ public function testLaunch( $this->response->expects($this->once()) ->method('setFilePath') ->with('resource/file.css'); + $this->minifyService->expects($this->once())->method('getAssets')->willReturnArgument(0); $this->object->launch(); } diff --git a/dev/tests/unit/testsuite/Magento/Framework/View/Asset/Minified/AbstractAssetTestCase.php b/dev/tests/unit/testsuite/Magento/Framework/View/Asset/Minified/AbstractAssetTestCase.php new file mode 100644 index 0000000000000..e464ba7f8b84e --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Framework/View/Asset/Minified/AbstractAssetTestCase.php @@ -0,0 +1,91 @@ +_asset = $this->getMockForAbstractClass('\Magento\Framework\View\Asset\LocalInterface'); + $this->_logger = $this->getMock('\Psr\Log\LoggerInterface', [], [], '', false); + $this->_baseUrl = $this->getMock('\Magento\Framework\Url', [], [], '', false); + $this->_staticViewDir = $this->getMockForAbstractClass( + '\Magento\Framework\Filesystem\Directory\WriteInterface' + ); + $this->_rootDir = $this->getMockForAbstractClass('\Magento\Framework\Filesystem\Directory\ReadInterface'); + $this->_filesystem = $this->getMock('\Magento\Framework\Filesystem', [], [], '', false); + $this->_filesystem->expects($this->any()) + ->method('getDirectoryRead') + ->will($this->returnValueMap([ + [DirectoryList::STATIC_VIEW, DriverPool::FILE, $this->_staticViewDir], + [DirectoryList::ROOT, DriverPool::FILE, $this->_rootDir], + ])); + $this->_filesystem->expects($this->any()) + ->method('getDirectoryWrite') + ->with(DirectoryList::STATIC_VIEW) + ->will($this->returnValue($this->_staticViewDir)); + $this->_adapter = $this->getMockForAbstractClass('Magento\Framework\Code\Minifier\AdapterInterface'); + } + + protected function prepareAttemptToMinifyMock($fileExists, $rootDirExpectations = true) + { + $this->_asset->expects($this->atLeastOnce())->method('getPath')->will($this->returnValue('test/admin.js')); + $this->_asset->expects($this->atLeastOnce()) + ->method('getSourceFile') + ->will($this->returnValue('/foo/bar/test/admin.js')); + if ($rootDirExpectations) { + $this->_rootDir->expects($this->once()) + ->method('getRelativePath') + ->with('/foo/bar/test/admin.min.js') + ->will($this->returnValue('test/admin.min.js')); + $this->_rootDir->expects($this->once()) + ->method('isExist') + ->with('test/admin.min.js') + ->will($this->returnValue(false)); + } + $this->_baseUrl->expects($this->once())->method('getBaseUrl')->will($this->returnValue('http://example.com/')); + $this->_staticViewDir->expects($this->once())->method('isExist')->will($this->returnValue($fileExists)); + } +} diff --git a/dev/tests/unit/testsuite/Magento/Framework/View/Asset/Minified/ImmutablePathAssetTest.php b/dev/tests/unit/testsuite/Magento/Framework/View/Asset/Minified/ImmutablePathAssetTest.php new file mode 100644 index 0000000000000..1564d97364d07 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Framework/View/Asset/Minified/ImmutablePathAssetTest.php @@ -0,0 +1,40 @@ +_model = new ImmutablePathAsset( + $this->_asset, + $this->_logger, + $this->_filesystem, + $this->_baseUrl, + $this->_adapter + ); + } + + public function testImmutableFilePath() + { + $this->prepareAttemptToMinifyMock(false); + $this->_asset->method('getContext')->willReturn($this->_baseUrl); + $this->_asset->expects($this->once())->method('getContent')->will($this->returnValue('content')); + $this->_adapter->expects($this->once())->method('minify')->with('content')->will($this->returnValue('mini')); + $this->_staticViewDir->expects($this->once())->method('writeFile')->with($this->anything(), 'mini'); + $this->assertEquals('test/admin.js', $this->_model->getFilePath()); + $this->assertEquals('http://example.com/test/admin.js', $this->_model->getUrl()); + } +} diff --git a/dev/tests/unit/testsuite/Magento/Framework/View/Asset/MinifiedTest.php b/dev/tests/unit/testsuite/Magento/Framework/View/Asset/Minified/MutablePathAssetTest.php similarity index 60% rename from dev/tests/unit/testsuite/Magento/Framework/View/Asset/MinifiedTest.php rename to dev/tests/unit/testsuite/Magento/Framework/View/Asset/Minified/MutablePathAssetTest.php index 50e39edc08a4a..f0b534fca970b 100644 --- a/dev/tests/unit/testsuite/Magento/Framework/View/Asset/MinifiedTest.php +++ b/dev/tests/unit/testsuite/Magento/Framework/View/Asset/Minified/MutablePathAssetTest.php @@ -3,75 +3,20 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Framework\View\Asset; +namespace Magento\Framework\View\Asset\Minified; -use Magento\Framework\App\Filesystem\DirectoryList; -use Magento\Framework\Filesystem\DriverPool; - -class MinifiedTest extends \PHPUnit_Framework_TestCase +class MutablePathAssetTest extends AbstractAssetTestCase { /** - * @var \Magento\Framework\View\Asset\LocalInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_asset; - - /** - * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_logger; - - /** - * @var \Magento\Framework\Filesystem\Directory\ReadInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_staticViewDir; - - /** - * @var \Magento\Framework\Filesystem\Directory\ReadInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_rootDir; - - /** - * @var \Magento\Framework\Url|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_baseUrl; - - /** - * @var \Magento\Framework\Filesystem|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_filesystem; - - /** - * @var \Magento\Framework\Code\Minifier\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $_adapter; - - /** - * @var \Magento\Framework\View\Asset\Minified + * @var MutablePathAsset */ protected $_model; protected function setUp() { - $this->_asset = $this->getMockForAbstractClass('\Magento\Framework\View\Asset\LocalInterface'); - $this->_logger = $this->getMock('\Psr\Log\LoggerInterface', [], [], '', false); - $this->_baseUrl = $this->getMock('\Magento\Framework\Url', [], [], '', false); - $this->_staticViewDir = $this->getMockForAbstractClass( - '\Magento\Framework\Filesystem\Directory\WriteInterface' - ); - $this->_rootDir = $this->getMockForAbstractClass('\Magento\Framework\Filesystem\Directory\ReadInterface'); - $this->_filesystem = $this->getMock('\Magento\Framework\Filesystem', [], [], '', false); - $this->_filesystem->expects($this->any()) - ->method('getDirectoryRead') - ->will($this->returnValueMap([ - [DirectoryList::STATIC_VIEW, DriverPool::FILE, $this->_staticViewDir], - [DirectoryList::ROOT, DriverPool::FILE, $this->_rootDir], - ])); - $this->_filesystem->expects($this->any()) - ->method('getDirectoryWrite') - ->with(DirectoryList::STATIC_VIEW) - ->will($this->returnValue($this->_staticViewDir)); - $this->_adapter = $this->getMockForAbstractClass('Magento\Framework\Code\Minifier\AdapterInterface'); - $this->_model = new Minified( + parent::setUp(); + + $this->_model = new MutablePathAsset( $this->_asset, $this->_logger, $this->_filesystem, @@ -100,7 +45,7 @@ public function testInMemoryDecorator($method, $expected) */ private function prepareRequestedAsMinifiedMock() { - $this->_asset->expects($this->exactly(2))->method('getPath')->will($this->returnValue('test/library.min.js')); + $this->_asset->expects($this->exactly(2))->method('getPath')->will($this->returnValue('test/admin.min.js')); $this->_asset->expects($this->once())->method('getSourceFile')->will($this->returnValue('source_file')); $this->_asset->expects($this->once())->method('getFilePath')->will($this->returnValue('file_path')); $this->_asset->expects($this->once())->method('getContext')->will($this->returnValue('context')); @@ -115,7 +60,7 @@ public function inMemoryDecoratorDataProvider() return [ ['getUrl', 'url'], ['getSourceFile', 'source_file'], - ['getPath', 'test/library.min.js'], + ['getPath', 'test/admin.min.js'], ['getFilePath', 'file_path'], ['getContext', 'context'], ]; @@ -150,7 +95,7 @@ public function testGetContent() $this->_adapter->expects($this->never())->method('minify'); $this->_staticViewDir->expects($this->exactly(2)) ->method('readFile') - ->with('test/library.min.js') + ->with('test/admin.min.js') ->will($this->returnValue('content')); $this->assertEquals('content', $this->_model->getContent()); $this->assertEquals('content', $this->_model->getContent()); @@ -158,23 +103,23 @@ public function testGetContent() public function testHasPreminifiedFile() { - $this->_asset->expects($this->exactly(2))->method('getPath')->will($this->returnValue('test/library.js')); + $this->_asset->expects($this->exactly(2))->method('getPath')->will($this->returnValue('test/admin.js')); $this->_asset->expects($this->atLeastOnce()) ->method('getSourceFile') - ->will($this->returnValue('/foo/bar/test/library.js')); + ->will($this->returnValue('/foo/bar/test/admin.js')); $this->_asset->expects($this->once())->method('getFilePath')->will($this->returnValue('file_path')); $this->_asset->expects($this->once())->method('getContext')->will($this->returnValue('context')); $this->_asset->expects($this->once())->method('getUrl')->will($this->returnValue('url')); $this->_rootDir->expects($this->once()) ->method('getRelativePath') - ->with('/foo/bar/test/library.min.js') - ->will($this->returnValue('test/library.min.js')); + ->with('/foo/bar/test/admin.min.js') + ->will($this->returnValue('test/admin.min.js')); $this->_rootDir->expects($this->once()) ->method('isExist') - ->with('test/library.min.js') + ->with('test/admin.min.js') ->will($this->returnValue(true)); $this->_adapter->expects($this->never())->method('minify'); - $this->assertEquals('test/library.min.js', $this->_model->getPath()); + $this->assertEquals('test/admin.min.js', $this->_model->getPath()); } public function testMinify() @@ -183,27 +128,7 @@ public function testMinify() $this->_asset->expects($this->once())->method('getContent')->will($this->returnValue('content')); $this->_adapter->expects($this->once())->method('minify')->with('content')->will($this->returnValue('mini')); $this->_staticViewDir->expects($this->once())->method('writeFile')->with($this->anything(), 'mini'); - $this->assertStringMatchesFormat('%s_library.min.js', $this->_model->getFilePath()); - } - - private function prepareAttemptToMinifyMock($fileExists, $rootDirExpectations = true) - { - $this->_asset->expects($this->atLeastOnce())->method('getPath')->will($this->returnValue('test/library.js')); - $this->_asset->expects($this->atLeastOnce()) - ->method('getSourceFile') - ->will($this->returnValue('/foo/bar/test/library.js')); - if ($rootDirExpectations) { - $this->_rootDir->expects($this->once()) - ->method('getRelativePath') - ->with('/foo/bar/test/library.min.js') - ->will($this->returnValue('test/library.min.js')); - $this->_rootDir->expects($this->once()) - ->method('isExist') - ->with('test/library.min.js') - ->will($this->returnValue(false)); - } - $this->_baseUrl->expects($this->once())->method('getBaseUrl')->will($this->returnValue('http://example.com/')); - $this->_staticViewDir->expects($this->once())->method('isExist')->will($this->returnValue($fileExists)); + $this->assertStringMatchesFormat('%s_admin.min.js', $this->_model->getFilePath()); } public function testMinificationFailed() @@ -217,7 +142,7 @@ public function testMinificationFailed() $this->_asset->expects($this->once())->method('getFilePath')->will($this->returnValue('file_path')); $this->_asset->expects($this->once())->method('getContext')->will($this->returnValue('context')); $this->_asset->expects($this->once())->method('getUrl')->will($this->returnValue('url')); - $this->assertEquals('test/library.js', $this->_model->getPath()); + $this->assertEquals('test/admin.js', $this->_model->getPath()); } public function testShouldNotMinifyCozExists() @@ -225,7 +150,7 @@ public function testShouldNotMinifyCozExists() $this->prepareAttemptToMinifyMock(true); // IS_EXISTS is assumed by default, so nothing to mock here $this->_adapter->expects($this->never())->method('minify'); - $this->assertStringMatchesFormat('%s_library.min.js', $this->_model->getFilePath()); + $this->assertStringMatchesFormat('%s_admin.min.js', $this->_model->getFilePath()); } /** @@ -237,27 +162,27 @@ public function testShouldNotMinifyCozExists() public function testMinifyMtime($mtimeOrig, $mtimeMinified, $isMinifyExpected) { $this->prepareAttemptToMinifyMock(true, false); - $model = new Minified( + $model = new MutablePathAsset( $this->_asset, $this->_logger, $this->_filesystem, $this->_baseUrl, $this->_adapter, - Minified::MTIME + AbstractAsset::MTIME ); $this->_rootDir->expects($this->any()) ->method('getRelativePath') ->will($this->returnValueMap([ - ['/foo/bar/test/library.min.js', 'test/library.min.js'], - ['/foo/bar/test/library.js', 'test/library.js'], + ['/foo/bar/test/admin.min.js', 'test/admin.min.js'], + ['/foo/bar/test/admin.js', 'test/admin.js'], ])); $this->_rootDir->expects($this->once()) ->method('isExist') - ->with('test/library.min.js') + ->with('test/admin.min.js') ->will($this->returnValue(false)); $this->_rootDir->expects($this->once()) ->method('stat') - ->with('test/library.js') + ->with('test/admin.js') ->will($this->returnValue(['mtime' => $mtimeOrig])); $this->_staticViewDir->expects($this->once()) ->method('stat') @@ -273,7 +198,7 @@ public function testMinifyMtime($mtimeOrig, $mtimeMinified, $isMinifyExpected) } else { $this->_adapter->expects($this->never())->method('minify'); } - $this->assertStringMatchesFormat('%s_library.min.js', $model->getFilePath()); + $this->assertStringMatchesFormat('%s_admin.min.js', $model->getFilePath()); } /** diff --git a/dev/tests/unit/testsuite/Magento/Framework/View/Asset/MinifyServiceTest.php b/dev/tests/unit/testsuite/Magento/Framework/View/Asset/MinifyServiceTest.php index bc3963ead485f..014e967ba5229 100644 --- a/dev/tests/unit/testsuite/Magento/Framework/View/Asset/MinifyServiceTest.php +++ b/dev/tests/unit/testsuite/Magento/Framework/View/Asset/MinifyServiceTest.php @@ -37,15 +37,15 @@ protected function setUp() public function testGetAssets($appMode, $expectedStrategy) { $assetOne = $this->getMockForAbstractClass('Magento\Framework\View\Asset\LocalInterface'); - $assetOne->expects($this->once()) + $assetOne->expects($this->any()) ->method('getContentType') ->will($this->returnValue('js')); - $resultOne = $this->getMock('Magento\Framework\View\Asset\Minified', [], [], '', false); + $resultOne = $this->getMock('Magento\Framework\View\Asset\Minified\MutablePathAsset', [], [], '', false); $assetTwo = $this->getMockForAbstractClass('Magento\Framework\View\Asset\LocalInterface'); - $assetTwo->expects($this->once()) + $assetTwo->expects($this->any()) ->method('getContentType') ->will($this->returnValue('js')); - $resultTwo = $this->getMock('Magento\Framework\View\Asset\Minified', [], [], '', false); + $resultTwo = $this->getMock('Magento\Framework\View\Asset\Minified\MutablePathAsset', [], [], '', false); $this->_config->expects($this->once()) ->method('isAssetMinification') ->with('js') @@ -64,12 +64,12 @@ public function testGetAssets($appMode, $expectedStrategy) ->will($this->returnValueMap( [ [ - 'Magento\Framework\View\Asset\Minified', + 'Magento\Framework\View\Asset\Minified\MutablePathAsset', ['asset' => $assetOne, 'strategy' => $expectedStrategy, 'adapter' => $minifier], $resultOne, ], [ - 'Magento\Framework\View\Asset\Minified', + 'Magento\Framework\View\Asset\Minified\MutablePathAsset', ['asset' => $assetTwo, 'strategy' => $expectedStrategy, 'adapter' => $minifier], $resultTwo ], @@ -91,15 +91,15 @@ public function getAssetsDataProvider() return [ 'production' => [ \Magento\Framework\App\State::MODE_PRODUCTION, - Minified::FILE_EXISTS, + Minified\AbstractAsset::FILE_EXISTS, ], 'default' => [ \Magento\Framework\App\State::MODE_DEFAULT, - Minified::MTIME, + Minified\AbstractAsset::MTIME, ], 'developer' => [ \Magento\Framework\App\State::MODE_DEVELOPER, - Minified::MTIME, + Minified\AbstractAsset::MTIME, ], ]; } @@ -130,7 +130,7 @@ public function testGetAssetsDisabled() public function testGetAssetsNoAdapterDefined() { $asset = $this->getMockForAbstractClass('Magento\Framework\View\Asset\LocalInterface'); - $asset->expects($this->once()) + $asset->expects($this->any()) ->method('getContentType') ->will($this->returnValue('js')); @@ -152,7 +152,7 @@ public function testGetAssetsInvalidAdapter() 'Invalid adapter: \'stdClass\'. Expected: \Magento\Framework\Code\Minifier\AdapterInterface' ); $asset = $this->getMockForAbstractClass('Magento\Framework\View\Asset\LocalInterface'); - $asset->expects($this->once()) + $asset->expects($this->any()) ->method('getContentType') ->will($this->returnValue('js')); $this->_config->expects($this->once()) diff --git a/dev/tests/unit/testsuite/Magento/Framework/View/Asset/PreProcessor/PoolTest.php b/dev/tests/unit/testsuite/Magento/Framework/View/Asset/PreProcessor/PoolTest.php index fe40e9aba872b..9ec9ee6b51032 100644 --- a/dev/tests/unit/testsuite/Magento/Framework/View/Asset/PreProcessor/PoolTest.php +++ b/dev/tests/unit/testsuite/Magento/Framework/View/Asset/PreProcessor/PoolTest.php @@ -46,7 +46,9 @@ public function getPreProcessorsDataProvider() return [ 'css => css' => [ 'css', 'css', - ['Magento\Framework\View\Asset\PreProcessor\ModuleNotation'], + [ + 'Magento\Framework\View\Asset\PreProcessor\ModuleNotation' + ], ], 'css => less (irrelevant)' => [ 'css', 'less', @@ -56,7 +58,7 @@ public function getPreProcessorsDataProvider() 'less', 'css', [ 'Magento\Framework\Css\PreProcessor\Less', - 'Magento\Framework\View\Asset\PreProcessor\ModuleNotation', + 'Magento\Framework\View\Asset\PreProcessor\ModuleNotation' ], ], 'less => less' => [ diff --git a/dev/tests/unit/testsuite/Magento/PageCache/Block/System/Config/Form/Field/ExportTest.php b/dev/tests/unit/testsuite/Magento/PageCache/Block/System/Config/Form/Field/ExportTest.php deleted file mode 100644 index e52ca89e858df..0000000000000 --- a/dev/tests/unit/testsuite/Magento/PageCache/Block/System/Config/Form/Field/ExportTest.php +++ /dev/null @@ -1,67 +0,0 @@ -_model = new StubExport(); - } - - /** - * Test Case for Retrieving 'Export VCL' button HTML markup - */ - public function testGetElementHtml() - { - $expected = 'some test data'; - $elementMock = $this->getMock( - '\Magento\Framework\Data\Form\Element\AbstractElement', - [], - [], - '', - false, - false - ); - - $form = $this->getMock('Magento\Framework\Data\Form', ['getLayout'], [], '', false, false); - $layoutMock = $this->getMock('Magento\Framework\View\Layout', [], [], '', false, false); - - $buttonMock = $this->getMock('Magento\Backend\Block\Widget\Button', [], [], '', false, false); - $urlBuilderMock = $this->getMock('Magento\Backend\Model\Url', ['getUrl'], [], '', false, false); - $urlBuilderMock->expects( - $this->once() - )->method( - 'getUrl' - )->with( - '*/PageCache/exportVarnishConfig', - ['website' => 1] - )->will( - $this->returnValue('/PageCache/exportVarnishConfig/') - ); - $this->_model->setUrlBuilder($urlBuilderMock); - - $requestMock = $this->getMock('Magento\Framework\App\RequestInterface', [], [], '', false, false); - $requestMock->expects($this->once())->method('getParam')->with('website')->will($this->returnValue(1)); - - $mockData = $this->getMock('Magento\Framework\Object', ['toHtml']); - $mockData->expects($this->once())->method('toHtml')->will($this->returnValue($expected)); - - $buttonMock->expects($this->once())->method('getRequest')->will($this->returnValue($requestMock)); - $buttonMock->expects($this->any())->method('setData')->will($this->returnValue($mockData)); - - $layoutMock->expects($this->once())->method('createBlock')->will($this->returnValue($buttonMock)); - $form->expects($this->once())->method('getLayout')->will($this->returnValue($layoutMock)); - - $this->_model->setForm($form); - $this->assertEquals($expected, $this->_model->getElementHtml($elementMock)); - } -} diff --git a/dev/tests/unit/testsuite/Magento/PageCache/Block/System/Config/Form/Field/StubExport.php b/dev/tests/unit/testsuite/Magento/PageCache/Block/System/Config/Form/Field/StubExport.php deleted file mode 100644 index 343aeb7b21432..0000000000000 --- a/dev/tests/unit/testsuite/Magento/PageCache/Block/System/Config/Form/Field/StubExport.php +++ /dev/null @@ -1,32 +0,0 @@ -_urlBuilder = $urlBuilder; - } - - /** - * Retrieve element HTML markup - * - * @param \Magento\Framework\Data\Form\Element\AbstractElement $element - * @return string - */ - public function getElementHtml($element) - { - return $this->_getElementHtml($element); - } -} diff --git a/dev/tests/unit/testsuite/Magento/PageCache/Model/ConfigTest.php b/dev/tests/unit/testsuite/Magento/PageCache/Model/ConfigTest.php index df48750136cfb..880214f645ec9 100644 --- a/dev/tests/unit/testsuite/Magento/PageCache/Model/ConfigTest.php +++ b/dev/tests/unit/testsuite/Magento/PageCache/Model/ConfigTest.php @@ -80,7 +80,7 @@ public function setUp() \Magento\PageCache\Model\Config::XML_VARNISH_PAGECACHE_ACCESS_LIST, \Magento\Framework\Store\ScopeInterface::SCOPE_STORE, null, - '127.0.0.1, 192.168.0.1' + '127.0.0.1, 192.168.0.1,127.0.0.2' ], [ \Magento\PageCache\Model\Config::XML_VARNISH_PAGECACHE_DESIGN_THEME_REGEX, @@ -104,7 +104,7 @@ public function setUp() */ public function testGetVcl() { - $test = $this->_model->getVclFile(); + $test = $this->_model->getVclFile(Config::VARNISH_3_CONFIGURATION_PATH); $this->assertEquals(file_get_contents(__DIR__ . '/_files/result.vcl'), $test); } diff --git a/dev/tests/unit/testsuite/Magento/PageCache/Model/_files/result.vcl b/dev/tests/unit/testsuite/Magento/PageCache/Model/_files/result.vcl index db376c172766e..577e375bf36a7 100644 --- a/dev/tests/unit/testsuite/Magento/PageCache/Model/_files/result.vcl +++ b/dev/tests/unit/testsuite/Magento/PageCache/Model/_files/result.vcl @@ -5,6 +5,7 @@ by ips: "127.0.0.1"; "192.168.0.1"; + "127.0.0.2"; if (req.http.user-agent ~ "(?pattern)?i") { hash_data("value_for_pattern"); diff --git a/dev/tests/unit/testsuite/Magento/PageCache/Model/_files/test.vcl b/dev/tests/unit/testsuite/Magento/PageCache/Model/_files/test.vcl index cccae9b8c59f2..56b94fb228bcb 100644 --- a/dev/tests/unit/testsuite/Magento/PageCache/Model/_files/test.vcl +++ b/dev/tests/unit/testsuite/Magento/PageCache/Model/_files/test.vcl @@ -1,8 +1,8 @@ // Copyright © 2015 Magento. All rights reserved. // See COPYING.txt for license details. - {{ host }}:{{ port }} + /* {{ host }} */:/* {{ port }} */ by ips: -{{ ips }} +/* {{ ips }} */ - {{ design_exceptions_code }} \ No newline at end of file + /* {{ design_exceptions_code }} */ \ No newline at end of file diff --git a/dev/tools/Magento/Tools/View/Deployer.php b/dev/tools/Magento/Tools/View/Deployer.php index 0af4bdb3f1810..ef5d4858f0691 100644 --- a/dev/tools/Magento/Tools/View/Deployer.php +++ b/dev/tools/Magento/Tools/View/Deployer.php @@ -47,11 +47,15 @@ class Deployer /** @var int */ private $errorCount; + /** @var \Magento\Framework\View\Asset\MinifyService */ + protected $minifyService; + /** * @param Files $filesUtil * @param Deployer\Log $logger * @param Version\StorageInterface $versionStorage * @param \Magento\Framework\Stdlib\DateTime $dateTime + * @param \Magento\Framework\View\Asset\MinifyService $minifyService * @param bool $isDryRun */ public function __construct( @@ -59,6 +63,7 @@ public function __construct( Deployer\Log $logger, Version\StorageInterface $versionStorage, \Magento\Framework\Stdlib\DateTime $dateTime, + \Magento\Framework\View\Asset\MinifyService $minifyService, $isDryRun = false ) { $this->filesUtil = $filesUtil; @@ -66,6 +71,7 @@ public function __construct( $this->versionStorage = $versionStorage; $this->dateTime = $dateTime; $this->isDryRun = $isDryRun; + $this->minifyService = $minifyService; } /** @@ -193,6 +199,7 @@ private function deployFile($filePath, $area, $themePath, $locale, $module) $requestedPath, ['area' => $area, 'theme' => $themePath, 'locale' => $locale, 'module' => $module] ); + $asset = $this->minifyService->getAssets([$asset], true)[0]; $this->logger->logDebug("\tDeploying the file to '{$asset->getPath()}'", '.'); if ($this->isDryRun) { $asset->getContent(); diff --git a/dev/tools/performance-toolkit/README.txt b/dev/tools/performance-toolkit/README.txt index 0a94b4e4b38c8..24e2a3cafd0c7 100644 --- a/dev/tools/performance-toolkit/README.txt +++ b/dev/tools/performance-toolkit/README.txt @@ -10,48 +10,39 @@ jMeter: Plugins (only if you want to use additional reports (like graphs)): -- go to http://jmeter-plugins.org/downloads/all/ and download JMeterPlugins-Standard and JMeterPlugins-Extras -- unzip them to appropriate ext directory of your jMeter instance. --- additional reports can now be enabled via GUI (right click them, then click Enable) or editing the jMeter JMX XML (set 'enabled="true"'). +-- additional reports can now be added via GUI. Usage ----------- Before running the jMeter tests for the first time, you will need to first use generate.php to generate the test data. -If you do not wish to use performance metrics gathered from the server(s) (such as CPU / IO load), or do not wish to configure the jMeter metric gathering software on your server(s), you can disable that either via the GUI (right click on "Performance Metrics Collector" and click Disable) or by editing the jMeter JMX XML from: - -to: - -Attempting to run with Performance Metrics Collector enabled without appropriately configuring it will result in a timeout error connecting to the collector and the test not running. - 1. Run via console Scenario can accept parameters that are described bellow in format : - URL component 'host' of application being tested (URL or IP). - Base path for tested site. - Number of concurrent users. Recommended amount is 100. Minimal amount is 10. - Ramp period (seconds). Period the request will be distributed within. - Number of orders in the period specified in the current allocation. If is specified, the parameter will be recalculated. - Path where reports will be saved. Reports will be saved in current working directory by default. - Admin backend path. Default is backend. - Admin backend user. Default is admin. - Admin backend password. Default is 123123q. - Percentage of users that will only reach the add to cart stage. Default is 62. - Percentage of users that will only reach the view catalog stage. Default is 30. - Percentage of users that will reach the guest checkout stage. Default is 4. - Percentage of users that will reach the (logged-in) customer checkout stage. Default is 4. - Number of loops to run. Default is 1. - jMeter agent port. Default is 3450. - DB Server IP (for jMeter Performance Metrics). Default is 10.62.51.150. - Web Server 1 IP (for jMeter Performance Metrics). Default is 10.62.51.185. - Web Server 2 IP (for jMeter Performance Metrics). Default is 10.62.51.186. - -All parameters must be passed to command line with "J" prefix: "-J=" + URL component 'host' of application being tested (URL or IP). Default is 'localhost'. + Base path for tested site. Default is '/'. + Path where reports will be saved. Reports will be saved in current working directory by default. Default is './'. + Ramp period (seconds). Period the request will be distributed within. Default is '300'. + Number of orders in the period specified in the current allocation. If is specified, the parameter will be recalculated. Default is '0'. + Number of concurrent users. Recommended amount is 100. Minimal amount is 10. Default is '100'. + Percentage of users that will only reach the add to cart stage. Default is '62'. + Percentage of users that will only reach the view catalog stage. Default is '30'. + Percentage of users that will reach the guest checkout stage. Default is '4'. + Percentage of users that will reach the (logged-in) customer checkout stage. Default is '4'. + Number of loops to run. Default is '1'. + Admin backend path. Default is 'admin'. + Admin backend user. Default is 'admin'. + Admin backend password. Default is '123123q'. + Deviation (ms) for "think time" emulation. Default is '1000'. + Constant delay offset (ms) for "think time" emulation. Default is '2000'. + +Necessary parameters must be passed to command line with "J" prefix: "-J=" Example: > cd /directory_of_jMeter/bin/ > jmeter -n -t /path_to_benchmark_file/benchmark.jmx -Jhost=magento2.dev -Jbase_path=/ -Jusers=100 -Jramp_period=300 -Jreport_save_path=./ - 2. Run via GUI -- Open jMeter/bin directory and run jmeter.bat -- Click in menu File -> Open (Ctrl+O) and select file; or drag and drop benchmark.jmx file in opened GUI. diff --git a/dev/tools/performance-toolkit/benchmark.jmx b/dev/tools/performance-toolkit/benchmark.jmx index 2e0258008b9ee..1fe4919a59eb4 100644 --- a/dev/tools/performance-toolkit/benchmark.jmx +++ b/dev/tools/performance-toolkit/benchmark.jmx @@ -80,7 +80,7 @@ admin_path - ${__P(admin_path,backend)} + ${__P(admin_path,admin)} = @@ -98,39 +98,20 @@ 1 = - - jmeter_agent_port - ${__P(jmeter_agent_port,3450)} + + think_time_deviation + ${__P(think_time_deviation, 1000)} = - - db_server_ip - ${__P(db_server_ip,10.62.51.150)} - = - - - web_server_1_ip - ${__P(web_server_1_ip,10.62.51.185)} - = - - - web_server_2_ip - ${__P(web_server_2_ip,10.62.51.186)} - = - - - performance_metrics_collector_file_name - ${__P(performance_metrics_collector_file_name,performance_metrics_collector_file)} - = - - - response_time_file_name - ${__P(response_time_file_name,response_time_file_name)} + + think_time_delay_offset + ${__P(think_time_delay_offset, 2000)} = + true @@ -1020,38 +1001,6 @@ if (orders > 0) { - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - - startnextloop @@ -1140,6 +1089,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1171,6 +1125,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1203,6 +1162,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1235,6 +1199,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1267,38 +1236,6 @@ vars.put("category_name", props.get("category_name")); - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - - startnextloop @@ -1392,6 +1329,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1423,6 +1365,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1455,6 +1402,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1528,6 +1480,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1560,6 +1517,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1633,6 +1595,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1665,6 +1632,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1745,38 +1717,6 @@ vars.put("category_name", props.get("category_name")); - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - - startnextloop @@ -1870,6 +1810,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1901,6 +1846,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -1933,6 +1883,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2006,6 +1961,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2038,6 +1998,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2111,6 +2076,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2143,6 +2113,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2223,6 +2198,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2283,6 +2263,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2345,6 +2330,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2526,6 +2516,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2588,6 +2583,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2648,6 +2648,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2709,6 +2714,11 @@ vars.put("category_name", props.get("category_name")); + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2741,38 +2751,6 @@ vars.put("category_name", props.get("category_name")); - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - - startnextloop @@ -2882,6 +2860,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2913,6 +2896,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -2945,6 +2933,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3018,6 +3011,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3050,6 +3048,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3123,6 +3126,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3155,6 +3163,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3235,6 +3248,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3295,6 +3313,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3357,6 +3380,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3508,6 +3536,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3575,6 +3608,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3635,6 +3673,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3696,6 +3739,11 @@ if (emailsCount < 1) { + + ${think_time_delay_offset} + ${think_time_deviation} + + @@ -3728,38 +3776,6 @@ if (emailsCount < 1) { - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - - stoptest @@ -3804,7 +3820,7 @@ props.remove("customer_emails_list"); - + false saveConfig @@ -3833,7 +3849,7 @@ props.remove("customer_emails_list"); true - ${report_save_path}/summary-report.log + ${report_save_path}/view-results-tree.log @@ -3868,199 +3884,7 @@ props.remove("customer_emails_list"); ${report_save_path}/detailed-urls-report.log - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - ${report_save_path}/view-results-tree.log - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - ${report_save_path}/aggregate-graph.log - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - - - + false saveConfig @@ -4089,559 +3913,7 @@ props.remove("customer_emails_list"); true - - 500 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 1000 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 500 - false - - - - - jp@gc - Transactions per Second - jp@gc - Transactions per Second - - - Successful Transactions per Second - Failed Transactions per Second - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 1000 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 1000 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 500 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 100 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 500 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 500 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 500 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 500 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - - 1000 - false - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - false - false - false - false - false - 0 - true - - - ${performance_metrics_collector_file_name} - 1000 - false - - - - - ${db_server_ip} - ${jmeter_agent_port} - CPU - - - - ${db_server_ip} - ${jmeter_agent_port} - Memory - - - - ${db_server_ip} - ${jmeter_agent_port} - Disks I/O - unit=kb:readbytes - - - ${web_server_1_ip} - ${jmeter_agent_port} - CPU - - - - ${web_server_1_ip} - ${jmeter_agent_port} - Memory - - - - ${web_server_1_ip} - ${jmeter_agent_port} - Disks I/O - unit=kb:readbytes - - - ${web_server_2_ip} - ${jmeter_agent_port} - CPU - - - - ${web_server_2_ip} - ${jmeter_agent_port} - Memory - - - - ${web_server_2_ip} - ${jmeter_agent_port} - Disks I/O - unit=kb:readbytes - - - ${db_server_ip} - ${jmeter_agent_port} - Disks I/O - unit=kb:writebytes - - - ${web_server_1_ip} - ${jmeter_agent_port} - Disks I/O - unit=kb:writebytes - - - ${web_server_2_ip} - ${jmeter_agent_port} - Disks I/O - unit=kb:writebytes - - - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - true - false - false - false - false - false - 0 - true - - - ${response_time_file_name} + ${report_save_path}/summary-report.log diff --git a/dev/tools/performance-toolkit/fixtures/cart_price_rules.php b/dev/tools/performance-toolkit/fixtures/cart_price_rules.php index 33352f24b8884..8bb9287c3fa52 100644 --- a/dev/tools/performance-toolkit/fixtures/cart_price_rules.php +++ b/dev/tools/performance-toolkit/fixtures/cart_price_rules.php @@ -3,150 +3,191 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -$cartPriceRulesCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('cart_price_rules', 9); -$cartPriceRulesProductsFloor = \Magento\ToolkitFramework\Config::getInstance()->getValue('cart_price_rules_floor', 3); -$this->resetObjectManager(); -/** @var \Magento\Store\Model\StoreManager $storeManager */ -$storeManager = $this->getObjectManager()->create('Magento\Store\Model\StoreManager'); -/** @var $category \Magento\Catalog\Model\Category */ -$category = $this->getObjectManager()->get('Magento\Catalog\Model\Category'); -/** @var $model \Magento\SalesRule\Model\Rule*/ -$model = $this->getObjectManager()->get('Magento\SalesRule\Model\Rule'); +/** + * Class CartPriceRulesFixture + */ +class CartPriceRulesFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 70; + + /** + * {@inheritdoc} + */ + public function execute() + { + $this->application->resetObjectManager(); + $cartPriceRulesCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('cart_price_rules', 9); + $cartPriceRulesProductsFloor = \Magento\ToolkitFramework\Config::getInstance()->getValue( + 'cart_price_rules_floor', + 3 + ); -//Get all websites -$categoriesArray = []; -$websites = $storeManager->getWebsites(); -foreach ($websites as $website) { - //Get all groups - $websiteGroups = $website->getGroups(); - foreach ($websiteGroups as $websiteGroup) { - $websiteGroupRootCategory = $websiteGroup->getRootCategoryId(); - $category->load($websiteGroupRootCategory); - $categoryResource = $category->getResource(); - //Get all categories - $resultsCategories = $categoryResource->getAllChildren($category); - foreach ($resultsCategories as $resultsCategory) { - $category->load($resultsCategory); - $structure = explode('/', $category->getPath()); - if (count($structure) > 2) { - $categoriesArray[] = [$category->getId(), $website->getId()]; + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->application->getObjectManager()->create('Magento\Store\Model\StoreManager'); + /** @var $category \Magento\Catalog\Model\Category */ + $category = $this->application->getObjectManager()->get('Magento\Catalog\Model\Category'); + /** @var $model \Magento\SalesRule\Model\Rule*/ + $model = $this->application->getObjectManager()->get('Magento\SalesRule\Model\Rule'); + + //Get all websites + $categoriesArray = []; + $websites = $storeManager->getWebsites(); + foreach ($websites as $website) { + //Get all groups + $websiteGroups = $website->getGroups(); + foreach ($websiteGroups as $websiteGroup) { + $websiteGroupRootCategory = $websiteGroup->getRootCategoryId(); + $category->load($websiteGroupRootCategory); + $categoryResource = $category->getResource(); + //Get all categories + $resultsCategories = $categoryResource->getAllChildren($category); + foreach ($resultsCategories as $resultsCategory) { + $category->load($resultsCategory); + $structure = explode('/', $category->getPath()); + if (count($structure) > 2) { + $categoriesArray[] = [$category->getId(), $website->getId()]; + } + } } } - } -} -asort($categoriesArray); -$categoriesArray = array_values($categoriesArray); -$idField = $model->getIdFieldName(); + asort($categoriesArray); + $categoriesArray = array_values($categoriesArray); + $idField = $model->getIdFieldName(); -for ($i = 0; $i < $cartPriceRulesCount; $i++) { - $ruleName = sprintf('Shopping Cart Price Rule %1$d', $i); - $data = [ - $idField => null, - 'product_ids' => '', - 'name' => $ruleName, - 'description' => '', - 'is_active' => '1', - 'website_ids' => $categoriesArray[$i % count($categoriesArray)][1], - 'customer_group_ids' => [ - 0 => '0', - 1 => '1', - 2 => '2', - 3 => '3', - ], - 'coupon_type' => '1', - 'coupon_code' => '', - 'uses_per_customer' => '', - 'from_date' => '', - 'to_date' => '', - 'sort_order' => '', - 'is_rss' => '1', - 'rule' => [ - 'conditions' => [ - 1 => [ - 'type' => 'Magento\\SalesRule\\Model\\Rule\\Condition\\Combine', - 'aggregator' => 'all', - 'value' => '1', - 'new_child' => '', - ], - '1--1' => [ - 'type' => 'Magento\\SalesRule\\Model\\Rule\\Condition\\Address', - 'attribute' => 'total_qty', - 'operator' => '>=', - 'value' => $cartPriceRulesProductsFloor + $i, + for ($i = 0; $i < $cartPriceRulesCount; $i++) { + $ruleName = sprintf('Shopping Cart Price Rule %1$d', $i); + $data = [ + $idField => null, + 'product_ids' => '', + 'name' => $ruleName, + 'description' => '', + 'is_active' => '1', + 'website_ids' => $categoriesArray[$i % count($categoriesArray)][1], + 'customer_group_ids' => [ + 0 => '0', + 1 => '1', + 2 => '2', + 3 => '3', ], - '1--2' => [ - 'type' => 'Magento\\SalesRule\\Model\\Rule\\Condition\\Product\\Found', - 'value' => '1', - 'aggregator' => 'all', - 'new_child' => '', + 'coupon_type' => '1', + 'coupon_code' => '', + 'uses_per_customer' => '', + 'from_date' => '', + 'to_date' => '', + 'sort_order' => '', + 'is_rss' => '1', + 'rule' => [ + 'conditions' => [ + 1 => [ + 'type' => 'Magento\\SalesRule\\Model\\Rule\\Condition\\Combine', + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + '1--1' => [ + 'type' => 'Magento\\SalesRule\\Model\\Rule\\Condition\\Address', + 'attribute' => 'total_qty', + 'operator' => '>=', + 'value' => $cartPriceRulesProductsFloor + $i, + ], + '1--2' => [ + 'type' => 'Magento\\SalesRule\\Model\\Rule\\Condition\\Product\\Found', + 'value' => '1', + 'aggregator' => 'all', + 'new_child' => '', + ], + '1--2--1' => [ + 'type' => 'Magento\\SalesRule\\Model\\Rule\\Condition\\Product', + 'attribute' => 'category_ids', + 'operator' => '==', + 'value' => $categoriesArray[$i % count($categoriesArray)][0], + ], + ], + 'actions' => [ + 1 => [ + 'type' => 'Magento\\SalesRule\\Model\\Rule\\Condition\\Product\\Combine', + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + ], ], - '1--2--1' => [ - 'type' => 'Magento\\SalesRule\\Model\\Rule\\Condition\\Product', - 'attribute' => 'category_ids', - 'operator' => '==', - 'value' => $categoriesArray[$i % count($categoriesArray)][0], + 'simple_action' => 'by_percent', + 'discount_amount' => '10', + 'discount_qty' => '0', + 'discount_step' => '', + 'apply_to_shipping' => '0', + 'simple_free_shipping' => '0', + 'stop_rules_processing' => '0', + 'reward_points_delta' => '', + 'store_labels' => [ + 0 => '', + 1 => '', + 2 => '', + 3 => '', + 4 => '', + 5 => '', + 6 => '', + 7 => '', + 8 => '', + 9 => '', + 10 => '', + 11 => '', ], - ], - 'actions' => [ - 1 => [ - 'type' => 'Magento\\SalesRule\\Model\\Rule\\Condition\\Product\\Combine', - 'aggregator' => 'all', - 'value' => '1', - 'new_child' => '', + 'page' => '1', + 'limit' => '20', + 'in_banners' => '', + 'banner_id' => [ + 'from' => '', + 'to' => '', ], - ], - ], - 'simple_action' => 'by_percent', - 'discount_amount' => '10', - 'discount_qty' => '0', - 'discount_step' => '', - 'apply_to_shipping' => '0', - 'simple_free_shipping' => '0', - 'stop_rules_processing' => '0', - 'reward_points_delta' => '', - 'store_labels' => [ - 0 => '', - 1 => '', - 2 => '', - 3 => '', - 4 => '', - 5 => '', - 6 => '', - 7 => '', - 8 => '', - 9 => '', - 10 => '', - 11 => '', - ], - 'page' => '1', - 'limit' => '20', - 'in_banners' => '', - 'banner_id' => [ - 'from' => '', - 'to' => '', - ], - 'banner_name' => '', - 'visible_in' => '', - 'banner_is_enabled' => '', - 'related_banners' => [], - ]; - if (isset($data['simple_action']) && $data['simple_action'] == 'by_percent' - && isset($data['discount_amount']) - ) { - $data['discount_amount'] = min(100, $data['discount_amount']); - } - if (isset($data['rule']['conditions'])) { - $data['conditions'] = $data['rule']['conditions']; + 'banner_name' => '', + 'visible_in' => '', + 'banner_is_enabled' => '', + 'related_banners' => [], + ]; + if (isset($data['simple_action']) && $data['simple_action'] == 'by_percent' + && isset($data['discount_amount']) + ) { + $data['discount_amount'] = min(100, $data['discount_amount']); + } + if (isset($data['rule']['conditions'])) { + $data['conditions'] = $data['rule']['conditions']; + } + if (isset($data['rule']['actions'])) { + $data['actions'] = $data['rule']['actions']; + } + unset($data['rule']); + + $model->loadPost($data); + $useAutoGeneration = (int)!empty($data['use_auto_generation']); + $model->setUseAutoGeneration($useAutoGeneration); + $model->save(); + } + } - if (isset($data['rule']['actions'])) { - $data['actions'] = $data['rule']['actions']; + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating shopping cart price rules'; } - unset($data['rule']); - $model->loadPost($data); - $useAutoGeneration = (int)!empty($data['use_auto_generation']); - $model->setUseAutoGeneration($useAutoGeneration); - $model->save(); + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'cart_price_rules' => 'Cart Price Rules' + ]; + } } + +return new CartPriceRulesFixture($this); diff --git a/dev/tools/performance-toolkit/fixtures/catalog_price_rules.php b/dev/tools/performance-toolkit/fixtures/catalog_price_rules.php index a53244e85aafa..8956c18ecaace 100644 --- a/dev/tools/performance-toolkit/fixtures/catalog_price_rules.php +++ b/dev/tools/performance-toolkit/fixtures/catalog_price_rules.php @@ -3,107 +3,145 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -$catalogPriceRulesCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('catalog_price_rules', 3); -$this->resetObjectManager(); -/** @var \Magento\Store\Model\StoreManager $storeManager */ -$storeManager = $this->getObjectManager()->create('Magento\Store\Model\StoreManager'); -/** @var $category \Magento\Catalog\Model\Category */ -$category = $this->getObjectManager()->get('Magento\Catalog\Model\Category'); -/** @var $model \Magento\CatalogRule\Model\Rule*/ -$model = $this->getObjectManager()->get('Magento\CatalogRule\Model\Rule'); -//Get all websites -$categoriesArray = []; -$websites = $storeManager->getWebsites(); -foreach ($websites as $website) { - //Get all groups - $websiteGroups = $website->getGroups(); - foreach ($websiteGroups as $websiteGroup) { - $websiteGroupRootCategory = $websiteGroup->getRootCategoryId(); - $category->load($websiteGroupRootCategory); - $categoryResource = $category->getResource(); - //Get all categories - $resultsCategories = $categoryResource->getAllChildren($category); - foreach ($resultsCategories as $resultsCategory) { - $category->load($resultsCategory); - $structure = explode('/', $category->getPath()); - if (count($structure) > 2) { - $categoriesArray[] = [$category->getId(), $website->getId()]; +/** + * Class CatalogPriceRulesFixture + */ +class CatalogPriceRulesFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 80; + + /** + * {@inheritdoc} + */ + public function execute() + { + $catalogPriceRulesCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('catalog_price_rules', 3); + $this->application->resetObjectManager(); + + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->application->getObjectManager()->create('Magento\Store\Model\StoreManager'); + /** @var $category \Magento\Catalog\Model\Category */ + $category = $this->application->getObjectManager()->get('Magento\Catalog\Model\Category'); + /** @var $model \Magento\CatalogRule\Model\Rule*/ + $model = $this->application->getObjectManager()->get('Magento\CatalogRule\Model\Rule'); + //Get all websites + $categoriesArray = []; + $websites = $storeManager->getWebsites(); + foreach ($websites as $website) { + //Get all groups + $websiteGroups = $website->getGroups(); + foreach ($websiteGroups as $websiteGroup) { + $websiteGroupRootCategory = $websiteGroup->getRootCategoryId(); + $category->load($websiteGroupRootCategory); + $categoryResource = $category->getResource(); + //Get all categories + $resultsCategories = $categoryResource->getAllChildren($category); + foreach ($resultsCategories as $resultsCategory) { + $category->load($resultsCategory); + $structure = explode('/', $category->getPath()); + if (count($structure) > 2) { + $categoriesArray[] = [$category->getId(), $website->getId()]; + } + } } } - } -} -asort($categoriesArray); -$categoriesArray = array_values($categoriesArray); -$idField = $model->getIdFieldName(); + asort($categoriesArray); + $categoriesArray = array_values($categoriesArray); + $idField = $model->getIdFieldName(); -for ($i = 0; $i < $catalogPriceRulesCount; $i++) { - $ruleName = sprintf('Catalog Price Rule %1$d', $i); - $data = [ - $idField => null, - 'name' => $ruleName, - 'description' => '', - 'is_active' => '1', - 'website_ids' => $categoriesArray[$i % count($categoriesArray)][1], - 'customer_group_ids' => [ - 0 => '0', - 1 => '1', - 2 => '2', - 3 => '3', - ], - 'from_date' => '', - 'to_date' => '', - 'sort_order' => '', - 'rule' => [ - 'conditions' => [ - 1 => [ - 'type' => 'Magento\\CatalogRule\\Model\\Rule\\Condition\\Combine', - 'aggregator' => 'all', - 'value' => '1', - 'new_child' => '', + for ($i = 0; $i < $catalogPriceRulesCount; $i++) { + $ruleName = sprintf('Catalog Price Rule %1$d', $i); + $data = [ + $idField => null, + 'name' => $ruleName, + 'description' => '', + 'is_active' => '1', + 'website_ids' => $categoriesArray[$i % count($categoriesArray)][1], + 'customer_group_ids' => [ + 0 => '0', + 1 => '1', + 2 => '2', + 3 => '3', ], - '1--1' => [ - 'type' => 'Magento\\CatalogRule\\Model\\Rule\\Condition\\Product', - 'attribute' => 'category_ids', - 'operator' => '==', - 'value' => $categoriesArray[$i % count($categoriesArray)][0], + 'from_date' => '', + 'to_date' => '', + 'sort_order' => '', + 'rule' => [ + 'conditions' => [ + 1 => [ + 'type' => 'Magento\\CatalogRule\\Model\\Rule\\Condition\\Combine', + 'aggregator' => 'all', + 'value' => '1', + 'new_child' => '', + ], + '1--1' => [ + 'type' => 'Magento\\CatalogRule\\Model\\Rule\\Condition\\Product', + 'attribute' => 'category_ids', + 'operator' => '==', + 'value' => $categoriesArray[$i % count($categoriesArray)][0], + ], + ], ], - ], - ], - 'simple_action' => 'by_percent', - 'discount_amount' => '15', - 'sub_is_enable' => '0', - 'sub_simple_action' => 'by_percent', - 'sub_discount_amount' => '0', - 'stop_rules_processing' => '0', - 'page' => '1', - 'limit' => '20', - 'in_banners' => '1', - 'banner_id' => [ - 'from' => '', - 'to' => '', - ], - 'banner_name' => '', - 'visible_in' => '', - 'banner_is_enabled' => '', - 'related_banners' => [], - ]; - if (isset($data['simple_action']) && $data['simple_action'] == 'by_percent' - && isset($data['discount_amount']) - ) { - $data['discount_amount'] = min(100, $data['discount_amount']); - } - if (isset($data['rule']['conditions'])) { - $data['conditions'] = $data['rule']['conditions']; + 'simple_action' => 'by_percent', + 'discount_amount' => '15', + 'sub_is_enable' => '0', + 'sub_simple_action' => 'by_percent', + 'sub_discount_amount' => '0', + 'stop_rules_processing' => '0', + 'page' => '1', + 'limit' => '20', + 'in_banners' => '1', + 'banner_id' => [ + 'from' => '', + 'to' => '', + ], + 'banner_name' => '', + 'visible_in' => '', + 'banner_is_enabled' => '', + 'related_banners' => [], + ]; + if (isset($data['simple_action']) && $data['simple_action'] == 'by_percent' + && isset($data['discount_amount']) + ) { + $data['discount_amount'] = min(100, $data['discount_amount']); + } + if (isset($data['rule']['conditions'])) { + $data['conditions'] = $data['rule']['conditions']; + } + if (isset($data['rule']['actions'])) { + $data['actions'] = $data['rule']['actions']; + } + unset($data['rule']); + + $model->loadPost($data); + $useAutoGeneration = (int)!empty($data['use_auto_generation']); + $model->setUseAutoGeneration($useAutoGeneration); + $model->save(); + } + } - if (isset($data['rule']['actions'])) { - $data['actions'] = $data['rule']['actions']; + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating catalog price rules'; } - unset($data['rule']); - $model->loadPost($data); - $useAutoGeneration = (int)!empty($data['use_auto_generation']); - $model->setUseAutoGeneration($useAutoGeneration); - $model->save(); + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'catalog_price_rules' => 'Catalog Price Rules' + ]; + } } + +return new CatalogPriceRulesFixture($this); diff --git a/dev/tools/performance-toolkit/fixtures/categories.php b/dev/tools/performance-toolkit/fixtures/categories.php index fa28701b9bf03..b6bc39d83f34a 100644 --- a/dev/tools/performance-toolkit/fixtures/categories.php +++ b/dev/tools/performance-toolkit/fixtures/categories.php @@ -3,58 +3,95 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -$categoriesNumber = \Magento\ToolkitFramework\Config::getInstance()->getValue('categories', 18); -$maxNestingLevel = \Magento\ToolkitFramework\Config::getInstance()->getValue('categories_nesting_level', 3); -$this->resetObjectManager(); - -/** @var \Magento\Store\Model\StoreManager $storeManager */ -$storeManager = $this->getObjectManager()->create('Magento\Store\Model\StoreManager'); -/** @var $category \Magento\Catalog\Model\Category */ -$category = $this->getObjectManager()->create('Magento\Catalog\Model\Category'); - -$groups = []; -$storeGroups = $storeManager->getGroups(); -$i = 0; -foreach ($storeGroups as $storeGroup) { - $parentCategoryId[$i] = $defaultParentCategoryId[$i] = $storeGroup->getRootCategoryId(); - $nestingLevel[$i] = 1; - $nestingPath[$i] = "1/$parentCategoryId[$i]"; - $categoryPath[$i] = ''; - $i++; -} -$groupNumber = 0; -$anchorStep = 2; -$categoryIndex = 1; - -while ($categoryIndex <= $categoriesNumber) { - $category->setId(null) - ->setUrlKey(null) - ->setUrlPath(null) - ->setName("Category $categoryIndex") - ->setParentId($parentCategoryId[$groupNumber]) - ->setPath($nestingPath[$groupNumber]) - ->setLevel($nestingLevel[$groupNumber]) - ->setAvailableSortBy('name') - ->setDefaultSortBy('name') - ->setIsActive(true) - //->setIsAnchor($categoryIndex++ % $anchorStep == 0) - ->save(); - $categoryIndex++; - $categoryPath[$groupNumber] .= '/' . $category->getName(); - - if ($nestingLevel[$groupNumber]++ == $maxNestingLevel) { - $nestingLevel[$groupNumber] = 1; - $parentCategoryId[$groupNumber] = $defaultParentCategoryId[$groupNumber]; - $nestingPath[$groupNumber] = '1'; - $categoryPath[$groupNumber] = ''; - } else { - $parentCategoryId[$groupNumber] = $category->getId(); - } - $nestingPath[$groupNumber] .= "/$parentCategoryId[$groupNumber]"; - $groupNumber++; - if ($groupNumber == count($defaultParentCategoryId)) { +/** + * Class CategoriesFixture + */ +class CategoriesFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 20; + + /** + * {@inheritdoc} + */ + public function execute() + { + $categoriesNumber = \Magento\ToolkitFramework\Config::getInstance()->getValue('categories', 18); + $maxNestingLevel = \Magento\ToolkitFramework\Config::getInstance()->getValue('categories_nesting_level', 3); + $this->application->resetObjectManager(); + + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->application->getObjectManager()->create('Magento\Store\Model\StoreManager'); + /** @var $category \Magento\Catalog\Model\Category */ + $category = $this->application->getObjectManager()->create('Magento\Catalog\Model\Category'); + + $groups = []; + $storeGroups = $storeManager->getGroups(); + $i = 0; + foreach ($storeGroups as $storeGroup) { + $parentCategoryId[$i] = $defaultParentCategoryId[$i] = $storeGroup->getRootCategoryId(); + $nestingLevel[$i] = 1; + $nestingPath[$i] = "1/$parentCategoryId[$i]"; + $categoryPath[$i] = ''; + $i++; + } $groupNumber = 0; + $anchorStep = 2; + $categoryIndex = 1; + + while ($categoryIndex <= $categoriesNumber) { + $category->setId(null) + ->setUrlKey(null) + ->setUrlPath(null) + ->setName("Category $categoryIndex") + ->setParentId($parentCategoryId[$groupNumber]) + ->setPath($nestingPath[$groupNumber]) + ->setLevel($nestingLevel[$groupNumber]) + ->setAvailableSortBy('name') + ->setDefaultSortBy('name') + ->setIsActive(true) + //->setIsAnchor($categoryIndex++ % $anchorStep == 0) + ->save(); + $categoryIndex++; + $categoryPath[$groupNumber] .= '/' . $category->getName(); + + if ($nestingLevel[$groupNumber]++ == $maxNestingLevel) { + $nestingLevel[$groupNumber] = 1; + $parentCategoryId[$groupNumber] = $defaultParentCategoryId[$groupNumber]; + $nestingPath[$groupNumber] = '1'; + $categoryPath[$groupNumber] = ''; + } else { + $parentCategoryId[$groupNumber] = $category->getId(); + } + $nestingPath[$groupNumber] .= "/$parentCategoryId[$groupNumber]"; + + $groupNumber++; + if ($groupNumber == count($defaultParentCategoryId)) { + $groupNumber = 0; + } + } + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating categories'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'categories' => 'Categories' + ]; } } + +return new CategoriesFixture($this); diff --git a/dev/tools/performance-toolkit/fixtures/configurable_products.php b/dev/tools/performance-toolkit/fixtures/configurable_products.php index 14bdd16508dbf..af3a5b5c6cd2b 100644 --- a/dev/tools/performance-toolkit/fixtures/configurable_products.php +++ b/dev/tools/performance-toolkit/fixtures/configurable_products.php @@ -3,858 +3,916 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -$configurablesCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('configurable_products', 90); -$this->resetObjectManager(); -/** @var \Magento\Store\Model\StoreManager $storeManager */ -$storeManager = $this->getObjectManager()->create('Magento\Store\Model\StoreManager'); -/** @var $category \Magento\Catalog\Model\Category */ -$category = $this->getObjectManager()->get('Magento\Catalog\Model\Category'); +/** + * Class ConfigurableProductsFixture + */ +class ConfigurableProductsFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 50; + + /** + * Get CSV template headers + * + * @return array + */ + protected function getHeaders() + { + return [ + 'sku', + '_store', + '_attribute_set', + '_type', + '_category', + '_root_category', + '_product_websites', + 'color', + 'configurable_variations', + 'cost', + 'country_of_manufacture', + 'created_at', + 'custom_design', + 'custom_design_from', + 'custom_design_to', + 'custom_layout_update', + 'description', + 'enable_googlecheckout', + 'gallery', + 'gift_message_available', + 'gift_wrapping_available', + 'gift_wrapping_price', + 'has_options', + 'image', + 'image_label', + 'is_returnable', + 'manufacturer', + 'meta_description', + 'meta_keyword', + 'meta_title', + 'minimal_price', + 'msrp', + 'msrp_display_actual_price_type', + 'name', + 'news_from_date', + 'news_to_date', + 'options_container', + 'page_layout', + 'price', + 'quantity_and_stock_status', + 'related_tgtr_position_behavior', + 'related_tgtr_position_limit', + 'required_options', + 'short_description', + 'small_image', + 'small_image_label', + 'special_from_date', + 'special_price', + 'special_to_date', + 'status', + 'tax_class_id', + 'thumbnail', + 'thumbnail_label', + 'updated_at', + 'upsell_tgtr_position_behavior', + 'upsell_tgtr_position_limit', + 'url_key', + 'url_path', + 'variations', + 'variations_1382710717', + 'variations_1382710773', + 'variations_1382710861', + 'visibility', + 'weight', + 'qty', + 'min_qty', + 'use_config_min_qty', + 'is_qty_decimal', + 'backorders', + 'use_config_backorders', + 'min_sale_qty', + 'use_config_min_sale_qty', + 'max_sale_qty', + 'use_config_max_sale_qty', + 'is_in_stock', + 'notify_stock_qty', + 'use_config_notify_stock_qty', + 'manage_stock', + 'use_config_manage_stock', + 'use_config_qty_increments', + 'qty_increments', + 'use_config_enable_qty_inc', + 'enable_qty_increments', + 'is_decimal_divided', + '_related_sku', + '_related_position', + '_crosssell_sku', + '_crosssell_position', + '_upsell_sku', + '_upsell_position', + '_associated_sku', + '_associated_default_qty', + '_associated_position', + '_tier_price_website', + '_tier_price_customer_group', + '_tier_price_qty', + '_tier_price_price', + '_group_price_website', + '_group_price_customer_group', + '_group_price_price', + '_media_attribute_id', + '_media_image', + '_media_label', + '_media_position', + '_media_is_disabled', + '_super_products_sku', + '_super_attribute_code', + '_super_attribute_option', + '_super_attribute_price_corr', + ]; + } + + /** + * Get CSV template rows + * + * @param Closure|mixed $productCategory + * @param Closure|mixed $productRootCategory + * @param Closure|mixed $productWebsite + * @return array + */ + protected function getRows($productCategory, $productRootCategory, $productWebsite) + { + return [ + [ + 'sku' => 'Configurable Product %s-option 1', + '_store' => '', + '_attribute_set' => 'Default', + '_type' => 'simple', + '_category' => $productCategory, + '_root_category' => $productRootCategory, + '_product_websites' => $productWebsite, + 'color' => '', + 'configurable_variations' => 'option 1', + 'cost' => '', + 'country_of_manufacture' => '', + 'created_at' => '2013-10-25 15:12:32', + 'custom_design' => '', + 'custom_design_from' => '', + 'custom_design_to' => '', + 'custom_layout_update' => '', + 'description' => '

Configurable product description %s

', + 'enable_googlecheckout' => '1', + 'gallery' => '', + 'gift_message_available' => '', + 'gift_wrapping_available' => '', + 'gift_wrapping_price' => '', + 'has_options' => '0', + 'image' => '', + 'image_label' => '', + 'is_returnable' => 'Use config', + 'manufacturer' => '', + 'meta_description' => 'Configurable Product %s

Configurable product description 1

', + 'meta_keyword' => 'Configurable Product 1', + 'meta_title' => 'Configurable Product %s', + 'minimal_price' => '', + 'msrp' => '', + 'msrp_display_actual_price_type' => 'Use config', + 'name' => 'Configurable Product %s-option 1', + 'news_from_date' => '', + 'news_to_date' => '', + 'options_container' => 'Block after Info Column', + 'page_layout' => '', + 'price' => '10.0000', + 'quantity_and_stock_status' => 'In Stock', + 'related_tgtr_position_behavior' => '', + 'related_tgtr_position_limit' => '', + 'required_options' => '0', + 'short_description' => '', + 'small_image' => '', + 'small_image_label' => '', + 'special_from_date' => '', + 'special_price' => '', + 'special_to_date' => '', + 'status' => '1', + 'tax_class_id' => '2', + 'thumbnail' => '', + 'thumbnail_label' => '', + 'updated_at' => '2013-10-25 15:12:32', + 'upsell_tgtr_position_behavior' => '', + 'upsell_tgtr_position_limit' => '', + 'url_key' => 'configurable-product-%s-option-1', + 'url_path' => 'configurable-product-%s-option-1.html', + 'variations' => '', + 'variations_1382710717' => '', + 'variations_1382710773' => '', + 'variations_1382710861' => '', + 'visibility' => '1', + 'weight' => '1.0000', + 'qty' => '111.0000', + 'min_qty' => '0.0000', + 'use_config_min_qty' => '1', + 'is_qty_decimal' => '0', + 'backorders' => '0', + 'use_config_backorders' => '1', + 'min_sale_qty' => '1.0000', + 'use_config_min_sale_qty' => '1', + 'max_sale_qty' => '0.0000', + 'use_config_max_sale_qty' => '1', + 'is_in_stock' => '1', + 'notify_stock_qty' => '', + 'use_config_notify_stock_qty' => '1', + 'manage_stock' => '1', + 'use_config_manage_stock' => '1', + 'use_config_qty_increments' => '1', + 'qty_increments' => '0.0000', + 'use_config_enable_qty_inc' => '1', + 'enable_qty_increments' => '0', + 'is_decimal_divided' => '0', + '_related_sku' => '', + '_related_position' => '', + '_crosssell_sku' => '', + '_crosssell_position' => '', + '_upsell_sku' => '', + '_upsell_position' => '', + '_associated_sku' => '', + '_associated_default_qty' => '', + '_associated_position' => '', + '_tier_price_website' => '', + '_tier_price_customer_group' => '', + '_tier_price_qty' => '', + '_tier_price_price' => '', + '_group_price_website' => '', + '_group_price_customer_group' => '', + '_group_price_price' => '', + '_media_attribute_id' => '', + '_media_image' => '', + '_media_label' => '', + '_media_position' => '', + '_media_is_disabled' => '', + '_super_products_sku' => '', + '_super_attribute_code' => '', + '_super_attribute_option' => '', + '_super_attribute_price_corr' => '', + ], + [ + 'sku' => 'Configurable Product %s-option 2', + '_store' => '', + '_attribute_set' => 'Default', + '_type' => 'simple', + '_category' => $productCategory, + '_root_category' => $productRootCategory, + '_product_websites' => $productWebsite, + 'color' => '', + 'configurable_variations' => 'option 2', + 'cost' => '', + 'country_of_manufacture' => '', + 'created_at' => '2013-10-25 15:12:35', + 'custom_design' => '', + 'custom_design_from' => '', + 'custom_design_to' => '', + 'custom_layout_update' => '', + 'description' => '

Configurable product description %s

', + 'enable_googlecheckout' => '1', + 'gallery' => '', + 'gift_message_available' => '', + 'gift_wrapping_available' => '', + 'gift_wrapping_price' => '', + 'has_options' => '0', + 'image' => '', + 'image_label' => '', + 'is_returnable' => 'Use config', + 'manufacturer' => '', + 'meta_description' => 'Configurable Product %s

Configurable product description 1

', + 'meta_keyword' => 'Configurable Product 1', + 'meta_title' => 'Configurable Product %s', + 'minimal_price' => '', + 'msrp' => '', + 'msrp_display_actual_price_type' => 'Use config', + 'name' => 'Configurable Product %s-option 2', + 'news_from_date' => '', + 'news_to_date' => '', + 'options_container' => 'Block after Info Column', + 'page_layout' => '', + 'price' => '10.0000', + 'quantity_and_stock_status' => 'In Stock', + 'related_tgtr_position_behavior' => '', + 'related_tgtr_position_limit' => '', + 'required_options' => '0', + 'short_description' => '', + 'small_image' => '', + 'small_image_label' => '', + 'special_from_date' => '', + 'special_price' => '', + 'special_to_date' => '', + 'status' => '1', + 'tax_class_id' => '2', + 'thumbnail' => '', + 'thumbnail_label' => '', + 'updated_at' => '2013-10-25 15:12:35', + 'upsell_tgtr_position_behavior' => '', + 'upsell_tgtr_position_limit' => '', + 'url_key' => 'configurable-product-%s-option-2', + 'url_path' => 'configurable-product-%s-option-2.html', + 'variations' => '', + 'variations_1382710717' => '', + 'variations_1382710773' => '', + 'variations_1382710861' => '', + 'visibility' => '1', + 'weight' => '1.0000', + 'qty' => '111.0000', + 'min_qty' => '0.0000', + 'use_config_min_qty' => '1', + 'is_qty_decimal' => '0', + 'backorders' => '0', + 'use_config_backorders' => '1', + 'min_sale_qty' => '1.0000', + 'use_config_min_sale_qty' => '1', + 'max_sale_qty' => '0.0000', + 'use_config_max_sale_qty' => '1', + 'is_in_stock' => '1', + 'notify_stock_qty' => '', + 'use_config_notify_stock_qty' => '1', + 'manage_stock' => '1', + 'use_config_manage_stock' => '1', + 'use_config_qty_increments' => '1', + 'qty_increments' => '0.0000', + 'use_config_enable_qty_inc' => '1', + 'enable_qty_increments' => '0', + 'is_decimal_divided' => '0', + '_related_sku' => '', + '_related_position' => '', + '_crosssell_sku' => '', + '_crosssell_position' => '', + '_upsell_sku' => '', + '_upsell_position' => '', + '_associated_sku' => '', + '_associated_default_qty' => '', + '_associated_position' => '', + '_tier_price_website' => '', + '_tier_price_customer_group' => '', + '_tier_price_qty' => '', + '_tier_price_price' => '', + '_group_price_website' => '', + '_group_price_customer_group' => '', + '_group_price_price' => '', + '_media_attribute_id' => '', + '_media_image' => '', + '_media_label' => '', + '_media_position' => '', + '_media_is_disabled' => '', + '_super_products_sku' => '', + '_super_attribute_code' => '', + '_super_attribute_option' => '', + '_super_attribute_price_corr' => '', + ], + [ + 'sku' => 'Configurable Product %s-option 3', + '_store' => '', + '_attribute_set' => 'Default', + '_type' => 'simple', + '_category' => $productCategory, + '_root_category' => $productRootCategory, + '_product_websites' => $productWebsite, + 'color' => '', + 'configurable_variations' => 'option 3', + 'cost' => '', + 'country_of_manufacture' => '', + 'created_at' => '2013-10-25 15:12:37', + 'custom_design' => '', + 'custom_design_from' => '', + 'custom_design_to' => '', + 'custom_layout_update' => '', + 'description' => '

Configurable product description %s

', + 'enable_googlecheckout' => '1', + 'gallery' => '', + 'gift_message_available' => '', + 'gift_wrapping_available' => '', + 'gift_wrapping_price' => '', + 'has_options' => '0', + 'image' => '', + 'image_label' => '', + 'is_returnable' => 'Use config', + 'manufacturer' => '', + 'meta_description' => 'Configurable Product %s

Configurable product description 1

', + 'meta_keyword' => 'Configurable Product 1', + 'meta_title' => 'Configurable Product %s', + 'minimal_price' => '', + 'msrp' => '', + 'msrp_display_actual_price_type' => 'Use config', + 'name' => 'Configurable Product %s-option 3', + 'news_from_date' => '', + 'news_to_date' => '', + 'options_container' => 'Block after Info Column', + 'page_layout' => '', + 'price' => '10.0000', + 'quantity_and_stock_status' => 'In Stock', + 'related_tgtr_position_behavior' => '', + 'related_tgtr_position_limit' => '', + 'required_options' => '0', + 'short_description' => '', + 'small_image' => '', + 'small_image_label' => '', + 'special_from_date' => '', + 'special_price' => '', + 'special_to_date' => '', + 'status' => '1', + 'tax_class_id' => '2', + 'thumbnail' => '', + 'thumbnail_label' => '', + 'updated_at' => '2013-10-25 15:12:37', + 'upsell_tgtr_position_behavior' => '', + 'upsell_tgtr_position_limit' => '', + 'url_key' => 'configurable-product-%s-option-3', + 'url_path' => 'configurable-product-%s-option-3.html', + 'variations' => '', + 'variations_1382710717' => '', + 'variations_1382710773' => '', + 'variations_1382710861' => '', + 'visibility' => '1', + 'weight' => '1.0000', + 'qty' => '111.0000', + 'min_qty' => '0.0000', + 'use_config_min_qty' => '1', + 'is_qty_decimal' => '0', + 'backorders' => '0', + 'use_config_backorders' => '1', + 'min_sale_qty' => '1.0000', + 'use_config_min_sale_qty' => '1', + 'max_sale_qty' => '0.0000', + 'use_config_max_sale_qty' => '1', + 'is_in_stock' => '1', + 'notify_stock_qty' => '', + 'use_config_notify_stock_qty' => '1', + 'manage_stock' => '1', + 'use_config_manage_stock' => '1', + 'use_config_qty_increments' => '1', + 'qty_increments' => '0.0000', + 'use_config_enable_qty_inc' => '1', + 'enable_qty_increments' => '0', + 'is_decimal_divided' => '0', + '_related_sku' => '', + '_related_position' => '', + '_crosssell_sku' => '', + '_crosssell_position' => '', + '_upsell_sku' => '', + '_upsell_position' => '', + '_associated_sku' => '', + '_associated_default_qty' => '', + '_associated_position' => '', + '_tier_price_website' => '', + '_tier_price_customer_group' => '', + '_tier_price_qty' => '', + '_tier_price_price' => '', + '_group_price_website' => '', + '_group_price_customer_group' => '', + '_group_price_price' => '', + '_media_attribute_id' => '', + '_media_image' => '', + '_media_label' => '', + '_media_position' => '', + '_media_is_disabled' => '', + '_super_products_sku' => '', + '_super_attribute_code' => '', + '_super_attribute_option' => '', + '_super_attribute_price_corr' => '', + ], + [ + 'sku' => 'Configurable Product %s', + '_store' => '', + '_attribute_set' => 'Default', + '_type' => 'configurable', + '_category' => $productCategory, + '_root_category' => $productRootCategory, + '_product_websites' => $productWebsite, + 'color' => '', + 'configurable_variations' => '', + 'cost' => '', + 'country_of_manufacture' => '', + 'created_at' => '2013-10-25 15:12:39', + 'custom_design' => '', + 'custom_design_from' => '', + 'custom_design_to' => '', + 'custom_layout_update' => '', + 'description' => '

Configurable product description %s

', + 'enable_googlecheckout' => '1', + 'gallery' => '', + 'gift_message_available' => '', + 'gift_wrapping_available' => '', + 'gift_wrapping_price' => '', + 'has_options' => '1', + 'image' => '', + 'image_label' => '', + 'is_returnable' => 'Use config', + 'manufacturer' => '', + 'meta_description' => 'Configurable Product %s

Configurable product description %s

', + 'meta_keyword' => 'Configurable Product %s', + 'meta_title' => 'Configurable Product %s', + 'minimal_price' => '', + 'msrp' => '', + 'msrp_display_actual_price_type' => 'Use config', + 'name' => 'Configurable Product %s', + 'news_from_date' => '', + 'news_to_date' => '', + 'options_container' => 'Block after Info Column', + 'page_layout' => '', + 'price' => '10.0000', + 'quantity_and_stock_status' => 'In Stock', + 'related_tgtr_position_behavior' => '', + 'related_tgtr_position_limit' => '', + 'required_options' => '1', + 'short_description' => '', + 'small_image' => '', + 'small_image_label' => '', + 'special_from_date' => '', + 'special_price' => '', + 'special_to_date' => '', + 'status' => '1', + 'tax_class_id' => '2', + 'thumbnail' => '', + 'thumbnail_label' => '', + 'updated_at' => '2013-10-25 15:12:39', + 'upsell_tgtr_position_behavior' => '', + 'upsell_tgtr_position_limit' => '', + 'url_key' => 'configurable-product-%s', + 'url_path' => 'configurable-product-%s.html', + 'variations' => '', + 'variations_1382710717' => '', + 'variations_1382710773' => '', + 'variations_1382710861' => '', + 'visibility' => '4', + 'weight' => '', + 'qty' => 333, + 'min_qty' => '0.0000', + 'use_config_min_qty' => '1', + 'is_qty_decimal' => '0', + 'backorders' => '0', + 'use_config_backorders' => '1', + 'min_sale_qty' => '1.0000', + 'use_config_min_sale_qty' => '1', + 'max_sale_qty' => '0.0000', + 'use_config_max_sale_qty' => '1', + 'is_in_stock' => '1', + 'notify_stock_qty' => '', + 'use_config_notify_stock_qty' => '1', + 'manage_stock' => '1', + 'use_config_manage_stock' => '1', + 'use_config_qty_increments' => '1', + 'qty_increments' => '0.0000', + 'use_config_enable_qty_inc' => '1', + 'enable_qty_increments' => '0', + 'is_decimal_divided' => '0', + '_related_sku' => '', + '_related_position' => '', + '_crosssell_sku' => '', + '_crosssell_position' => '', + '_upsell_sku' => '', + '_upsell_position' => '', + '_associated_sku' => '', + '_associated_default_qty' => '', + '_associated_position' => '', + '_tier_price_website' => '', + '_tier_price_customer_group' => '', + '_tier_price_qty' => '', + '_tier_price_price' => '', + '_group_price_website' => '', + '_group_price_customer_group' => '', + '_group_price_price' => '', + '_media_attribute_id' => '', + '_media_image' => '', + '_media_label' => '', + '_media_position' => '', + '_media_is_disabled' => '', + '_super_products_sku' => 'Configurable Product %s-option 1', + '_super_attribute_code' => 'configurable_variations', + '_super_attribute_option' => 'option 1', + '_super_attribute_price_corr' => '10.0000', + ], + [ + 'sku' => '', + '_store' => '', + '_attribute_set' => '', + '_type' => '', + '_category' => '', + '_root_category' => '', + '_product_websites' => '', + 'color' => '', + 'configurable_variations' => '', + 'cost' => '', + 'country_of_manufacture' => '', + 'created_at' => '', + 'custom_design' => '', + 'custom_design_from' => '', + 'custom_design_to' => '', + 'custom_layout_update' => '', + 'description' => '', + 'enable_googlecheckout' => '', + 'gallery' => '', + 'gift_message_available' => '', + 'gift_wrapping_available' => '', + 'gift_wrapping_price' => '', + 'has_options' => '', + 'image' => '', + 'image_label' => '', + 'is_returnable' => '', + 'manufacturer' => '', + 'meta_description' => '', + 'meta_keyword' => '', + 'meta_title' => '', + 'minimal_price' => '', + 'msrp' => '', + 'msrp_display_actual_price_type' => '', + 'name' => '', + 'news_from_date' => '', + 'news_to_date' => '', + 'options_container' => '', + 'page_layout' => '', + 'price' => '', + 'quantity_and_stock_status' => '', + 'related_tgtr_position_behavior' => '', + 'related_tgtr_position_limit' => '', + 'required_options' => '', + 'short_description' => '', + 'small_image' => '', + 'small_image_label' => '', + 'special_from_date' => '', + 'special_price' => '', + 'special_to_date' => '', + 'status' => '', + 'tax_class_id' => '', + 'thumbnail' => '', + 'thumbnail_label' => '', + 'updated_at' => '', + 'upsell_tgtr_position_behavior' => '', + 'upsell_tgtr_position_limit' => '', + 'url_key' => '', + 'url_path' => '', + 'variations' => '', + 'variations_1382710717' => '', + 'variations_1382710773' => '', + 'variations_1382710861' => '', + 'visibility' => '', + 'weight' => '', + 'qty' => 333, + 'min_qty' => '', + 'use_config_min_qty' => '', + 'is_qty_decimal' => '', + 'backorders' => '', + 'use_config_backorders' => '', + 'min_sale_qty' => '', + 'use_config_min_sale_qty' => '', + 'max_sale_qty' => '', + 'use_config_max_sale_qty' => '', + 'is_in_stock' => '', + 'notify_stock_qty' => '', + 'use_config_notify_stock_qty' => '', + 'manage_stock' => '', + 'use_config_manage_stock' => '', + 'use_config_qty_increments' => '', + 'qty_increments' => '', + 'use_config_enable_qty_inc' => '', + 'enable_qty_increments' => '', + 'is_decimal_divided' => '', + '_related_sku' => '', + '_related_position' => '', + '_crosssell_sku' => '', + '_crosssell_position' => '', + '_upsell_sku' => '', + '_upsell_position' => '', + '_associated_sku' => '', + '_associated_default_qty' => '', + '_associated_position' => '', + '_tier_price_website' => '', + '_tier_price_customer_group' => '', + '_tier_price_qty' => '', + '_tier_price_price' => '', + '_group_price_website' => '', + '_group_price_customer_group' => '', + '_group_price_price' => '', + '_media_attribute_id' => '', + '_media_image' => '', + '_media_label' => '', + '_media_position' => '', + '_media_is_disabled' => '', + '_super_products_sku' => 'Configurable Product %s-option 2', + '_super_attribute_code' => 'configurable_variations', + '_super_attribute_option' => 'option 2', + '_super_attribute_price_corr' => '20.0000', + ], + [ + 'sku' => '', + '_store' => '', + '_attribute_set' => '', + '_type' => '', + '_category' => '', + '_root_category' => '', + '_product_websites' => '', + 'color' => '', + 'configurable_variations' => '', + 'cost' => '', + 'country_of_manufacture' => '', + 'created_at' => '', + 'custom_design' => '', + 'custom_design_from' => '', + 'custom_design_to' => '', + 'custom_layout_update' => '', + 'description' => '', + 'enable_googlecheckout' => '', + 'gallery' => '', + 'gift_message_available' => '', + 'gift_wrapping_available' => '', + 'gift_wrapping_price' => '', + 'has_options' => '', + 'image' => '', + 'image_label' => '', + 'is_returnable' => '', + 'manufacturer' => '', + 'meta_description' => '', + 'meta_keyword' => '', + 'meta_title' => '', + 'minimal_price' => '', + 'msrp' => '', + 'msrp_display_actual_price_type' => '', + 'name' => '', + 'news_from_date' => '', + 'news_to_date' => '', + 'options_container' => '', + 'page_layout' => '', + 'price' => '', + 'quantity_and_stock_status' => '', + 'related_tgtr_position_behavior' => '', + 'related_tgtr_position_limit' => '', + 'required_options' => '', + 'short_description' => '', + 'small_image' => '', + 'small_image_label' => '', + 'special_from_date' => '', + 'special_price' => '', + 'special_to_date' => '', + 'status' => '', + 'tax_class_id' => '', + 'thumbnail' => '', + 'thumbnail_label' => '', + 'updated_at' => '', + 'upsell_tgtr_position_behavior' => '', + 'upsell_tgtr_position_limit' => '', + 'url_key' => '', + 'url_path' => '', + 'variations' => '', + 'variations_1382710717' => '', + 'variations_1382710773' => '', + 'variations_1382710861' => '', + 'visibility' => '', + 'weight' => '', + 'qty' => 333, + 'min_qty' => '', + 'use_config_min_qty' => '', + 'is_qty_decimal' => '', + 'backorders' => '', + 'use_config_backorders' => '', + 'min_sale_qty' => '', + 'use_config_min_sale_qty' => '', + 'max_sale_qty' => '', + 'use_config_max_sale_qty' => '', + 'is_in_stock' => '', + 'notify_stock_qty' => '', + 'use_config_notify_stock_qty' => '', + 'manage_stock' => '', + 'use_config_manage_stock' => '', + 'use_config_qty_increments' => '', + 'qty_increments' => '', + 'use_config_enable_qty_inc' => '', + 'enable_qty_increments' => '', + 'is_decimal_divided' => '', + '_related_sku' => '', + '_related_position' => '', + '_crosssell_sku' => '', + '_crosssell_position' => '', + '_upsell_sku' => '', + '_upsell_position' => '', + '_associated_sku' => '', + '_associated_default_qty' => '', + '_associated_position' => '', + '_tier_price_website' => '', + '_tier_price_customer_group' => '', + '_tier_price_qty' => '', + '_tier_price_price' => '', + '_group_price_website' => '', + '_group_price_customer_group' => '', + '_group_price_price' => '', + '_media_attribute_id' => '', + '_media_image' => '', + '_media_label' => '', + '_media_position' => '', + '_media_is_disabled' => '', + '_super_products_sku' => 'Configurable Product %s-option 3', + '_super_attribute_code' => 'configurable_variations', + '_super_attribute_option' => 'option 3', + '_super_attribute_price_corr' => '30.0000', + ], + ]; -$result = []; -//Get all websites -$websites = $storeManager->getWebsites(); -foreach ($websites as $website) { - $websiteCode = $website->getCode(); - //Get all groups - $websiteGroups = $website->getGroups(); - foreach ($websiteGroups as $websiteGroup) { - $websiteGroupRootCategory = $websiteGroup->getRootCategoryId(); - $category->load($websiteGroupRootCategory); - $categoryResource = $category->getResource(); - $rootCategoryName = $category->getName(); - //Get all categories - $resultsCategories = $categoryResource->getAllChildren($category); - foreach ($resultsCategories as $resultsCategory) { - $category->load($resultsCategory); - $structure = explode('/', $category->getPath()); - $pathSize = count($structure); - if ($pathSize > 1) { - $path = []; - for ($i = 1; $i < $pathSize; $i++) { - $path[] = $category->load($structure[$i])->getName(); + } + + /** + * {@inheritdoc} + */ + public function execute() + { + $configurablesCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('configurable_products', 90); + $this->application->resetObjectManager(); + + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->application->getObjectManager()->create('Magento\Store\Model\StoreManager'); + /** @var $category \Magento\Catalog\Model\Category */ + $category = $this->application->getObjectManager()->get('Magento\Catalog\Model\Category'); + + $result = []; + //Get all websites + $websites = $storeManager->getWebsites(); + foreach ($websites as $website) { + $websiteCode = $website->getCode(); + //Get all groups + $websiteGroups = $website->getGroups(); + foreach ($websiteGroups as $websiteGroup) { + $websiteGroupRootCategory = $websiteGroup->getRootCategoryId(); + $category->load($websiteGroupRootCategory); + $categoryResource = $category->getResource(); + $rootCategoryName = $category->getName(); + //Get all categories + $resultsCategories = $categoryResource->getAllChildren($category); + foreach ($resultsCategories as $resultsCategory) { + $category->load($resultsCategory); + $structure = explode('/', $category->getPath()); + $pathSize = count($structure); + if ($pathSize > 1) { + $path = []; + for ($i = 1; $i < $pathSize; $i++) { + $path[] = $category->load($structure[$i])->getName(); + } + array_shift($path); + $resultsCategoryName = implode('/', $path); + } else { + $resultsCategoryName = $category->getName(); + } + //Deleted root categories + if (trim($resultsCategoryName) != '') { + $result[$resultsCategory] = [$websiteCode, $resultsCategoryName, $rootCategoryName]; + } } - array_shift($path); - $resultsCategoryName = implode('/', $path); - } else { - $resultsCategoryName = $category->getName(); - } - //Deleted root categories - if (trim($resultsCategoryName) != '') { - $result[$resultsCategory] = [$websiteCode, $resultsCategoryName, $rootCategoryName]; } } - } -} -$result = array_values($result); + $result = array_values($result); -$productWebsite = function ($index) use ($result) { - return $result[$index % count($result)][0]; -}; -$productCategory = function ($index) use ($result) { - return $result[$index % count($result)][1]; -}; -$productRootCategory = function ($index) use ($result) { - return $result[$index % count($result)][2]; -}; + $productWebsite = function ($index) use ($result) { + return $result[$index % count($result)][0]; + }; + $productCategory = function ($index) use ($result) { + return $result[$index % count($result)][1]; + }; + $productRootCategory = function ($index) use ($result) { + return $result[$index % count($result)][2]; + }; -$headers = [ - 'sku', - '_store', - '_attribute_set', - '_type', - '_category', - '_root_category', - '_product_websites', - 'color', - 'configurable_variations', - 'cost', - 'country_of_manufacture', - 'created_at', - 'custom_design', - 'custom_design_from', - 'custom_design_to', - 'custom_layout_update', - 'description', - 'enable_googlecheckout', - 'gallery', - 'gift_message_available', - 'gift_wrapping_available', - 'gift_wrapping_price', - 'has_options', - 'image', - 'image_label', - 'is_returnable', - 'manufacturer', - 'meta_description', - 'meta_keyword', - 'meta_title', - 'minimal_price', - 'msrp', - 'msrp_display_actual_price_type', - 'name', - 'news_from_date', - 'news_to_date', - 'options_container', - 'page_layout', - 'price', - 'quantity_and_stock_status', - 'related_tgtr_position_behavior', - 'related_tgtr_position_limit', - 'required_options', - 'short_description', - 'small_image', - 'small_image_label', - 'special_from_date', - 'special_price', - 'special_to_date', - 'status', - 'tax_class_id', - 'thumbnail', - 'thumbnail_label', - 'updated_at', - 'upsell_tgtr_position_behavior', - 'upsell_tgtr_position_limit', - 'url_key', - 'url_path', - 'variations', - 'variations_1382710717', - 'variations_1382710773', - 'variations_1382710861', - 'visibility', - 'weight', - 'qty', - 'min_qty', - 'use_config_min_qty', - 'is_qty_decimal', - 'backorders', - 'use_config_backorders', - 'min_sale_qty', - 'use_config_min_sale_qty', - 'max_sale_qty', - 'use_config_max_sale_qty', - 'is_in_stock', - 'notify_stock_qty', - 'use_config_notify_stock_qty', - 'manage_stock', - 'use_config_manage_stock', - 'use_config_qty_increments', - 'qty_increments', - 'use_config_enable_qty_inc', - 'enable_qty_increments', - 'is_decimal_divided', - '_related_sku', - '_related_position', - '_crosssell_sku', - '_crosssell_position', - '_upsell_sku', - '_upsell_position', - '_associated_sku', - '_associated_default_qty', - '_associated_position', - '_tier_price_website', - '_tier_price_customer_group', - '_tier_price_qty', - '_tier_price_price', - '_group_price_website', - '_group_price_customer_group', - '_group_price_price', - '_media_attribute_id', - '_media_image', - '_media_label', - '_media_position', - '_media_is_disabled', - '_super_products_sku', - '_super_attribute_code', - '_super_attribute_option', - '_super_attribute_price_corr', -]; + /** + * Create configurable products + */ + $pattern = new \Magento\ToolkitFramework\ImportExport\Fixture\Complex\Pattern(); + $pattern->setHeaders($this->getHeaders()); + $pattern->setRowsSet($this->getRows($productCategory, $productRootCategory, $productWebsite)); -$rows = [ - [ - 'sku' => 'Configurable Product %s-option 1', - '_store' => '', - '_attribute_set' => 'Default', - '_type' => 'simple', - '_category' => $productCategory, - '_root_category' => $productRootCategory, - '_product_websites' => $productWebsite, - 'color' => '', - 'configurable_variations' => 'option 1', - 'cost' => '', - 'country_of_manufacture' => '', - 'created_at' => '2013-10-25 15:12:32', - 'custom_design' => '', - 'custom_design_from' => '', - 'custom_design_to' => '', - 'custom_layout_update' => '', - 'description' => '

Configurable product description %s

', - 'enable_googlecheckout' => '1', - 'gallery' => '', - 'gift_message_available' => '', - 'gift_wrapping_available' => '', - 'gift_wrapping_price' => '', - 'has_options' => '0', - 'image' => '', - 'image_label' => '', - 'is_returnable' => 'Use config', - 'manufacturer' => '', - 'meta_description' => 'Configurable Product %s

Configurable product description 1

', - 'meta_keyword' => 'Configurable Product 1', - 'meta_title' => 'Configurable Product %s', - 'minimal_price' => '', - 'msrp' => '', - 'msrp_display_actual_price_type' => 'Use config', - 'name' => 'Configurable Product %s-option 1', - 'news_from_date' => '', - 'news_to_date' => '', - 'options_container' => 'Block after Info Column', - 'page_layout' => '', - 'price' => '10.0000', - 'quantity_and_stock_status' => 'In Stock', - 'related_tgtr_position_behavior' => '', - 'related_tgtr_position_limit' => '', - 'required_options' => '0', - 'short_description' => '', - 'small_image' => '', - 'small_image_label' => '', - 'special_from_date' => '', - 'special_price' => '', - 'special_to_date' => '', - 'status' => '1', - 'tax_class_id' => '2', - 'thumbnail' => '', - 'thumbnail_label' => '', - 'updated_at' => '2013-10-25 15:12:32', - 'upsell_tgtr_position_behavior' => '', - 'upsell_tgtr_position_limit' => '', - 'url_key' => 'configurable-product-%s-option-1', - 'url_path' => 'configurable-product-%s-option-1.html', - 'variations' => '', - 'variations_1382710717' => '', - 'variations_1382710773' => '', - 'variations_1382710861' => '', - 'visibility' => '1', - 'weight' => '1.0000', - 'qty' => '111.0000', - 'min_qty' => '0.0000', - 'use_config_min_qty' => '1', - 'is_qty_decimal' => '0', - 'backorders' => '0', - 'use_config_backorders' => '1', - 'min_sale_qty' => '1.0000', - 'use_config_min_sale_qty' => '1', - 'max_sale_qty' => '0.0000', - 'use_config_max_sale_qty' => '1', - 'is_in_stock' => '1', - 'notify_stock_qty' => '', - 'use_config_notify_stock_qty' => '1', - 'manage_stock' => '1', - 'use_config_manage_stock' => '1', - 'use_config_qty_increments' => '1', - 'qty_increments' => '0.0000', - 'use_config_enable_qty_inc' => '1', - 'enable_qty_increments' => '0', - 'is_decimal_divided' => '0', - '_related_sku' => '', - '_related_position' => '', - '_crosssell_sku' => '', - '_crosssell_position' => '', - '_upsell_sku' => '', - '_upsell_position' => '', - '_associated_sku' => '', - '_associated_default_qty' => '', - '_associated_position' => '', - '_tier_price_website' => '', - '_tier_price_customer_group' => '', - '_tier_price_qty' => '', - '_tier_price_price' => '', - '_group_price_website' => '', - '_group_price_customer_group' => '', - '_group_price_price' => '', - '_media_attribute_id' => '', - '_media_image' => '', - '_media_label' => '', - '_media_position' => '', - '_media_is_disabled' => '', - '_super_products_sku' => '', - '_super_attribute_code' => '', - '_super_attribute_option' => '', - '_super_attribute_price_corr' => '', - ], - [ - 'sku' => 'Configurable Product %s-option 2', - '_store' => '', - '_attribute_set' => 'Default', - '_type' => 'simple', - '_category' => $productCategory, - '_root_category' => $productRootCategory, - '_product_websites' => $productWebsite, - 'color' => '', - 'configurable_variations' => 'option 2', - 'cost' => '', - 'country_of_manufacture' => '', - 'created_at' => '2013-10-25 15:12:35', - 'custom_design' => '', - 'custom_design_from' => '', - 'custom_design_to' => '', - 'custom_layout_update' => '', - 'description' => '

Configurable product description %s

', - 'enable_googlecheckout' => '1', - 'gallery' => '', - 'gift_message_available' => '', - 'gift_wrapping_available' => '', - 'gift_wrapping_price' => '', - 'has_options' => '0', - 'image' => '', - 'image_label' => '', - 'is_returnable' => 'Use config', - 'manufacturer' => '', - 'meta_description' => 'Configurable Product %s

Configurable product description 1

', - 'meta_keyword' => 'Configurable Product 1', - 'meta_title' => 'Configurable Product %s', - 'minimal_price' => '', - 'msrp' => '', - 'msrp_display_actual_price_type' => 'Use config', - 'name' => 'Configurable Product %s-option 2', - 'news_from_date' => '', - 'news_to_date' => '', - 'options_container' => 'Block after Info Column', - 'page_layout' => '', - 'price' => '10.0000', - 'quantity_and_stock_status' => 'In Stock', - 'related_tgtr_position_behavior' => '', - 'related_tgtr_position_limit' => '', - 'required_options' => '0', - 'short_description' => '', - 'small_image' => '', - 'small_image_label' => '', - 'special_from_date' => '', - 'special_price' => '', - 'special_to_date' => '', - 'status' => '1', - 'tax_class_id' => '2', - 'thumbnail' => '', - 'thumbnail_label' => '', - 'updated_at' => '2013-10-25 15:12:35', - 'upsell_tgtr_position_behavior' => '', - 'upsell_tgtr_position_limit' => '', - 'url_key' => 'configurable-product-%s-option-2', - 'url_path' => 'configurable-product-%s-option-2.html', - 'variations' => '', - 'variations_1382710717' => '', - 'variations_1382710773' => '', - 'variations_1382710861' => '', - 'visibility' => '1', - 'weight' => '1.0000', - 'qty' => '111.0000', - 'min_qty' => '0.0000', - 'use_config_min_qty' => '1', - 'is_qty_decimal' => '0', - 'backorders' => '0', - 'use_config_backorders' => '1', - 'min_sale_qty' => '1.0000', - 'use_config_min_sale_qty' => '1', - 'max_sale_qty' => '0.0000', - 'use_config_max_sale_qty' => '1', - 'is_in_stock' => '1', - 'notify_stock_qty' => '', - 'use_config_notify_stock_qty' => '1', - 'manage_stock' => '1', - 'use_config_manage_stock' => '1', - 'use_config_qty_increments' => '1', - 'qty_increments' => '0.0000', - 'use_config_enable_qty_inc' => '1', - 'enable_qty_increments' => '0', - 'is_decimal_divided' => '0', - '_related_sku' => '', - '_related_position' => '', - '_crosssell_sku' => '', - '_crosssell_position' => '', - '_upsell_sku' => '', - '_upsell_position' => '', - '_associated_sku' => '', - '_associated_default_qty' => '', - '_associated_position' => '', - '_tier_price_website' => '', - '_tier_price_customer_group' => '', - '_tier_price_qty' => '', - '_tier_price_price' => '', - '_group_price_website' => '', - '_group_price_customer_group' => '', - '_group_price_price' => '', - '_media_attribute_id' => '', - '_media_image' => '', - '_media_label' => '', - '_media_position' => '', - '_media_is_disabled' => '', - '_super_products_sku' => '', - '_super_attribute_code' => '', - '_super_attribute_option' => '', - '_super_attribute_price_corr' => '', - ], - [ - 'sku' => 'Configurable Product %s-option 3', - '_store' => '', - '_attribute_set' => 'Default', - '_type' => 'simple', - '_category' => $productCategory, - '_root_category' => $productRootCategory, - '_product_websites' => $productWebsite, - 'color' => '', - 'configurable_variations' => 'option 3', - 'cost' => '', - 'country_of_manufacture' => '', - 'created_at' => '2013-10-25 15:12:37', - 'custom_design' => '', - 'custom_design_from' => '', - 'custom_design_to' => '', - 'custom_layout_update' => '', - 'description' => '

Configurable product description %s

', - 'enable_googlecheckout' => '1', - 'gallery' => '', - 'gift_message_available' => '', - 'gift_wrapping_available' => '', - 'gift_wrapping_price' => '', - 'has_options' => '0', - 'image' => '', - 'image_label' => '', - 'is_returnable' => 'Use config', - 'manufacturer' => '', - 'meta_description' => 'Configurable Product %s

Configurable product description 1

', - 'meta_keyword' => 'Configurable Product 1', - 'meta_title' => 'Configurable Product %s', - 'minimal_price' => '', - 'msrp' => '', - 'msrp_display_actual_price_type' => 'Use config', - 'name' => 'Configurable Product %s-option 3', - 'news_from_date' => '', - 'news_to_date' => '', - 'options_container' => 'Block after Info Column', - 'page_layout' => '', - 'price' => '10.0000', - 'quantity_and_stock_status' => 'In Stock', - 'related_tgtr_position_behavior' => '', - 'related_tgtr_position_limit' => '', - 'required_options' => '0', - 'short_description' => '', - 'small_image' => '', - 'small_image_label' => '', - 'special_from_date' => '', - 'special_price' => '', - 'special_to_date' => '', - 'status' => '1', - 'tax_class_id' => '2', - 'thumbnail' => '', - 'thumbnail_label' => '', - 'updated_at' => '2013-10-25 15:12:37', - 'upsell_tgtr_position_behavior' => '', - 'upsell_tgtr_position_limit' => '', - 'url_key' => 'configurable-product-%s-option-3', - 'url_path' => 'configurable-product-%s-option-3.html', - 'variations' => '', - 'variations_1382710717' => '', - 'variations_1382710773' => '', - 'variations_1382710861' => '', - 'visibility' => '1', - 'weight' => '1.0000', - 'qty' => '111.0000', - 'min_qty' => '0.0000', - 'use_config_min_qty' => '1', - 'is_qty_decimal' => '0', - 'backorders' => '0', - 'use_config_backorders' => '1', - 'min_sale_qty' => '1.0000', - 'use_config_min_sale_qty' => '1', - 'max_sale_qty' => '0.0000', - 'use_config_max_sale_qty' => '1', - 'is_in_stock' => '1', - 'notify_stock_qty' => '', - 'use_config_notify_stock_qty' => '1', - 'manage_stock' => '1', - 'use_config_manage_stock' => '1', - 'use_config_qty_increments' => '1', - 'qty_increments' => '0.0000', - 'use_config_enable_qty_inc' => '1', - 'enable_qty_increments' => '0', - 'is_decimal_divided' => '0', - '_related_sku' => '', - '_related_position' => '', - '_crosssell_sku' => '', - '_crosssell_position' => '', - '_upsell_sku' => '', - '_upsell_position' => '', - '_associated_sku' => '', - '_associated_default_qty' => '', - '_associated_position' => '', - '_tier_price_website' => '', - '_tier_price_customer_group' => '', - '_tier_price_qty' => '', - '_tier_price_price' => '', - '_group_price_website' => '', - '_group_price_customer_group' => '', - '_group_price_price' => '', - '_media_attribute_id' => '', - '_media_image' => '', - '_media_label' => '', - '_media_position' => '', - '_media_is_disabled' => '', - '_super_products_sku' => '', - '_super_attribute_code' => '', - '_super_attribute_option' => '', - '_super_attribute_price_corr' => '', - ], - [ - 'sku' => 'Configurable Product %s', - '_store' => '', - '_attribute_set' => 'Default', - '_type' => 'configurable', - '_category' => $productCategory, - '_root_category' => $productRootCategory, - '_product_websites' => $productWebsite, - 'color' => '', - 'configurable_variations' => '', - 'cost' => '', - 'country_of_manufacture' => '', - 'created_at' => '2013-10-25 15:12:39', - 'custom_design' => '', - 'custom_design_from' => '', - 'custom_design_to' => '', - 'custom_layout_update' => '', - 'description' => '

Configurable product description %s

', - 'enable_googlecheckout' => '1', - 'gallery' => '', - 'gift_message_available' => '', - 'gift_wrapping_available' => '', - 'gift_wrapping_price' => '', - 'has_options' => '1', - 'image' => '', - 'image_label' => '', - 'is_returnable' => 'Use config', - 'manufacturer' => '', - 'meta_description' => 'Configurable Product %s

Configurable product description %s

', - 'meta_keyword' => 'Configurable Product %s', - 'meta_title' => 'Configurable Product %s', - 'minimal_price' => '', - 'msrp' => '', - 'msrp_display_actual_price_type' => 'Use config', - 'name' => 'Configurable Product %s', - 'news_from_date' => '', - 'news_to_date' => '', - 'options_container' => 'Block after Info Column', - 'page_layout' => '', - 'price' => '10.0000', - 'quantity_and_stock_status' => 'In Stock', - 'related_tgtr_position_behavior' => '', - 'related_tgtr_position_limit' => '', - 'required_options' => '1', - 'short_description' => '', - 'small_image' => '', - 'small_image_label' => '', - 'special_from_date' => '', - 'special_price' => '', - 'special_to_date' => '', - 'status' => '1', - 'tax_class_id' => '2', - 'thumbnail' => '', - 'thumbnail_label' => '', - 'updated_at' => '2013-10-25 15:12:39', - 'upsell_tgtr_position_behavior' => '', - 'upsell_tgtr_position_limit' => '', - 'url_key' => 'configurable-product-%s', - 'url_path' => 'configurable-product-%s.html', - 'variations' => '', - 'variations_1382710717' => '', - 'variations_1382710773' => '', - 'variations_1382710861' => '', - 'visibility' => '4', - 'weight' => '', - 'qty' => 333, - 'min_qty' => '0.0000', - 'use_config_min_qty' => '1', - 'is_qty_decimal' => '0', - 'backorders' => '0', - 'use_config_backorders' => '1', - 'min_sale_qty' => '1.0000', - 'use_config_min_sale_qty' => '1', - 'max_sale_qty' => '0.0000', - 'use_config_max_sale_qty' => '1', - 'is_in_stock' => '1', - 'notify_stock_qty' => '', - 'use_config_notify_stock_qty' => '1', - 'manage_stock' => '1', - 'use_config_manage_stock' => '1', - 'use_config_qty_increments' => '1', - 'qty_increments' => '0.0000', - 'use_config_enable_qty_inc' => '1', - 'enable_qty_increments' => '0', - 'is_decimal_divided' => '0', - '_related_sku' => '', - '_related_position' => '', - '_crosssell_sku' => '', - '_crosssell_position' => '', - '_upsell_sku' => '', - '_upsell_position' => '', - '_associated_sku' => '', - '_associated_default_qty' => '', - '_associated_position' => '', - '_tier_price_website' => '', - '_tier_price_customer_group' => '', - '_tier_price_qty' => '', - '_tier_price_price' => '', - '_group_price_website' => '', - '_group_price_customer_group' => '', - '_group_price_price' => '', - '_media_attribute_id' => '', - '_media_image' => '', - '_media_label' => '', - '_media_position' => '', - '_media_is_disabled' => '', - '_super_products_sku' => 'Configurable Product %s-option 1', - '_super_attribute_code' => 'configurable_variations', - '_super_attribute_option' => 'option 1', - '_super_attribute_price_corr' => '10.0000', - ], - [ - 'sku' => '', - '_store' => '', - '_attribute_set' => '', - '_type' => '', - '_category' => '', - '_root_category' => '', - '_product_websites' => '', - 'color' => '', - 'configurable_variations' => '', - 'cost' => '', - 'country_of_manufacture' => '', - 'created_at' => '', - 'custom_design' => '', - 'custom_design_from' => '', - 'custom_design_to' => '', - 'custom_layout_update' => '', - 'description' => '', - 'enable_googlecheckout' => '', - 'gallery' => '', - 'gift_message_available' => '', - 'gift_wrapping_available' => '', - 'gift_wrapping_price' => '', - 'has_options' => '', - 'image' => '', - 'image_label' => '', - 'is_returnable' => '', - 'manufacturer' => '', - 'meta_description' => '', - 'meta_keyword' => '', - 'meta_title' => '', - 'minimal_price' => '', - 'msrp' => '', - 'msrp_display_actual_price_type' => '', - 'name' => '', - 'news_from_date' => '', - 'news_to_date' => '', - 'options_container' => '', - 'page_layout' => '', - 'price' => '', - 'quantity_and_stock_status' => '', - 'related_tgtr_position_behavior' => '', - 'related_tgtr_position_limit' => '', - 'required_options' => '', - 'short_description' => '', - 'small_image' => '', - 'small_image_label' => '', - 'special_from_date' => '', - 'special_price' => '', - 'special_to_date' => '', - 'status' => '', - 'tax_class_id' => '', - 'thumbnail' => '', - 'thumbnail_label' => '', - 'updated_at' => '', - 'upsell_tgtr_position_behavior' => '', - 'upsell_tgtr_position_limit' => '', - 'url_key' => '', - 'url_path' => '', - 'variations' => '', - 'variations_1382710717' => '', - 'variations_1382710773' => '', - 'variations_1382710861' => '', - 'visibility' => '', - 'weight' => '', - 'qty' => 333, - 'min_qty' => '', - 'use_config_min_qty' => '', - 'is_qty_decimal' => '', - 'backorders' => '', - 'use_config_backorders' => '', - 'min_sale_qty' => '', - 'use_config_min_sale_qty' => '', - 'max_sale_qty' => '', - 'use_config_max_sale_qty' => '', - 'is_in_stock' => '', - 'notify_stock_qty' => '', - 'use_config_notify_stock_qty' => '', - 'manage_stock' => '', - 'use_config_manage_stock' => '', - 'use_config_qty_increments' => '', - 'qty_increments' => '', - 'use_config_enable_qty_inc' => '', - 'enable_qty_increments' => '', - 'is_decimal_divided' => '', - '_related_sku' => '', - '_related_position' => '', - '_crosssell_sku' => '', - '_crosssell_position' => '', - '_upsell_sku' => '', - '_upsell_position' => '', - '_associated_sku' => '', - '_associated_default_qty' => '', - '_associated_position' => '', - '_tier_price_website' => '', - '_tier_price_customer_group' => '', - '_tier_price_qty' => '', - '_tier_price_price' => '', - '_group_price_website' => '', - '_group_price_customer_group' => '', - '_group_price_price' => '', - '_media_attribute_id' => '', - '_media_image' => '', - '_media_label' => '', - '_media_position' => '', - '_media_is_disabled' => '', - '_super_products_sku' => 'Configurable Product %s-option 2', - '_super_attribute_code' => 'configurable_variations', - '_super_attribute_option' => 'option 2', - '_super_attribute_price_corr' => '20.0000', - ], - [ - 'sku' => '', - '_store' => '', - '_attribute_set' => '', - '_type' => '', - '_category' => '', - '_root_category' => '', - '_product_websites' => '', - 'color' => '', - 'configurable_variations' => '', - 'cost' => '', - 'country_of_manufacture' => '', - 'created_at' => '', - 'custom_design' => '', - 'custom_design_from' => '', - 'custom_design_to' => '', - 'custom_layout_update' => '', - 'description' => '', - 'enable_googlecheckout' => '', - 'gallery' => '', - 'gift_message_available' => '', - 'gift_wrapping_available' => '', - 'gift_wrapping_price' => '', - 'has_options' => '', - 'image' => '', - 'image_label' => '', - 'is_returnable' => '', - 'manufacturer' => '', - 'meta_description' => '', - 'meta_keyword' => '', - 'meta_title' => '', - 'minimal_price' => '', - 'msrp' => '', - 'msrp_display_actual_price_type' => '', - 'name' => '', - 'news_from_date' => '', - 'news_to_date' => '', - 'options_container' => '', - 'page_layout' => '', - 'price' => '', - 'quantity_and_stock_status' => '', - 'related_tgtr_position_behavior' => '', - 'related_tgtr_position_limit' => '', - 'required_options' => '', - 'short_description' => '', - 'small_image' => '', - 'small_image_label' => '', - 'special_from_date' => '', - 'special_price' => '', - 'special_to_date' => '', - 'status' => '', - 'tax_class_id' => '', - 'thumbnail' => '', - 'thumbnail_label' => '', - 'updated_at' => '', - 'upsell_tgtr_position_behavior' => '', - 'upsell_tgtr_position_limit' => '', - 'url_key' => '', - 'url_path' => '', - 'variations' => '', - 'variations_1382710717' => '', - 'variations_1382710773' => '', - 'variations_1382710861' => '', - 'visibility' => '', - 'weight' => '', - 'qty' => 333, - 'min_qty' => '', - 'use_config_min_qty' => '', - 'is_qty_decimal' => '', - 'backorders' => '', - 'use_config_backorders' => '', - 'min_sale_qty' => '', - 'use_config_min_sale_qty' => '', - 'max_sale_qty' => '', - 'use_config_max_sale_qty' => '', - 'is_in_stock' => '', - 'notify_stock_qty' => '', - 'use_config_notify_stock_qty' => '', - 'manage_stock' => '', - 'use_config_manage_stock' => '', - 'use_config_qty_increments' => '', - 'qty_increments' => '', - 'use_config_enable_qty_inc' => '', - 'enable_qty_increments' => '', - 'is_decimal_divided' => '', - '_related_sku' => '', - '_related_position' => '', - '_crosssell_sku' => '', - '_crosssell_position' => '', - '_upsell_sku' => '', - '_upsell_position' => '', - '_associated_sku' => '', - '_associated_default_qty' => '', - '_associated_position' => '', - '_tier_price_website' => '', - '_tier_price_customer_group' => '', - '_tier_price_qty' => '', - '_tier_price_price' => '', - '_group_price_website' => '', - '_group_price_customer_group' => '', - '_group_price_price' => '', - '_media_attribute_id' => '', - '_media_image' => '', - '_media_label' => '', - '_media_position' => '', - '_media_is_disabled' => '', - '_super_products_sku' => 'Configurable Product %s-option 3', - '_super_attribute_code' => 'configurable_variations', - '_super_attribute_option' => 'option 3', - '_super_attribute_price_corr' => '30.0000', - ], -]; + /** @var \Magento\ImportExport\Model\Import $import */ + $import = $this->application->getObjectManager()->create( + 'Magento\ImportExport\Model\Import', + ['data' => ['entity' => 'catalog_product', 'behavior' => 'append']] + ); -/** - * Create configurable products - */ -$pattern = new \Magento\ToolkitFramework\ImportExport\Fixture\Complex\Pattern(); -$pattern->setHeaders($headers); -$pattern->setRowsSet($rows); + $source = new \Magento\ToolkitFramework\ImportExport\Fixture\Complex\Generator($pattern, $configurablesCount); + // it is not obvious, but the validateSource() will actually save import queue data to DB + $import->validateSource($source); + // this converts import queue into actual entities + $import->importSource(); + + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating configurable products'; + } -/** @var \Magento\ImportExport\Model\Import $import */ -$import = $this->getObjectManager()->create( - 'Magento\ImportExport\Model\Import', - ['data' => ['entity' => 'catalog_product', 'behavior' => 'append']] -); + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'configurable_products' => 'Configurable products' + ]; + } +} -$source = new \Magento\ToolkitFramework\ImportExport\Fixture\Complex\Generator($pattern, $configurablesCount); -// it is not obvious, but the validateSource() will actually save import queue data to DB -$import->validateSource($source); -// this converts import queue into actual entities -$import->importSource(); +return new ConfigurableProductsFixture($this); diff --git a/dev/tools/performance-toolkit/fixtures/customers.php b/dev/tools/performance-toolkit/fixtures/customers.php index 33fe42eb63baa..df42bc283a221 100644 --- a/dev/tools/performance-toolkit/fixtures/customers.php +++ b/dev/tools/performance-toolkit/fixtures/customers.php @@ -3,80 +3,117 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -$customersNumber = \Magento\ToolkitFramework\Config::getInstance()->getValue('customers', 10); -$this->resetObjectManager(); -/** @var \Magento\Store\Model\StoreManager $storeManager */ -$storeManager = $this->getObjectManager()->create('Magento\Store\Model\StoreManager'); -/** @var $category \Magento\Catalog\Model\Category */ -$category = $this->getObjectManager()->get('Magento\Catalog\Model\Category'); -/** @var $defaultStoreView \Magento\Store\Model\Store */ -$defaultStoreView = $storeManager->getDefaultStoreView(); -$defaultStoreViewId = $defaultStoreView->getStoreId(); -$defaultStoreViewCode = $defaultStoreView->getCode(); +/** + * Class CustomersFixture + */ +class CustomersFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 60; -$result = []; -//Get all websites -$websites = $storeManager->getWebsites(); -foreach ($websites as $website) { - $result[] = $website->getCode(); -} -$result = array_values($result); + /** + * {@inheritdoc} + */ + public function execute() + { + $customersNumber = \Magento\ToolkitFramework\Config::getInstance()->getValue('customers', 10); + $this->application->resetObjectManager(); + + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->application->getObjectManager()->create('Magento\Store\Model\StoreManager'); + /** @var $category \Magento\Catalog\Model\Category */ + $category = $this->application->getObjectManager()->get('Magento\Catalog\Model\Category'); + /** @var $defaultStoreView \Magento\Store\Model\Store */ + $defaultStoreView = $storeManager->getDefaultStoreView(); + $defaultStoreViewId = $defaultStoreView->getStoreId(); + $defaultStoreViewCode = $defaultStoreView->getCode(); + + $result = []; + //Get all websites + $websites = $storeManager->getWebsites(); + foreach ($websites as $website) { + $result[] = $website->getCode(); + } + $result = array_values($result); -$productWebsite = function ($index) use ($result) { - return $result[$index % count($result)]; -}; + $productWebsite = function ($index) use ($result) { + return $result[$index % count($result)]; + }; + + $pattern = [ + 'email' => 'user_%s@example.com', + '_website' => $productWebsite, + '_store' => $defaultStoreViewCode, + 'confirmation' => null, + 'created_at' => '30-08-2012 17:43', + 'created_in' => 'Default', + 'default_billing' => '1', + 'default_shipping' => '1', + 'disable_auto_group_change' => '0', + 'dob' => '12-10-1991', + 'firstname' => 'Firstname', + 'gender' => 'Male', + 'group_id' => '1', + 'lastname' => 'Lastname', + 'middlename' => '', + 'password_hash' => '', + 'prefix' => null, + 'rp_token' => null, + 'rp_token_created_at' => null, + 'store_id' => $defaultStoreViewId, + 'suffix' => null, + 'taxvat' => null, + 'website_id' => '1', + 'password' => '123123q', + '_address_city' => 'Fayetteville', + '_address_company' => '', + '_address_country_id' => 'US', + '_address_fax' => '', + '_address_firstname' => 'Anthony', + '_address_lastname' => 'Nealy', + '_address_middlename' => '', + '_address_postcode' => '123123', + '_address_prefix' => '', + '_address_region' => 'Arkansas', + '_address_street' => '123 Freedom Blvd. #123', + '_address_suffix' => '', + '_address_telephone' => '022-333-4455', + '_address_vat_id' => '', + '_address_default_billing_' => '1', + '_address_default_shipping_' => '1', + ]; + $generator = new \Magento\ToolkitFramework\ImportExport\Fixture\Generator($pattern, $customersNumber); + /** @var Magento\ImportExport\Model\Import $import */ + $import = $this->application->getObjectManager()->create( + 'Magento\ImportExport\Model\Import', + ['data' => ['entity' => 'customer_composite', 'behavior' => 'append']] + ); + // it is not obvious, but the validateSource() will actually save import queue data to DB + $import->validateSource($generator); + // this converts import queue into actual entities + $import->importSource(); + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating customers'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'customers' => 'Customers' + ]; + } +} -$pattern = [ - 'email' => 'user_%s@example.com', - '_website' => $productWebsite, - '_store' => $defaultStoreViewCode, - 'confirmation' => null, - 'created_at' => '30-08-2012 17:43', - 'created_in' => 'Default', - 'default_billing' => '1', - 'default_shipping' => '1', - 'disable_auto_group_change' => '0', - 'dob' => '12-10-1991', - 'firstname' => 'Firstname', - 'gender' => 'Male', - 'group_id' => '1', - 'lastname' => 'Lastname', - 'middlename' => '', - 'password_hash' => '', - 'prefix' => null, - 'rp_token' => null, - 'rp_token_created_at' => null, - 'store_id' => $defaultStoreViewId, - 'suffix' => null, - 'taxvat' => null, - 'website_id' => '1', - 'password' => '123123q', - '_address_city' => 'Fayetteville', - '_address_company' => '', - '_address_country_id' => 'US', - '_address_fax' => '', - '_address_firstname' => 'Anthony', - '_address_lastname' => 'Nealy', - '_address_middlename' => '', - '_address_postcode' => '123123', - '_address_prefix' => '', - '_address_region' => 'Arkansas', - '_address_street' => '123 Freedom Blvd. #123', - '_address_suffix' => '', - '_address_telephone' => '022-333-4455', - '_address_vat_id' => '', - '_address_default_billing_' => '1', - '_address_default_shipping_' => '1', -]; -$generator = new \Magento\ToolkitFramework\ImportExport\Fixture\Generator($pattern, $customersNumber); -/** @var Magento\ImportExport\Model\Import $import */ -$import = $this->getObjectManager()->create( - 'Magento\ImportExport\Model\Import', - ['data' => ['entity' => 'customer_composite', 'behavior' => 'append']] -); -// it is not obvious, but the validateSource() will actually save import queue data to DB -$import->validateSource($generator); -// this converts import queue into actual entities -$import->importSource(); +return new CustomersFixture($this); diff --git a/dev/tools/performance-toolkit/fixtures/disable_form_key_usage.php b/dev/tools/performance-toolkit/fixtures/disable_form_key_usage.php index f16dc686a1b27..71abcefd2e67c 100644 --- a/dev/tools/performance-toolkit/fixtures/disable_form_key_usage.php +++ b/dev/tools/performance-toolkit/fixtures/disable_form_key_usage.php @@ -3,17 +3,52 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -$this->resetObjectManager(); + /** - * @var \Magento\Framework\App\Config\Value $configData + * Class DisableFormKeyUsageFixture */ -$configData = $this->getObjectManager()->create('Magento\Framework\App\Config\Value'); -$configData->setPath(\Magento\Backend\Model\Url::XML_PATH_USE_SECURE_KEY) - ->setScope(\Magento\Framework\App\ScopeInterface::SCOPE_DEFAULT) - ->setScopeId(0) - ->setValue(0) - ->save(); +class DisableFormKeyUsageFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 100; + + /** + * {@inheritdoc} + */ + public function execute() + { + $this->application->resetObjectManager(); + /** + * @var \Magento\Framework\App\Config\Value $configData + */ + $configData = $this->application->getObjectManager()->create('Magento\Framework\App\Config\Value'); + $configData->setPath(\Magento\Backend\Model\Url::XML_PATH_USE_SECURE_KEY) + ->setScope(\Magento\Framework\App\ScopeInterface::SCOPE_DEFAULT) + ->setScopeId(0) + ->setValue(0) + ->save(); + + $this->application->getObjectManager()->get('Magento\Framework\App\CacheInterface') + ->clean([\Magento\Framework\App\Config::CACHE_TAG]); + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Disabling form key usage'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return []; + } +} -$this->getObjectManager()->get('Magento\Framework\App\CacheInterface') - ->clean([\Magento\Framework\App\Config::CACHE_TAG]); +return new DisableFormKeyUsageFixture($this); diff --git a/dev/tools/performance-toolkit/fixtures/eav_variations.php b/dev/tools/performance-toolkit/fixtures/eav_variations.php index ccaa2fcf94ab0..2d2fbc8951743 100644 --- a/dev/tools/performance-toolkit/fixtures/eav_variations.php +++ b/dev/tools/performance-toolkit/fixtures/eav_variations.php @@ -3,83 +3,119 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -define('ATTRIBUTE_SET_ID', 4); -$this->resetObjectManager(); -/* @var $model \Magento\Catalog\Model\Resource\Eav\Attribute */ -$model = $this->getObjectManager()->create('Magento\Catalog\Model\Resource\Eav\Attribute'); -/* @var $helper \Magento\Catalog\Helper\Product */ -$helper = $this->getObjectManager()->get('Magento\Catalog\Helper\Product'); -/** @var \Magento\Store\Model\StoreManager $storeManager */ -$storeManager = $this->getObjectManager()->create('Magento\Store\Model\StoreManager'); -$stores = $storeManager->getStores(); -$storeViewsCount = count($stores); +define('ATTRIBUTE_SET_ID', 4); -$data = [ - 'frontend_label' => array_fill(0, $storeViewsCount + 1, 'configurable variations'), - 'frontend_input' => 'select', - 'is_required' => '0', - 'option' => [ - 'order' => [ - 'option_0' => '1', - 'option_1' => '2', - 'option_2' => '3', - ], - 'value' => [ - 'option_0' => array_fill(0, $storeViewsCount + 1, 'option 1'), - 'option_1' => array_fill(0, $storeViewsCount + 1, 'option 2'), - 'option_2' => array_fill(0, $storeViewsCount + 1, 'option 3'), - ], - 'delete' => [ - 'option_0' => '', - 'option_1' => '', - 'option_2' => '', - ], - ], - 'default' => ['option_0'], - 'attribute_code' => 'configurable_variations', - 'is_global' => '1', - 'default_value_text' => '', - 'default_value_yesno' => '0', - 'default_value_date' => '', - 'default_value_textarea' => '', - 'is_unique' => '0', - 'is_searchable' => '0', - 'is_visible_in_advanced_search' => '0', - 'is_comparable' => '0', - 'is_filterable' => '0', - 'is_filterable_in_search' => '0', - 'is_used_for_promo_rules' => '0', - 'is_html_allowed_on_front' => '1', - 'is_visible_on_front' => '0', - 'used_in_product_listing' => '0', - 'used_for_sort_by' => '0', - 'source_model' => null, - 'backend_model' => null, - 'apply_to' => [], - 'backend_type' => 'int', - 'entity_type_id' => 4, - 'is_user_defined' => 1, -]; /** - * The logic is not obvious, but looking to the controller logic for configurable products this attribute requires - * to be saved twice to become a child of Default attribute set and become available for creating and|or importing - * configurable products. - * See MAGETWO-16492 + * Class EavVariationsFixture */ -$model->addData($data); -$attributeSet = $this->getObjectManager()->get('Magento\Eav\Model\Entity\Attribute\Set'); -$attributeSet->load(ATTRIBUTE_SET_ID); -$model->setAttributeSetId(ATTRIBUTE_SET_ID) - ->setAttributeGroupId($attributeSet->getDefaultGroupId(4)) - ->save(); +class EavVariationsFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 40; + + /** + * {@inheritdoc} + */ + public function execute() + { + $this->application->resetObjectManager(); + + /* @var $model \Magento\Catalog\Model\Resource\Eav\Attribute */ + $model = $this->application->getObjectManager()->create('Magento\Catalog\Model\Resource\Eav\Attribute'); + /* @var $helper \Magento\Catalog\Helper\Product */ + $helper = $this->application->getObjectManager()->get('Magento\Catalog\Helper\Product'); + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->application->getObjectManager()->create('Magento\Store\Model\StoreManager'); + $stores = $storeManager->getStores(); + $storeViewsCount = count($stores); + + $data = [ + 'frontend_label' => array_fill(0, $storeViewsCount + 1, 'configurable variations'), + 'frontend_input' => 'select', + 'is_required' => '0', + 'option' => [ + 'order' => [ + 'option_0' => '1', + 'option_1' => '2', + 'option_2' => '3', + ], + 'value' => [ + 'option_0' => array_fill(0, $storeViewsCount + 1, 'option 1'), + 'option_1' => array_fill(0, $storeViewsCount + 1, 'option 2'), + 'option_2' => array_fill(0, $storeViewsCount + 1, 'option 3'), + ], + 'delete' => [ + 'option_0' => '', + 'option_1' => '', + 'option_2' => '', + ], + ], + 'default' => ['option_0'], + 'attribute_code' => 'configurable_variations', + 'is_global' => '1', + 'default_value_text' => '', + 'default_value_yesno' => '0', + 'default_value_date' => '', + 'default_value_textarea' => '', + 'is_unique' => '0', + 'is_searchable' => '0', + 'is_visible_in_advanced_search' => '0', + 'is_comparable' => '0', + 'is_filterable' => '0', + 'is_filterable_in_search' => '0', + 'is_used_for_promo_rules' => '0', + 'is_html_allowed_on_front' => '1', + 'is_visible_on_front' => '0', + 'used_in_product_listing' => '0', + 'used_for_sort_by' => '0', + 'source_model' => null, + 'backend_model' => null, + 'apply_to' => [], + 'backend_type' => 'int', + 'entity_type_id' => 4, + 'is_user_defined' => 1, + ]; + /** + * The logic is not obvious, but looking to the controller logic for configurable products this attribute + * requires to be saved twice to become a child of Default attribute set and become available for creating + * and|or importing configurable products. + * See MAGETWO-16492 + */ + $model->addData($data); + $attributeSet = $this->application->getObjectManager()->get('Magento\Eav\Model\Entity\Attribute\Set'); + $attributeSet->load(ATTRIBUTE_SET_ID); + $model->setAttributeSetId(ATTRIBUTE_SET_ID) + ->setAttributeGroupId($attributeSet->getDefaultGroupId(4)) + ->save(); + + $model->setAttributeSetId(ATTRIBUTE_SET_ID); + $model->save(); + + /* @var $cache \Magento\Framework\App\CacheInterface */ + $cache = $this->application->getObjectManager()->get('Magento\Framework\App\CacheInterface'); + + $cacheKey = \Magento\Eav\Model\Config::ATTRIBUTES_CACHE_ID . \Magento\Catalog\Model\Product::ENTITY; + $cache->remove($cacheKey); + } -$model->setAttributeSetId(ATTRIBUTE_SET_ID); -$model->save(); + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating configurable EAV variations'; + } -/* @var $cache \Magento\Framework\App\CacheInterface */ -$cache = $this->getObjectManager()->get('Magento\Framework\App\CacheInterface'); + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return []; + } +} -$cacheKey = \Magento\Eav\Model\Config::ATTRIBUTES_CACHE_ID . \Magento\Catalog\Model\Product::ENTITY; -$cache->remove($cacheKey); +return new EavVariationsFixture($this); diff --git a/dev/tools/performance-toolkit/fixtures/shipping_flatrate_enabled.php b/dev/tools/performance-toolkit/fixtures/shipping_flatrate_enabled.php index 5eb443ea30ac1..c68bbb747358f 100644 --- a/dev/tools/performance-toolkit/fixtures/shipping_flatrate_enabled.php +++ b/dev/tools/performance-toolkit/fixtures/shipping_flatrate_enabled.php @@ -3,17 +3,52 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -$this->resetObjectManager(); + /** - * @var \Magento\Framework\App\Config\Value $configData + * Class EnableShippingFlatRateFixture */ -$configData = $this->getObjectManager()->create('Magento\Framework\App\Config\Value'); -$configData->setPath('carriers/flatrate/active') - ->setScope(\Magento\Framework\App\ScopeInterface::SCOPE_DEFAULT) - ->setScopeId(0) - ->setValue(1) - ->save(); +class EnableShippingFlatRateFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 110; + + /** + * {@inheritdoc} + */ + public function execute() + { + $this->application->resetObjectManager(); + /** + * @var \Magento\Framework\App\Config\Value $configData + */ + $configData = $this->application->getObjectManager()->create('Magento\Framework\App\Config\Value'); + $configData->setPath('carriers/flatrate/active') + ->setScope(\Magento\Framework\App\ScopeInterface::SCOPE_DEFAULT) + ->setScopeId(0) + ->setValue(1) + ->save(); + + $this->application->getObjectManager()->get('Magento\Framework\App\CacheInterface') + ->clean([\Magento\Framework\App\Config::CACHE_TAG]); + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Enabling Flat Rate shipping method'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return []; + } +} -$this->getObjectManager()->get('Magento\Framework\App\CacheInterface') - ->clean([\Magento\Framework\App\Config::CACHE_TAG]); +return new EnableShippingFlatRateFixture($this); diff --git a/dev/tools/performance-toolkit/fixtures/simple_products.php b/dev/tools/performance-toolkit/fixtures/simple_products.php index 0abda3f0fe492..26d676455aa1d 100644 --- a/dev/tools/performance-toolkit/fixtures/simple_products.php +++ b/dev/tools/performance-toolkit/fixtures/simple_products.php @@ -3,95 +3,145 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -$simpleProductsCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('simple_products', 180); -$this->resetObjectManager(); -/** @var \Magento\Store\Model\StoreManager $storeManager */ -$storeManager = $this->getObjectManager()->create('Magento\Store\Model\StoreManager'); -/** @var $category \Magento\Catalog\Model\Category */ -$category = $this->getObjectManager()->get('Magento\Catalog\Model\Category'); +/** + * Class SimpleProductsFixture + */ +class SimpleProductsFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 30; + + /** + * {@inheritdoc} + */ + public function execute() + { + $simpleProductsCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('simple_products', 180); + $this->application->resetObjectManager(); + + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->application->getObjectManager()->create('Magento\Store\Model\StoreManager'); + /** @var $category \Magento\Catalog\Model\Category */ + $category = $this->application->getObjectManager()->get('Magento\Catalog\Model\Category'); -$result = []; -//Get all websites -$websites = $storeManager->getWebsites(); -foreach ($websites as $website) { - $websiteCode = $website->getCode(); - //Get all groups - $websiteGroups = $website->getGroups(); - foreach ($websiteGroups as $websiteGroup) { - $websiteGroupRootCategory = $websiteGroup->getRootCategoryId(); - $category->load($websiteGroupRootCategory); - $categoryResource = $category->getResource(); - //Get all categories - $resultsCategories = $categoryResource->getAllChildren($category); - foreach ($resultsCategories as $resultsCategory) { - $category->load($resultsCategory); - $structure = explode('/', $category->getPath()); - $pathSize = count($structure); - if ($pathSize > 1) { - $path = []; - for ($i = 1; $i < $pathSize; $i++) { - $path[] = $category->load($structure[$i])->getName(); + $result = []; + //Get all websites + $websites = $storeManager->getWebsites(); + foreach ($websites as $website) { + $websiteCode = $website->getCode(); + //Get all groups + $websiteGroups = $website->getGroups(); + foreach ($websiteGroups as $websiteGroup) { + $websiteGroupRootCategory = $websiteGroup->getRootCategoryId(); + $category->load($websiteGroupRootCategory); + $categoryResource = $category->getResource(); + //Get all categories + $resultsCategories = $categoryResource->getAllChildren($category); + foreach ($resultsCategories as $resultsCategory) { + $category->load($resultsCategory); + $structure = explode('/', $category->getPath()); + $pathSize = count($structure); + if ($pathSize > 1) { + $path = []; + for ($i = 1; $i < $pathSize; $i++) { + $path[] = $category->load($structure[$i])->getName(); + } + array_shift($path); + $resultsCategoryName = implode('/', $path); + } else { + $resultsCategoryName = $category->getName(); + } + //Deleted root categories + if (trim($resultsCategoryName) != '') { + $result[$resultsCategory] = [$websiteCode, $resultsCategoryName]; + } } - array_shift($path); - $resultsCategoryName = implode('/', $path); - } else { - $resultsCategoryName = $category->getName(); - } - //Deleted root categories - if (trim($resultsCategoryName) != '') { - $result[$resultsCategory] = [$websiteCode, $resultsCategoryName]; } } + $result = array_values($result); + + $productWebsite = function ($index) use ($result) { + return $result[$index % count($result)][0]; + }; + $productCategory = function ($index) use ($result) { + return $result[$index % count($result)][1]; + }; + + $generator = new \Magento\ToolkitFramework\ImportExport\Fixture\Generator( + $this->getPattern($productWebsite, $productCategory), + $simpleProductsCount + ); + /** @var \Magento\ImportExport\Model\Import $import */ + $import = $this->application->getObjectManager()->create( + 'Magento\ImportExport\Model\Import', + ['data' => ['entity' => 'catalog_product', 'behavior' => 'append']] + ); + // it is not obvious, but the validateSource() will actually save import queue data to DB + $import->validateSource($generator); + // this converts import queue into actual entities + $import->importSource(); } -} -$result = array_values($result); -$productWebsite = function ($index) use ($result) { - return $result[$index % count($result)][0]; -}; -$productCategory = function ($index) use ($result) { - return $result[$index % count($result)][1]; -}; + /** + * Get pattern for product import + * + * @param Closure|int|string $productWebsiteClosure + * @param Closure|int|string $productCategoryClosure + * @return array + */ + protected function getPattern($productWebsiteClosure, $productCategoryClosure) + { + return [ + '_attribute_set' => 'Default', + '_type' => \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE, + '_product_websites' => $productWebsiteClosure, + '_category' => $productCategoryClosure, + 'name' => 'Simple Product %s', + 'short_description' => 'Short simple product description %s', + 'weight' => 1, + 'description' => 'Full simple product Description %s', + 'sku' => 'product_dynamic_%s', + 'price' => 10, + 'visibility' => \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH, + 'status' => \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED, + 'tax_class_id' => 2, + /** + * actually it saves without stock data, but by default system won't show on the + * frontend products out of stock + */ + 'is_in_stock' => 1, + 'qty' => 100500, + 'use_config_min_qty' => '1', + 'use_config_backorders' => '1', + 'use_config_min_sale_qty' => '1', + 'use_config_max_sale_qty' => '1', + 'use_config_notify_stock_qty' => '1', + 'use_config_manage_stock' => '1', + 'use_config_qty_increments' => '1', + 'use_config_enable_qty_inc' => '1', + ]; + } -/** - * Create products - */ -$pattern = [ - '_attribute_set' => 'Default', - '_type' => \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE, - '_product_websites' => $productWebsite, - '_category' => $productCategory, - 'name' => 'Simple Product %s', - 'short_description' => 'Short simple product description %s', - 'weight' => 1, - 'description' => 'Full simple product Description %s', - 'sku' => 'product_dynamic_%s', - 'price' => 10, - 'visibility' => \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH, - 'status' => \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED, - 'tax_class_id' => 2, + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating simple products'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'simple_products' => 'Simple products' + ]; + } +} - // actually it saves without stock data, but by default system won't show on the frontend products out of stock - 'is_in_stock' => 1, - 'qty' => 100500, - 'use_config_min_qty' => '1', - 'use_config_backorders' => '1', - 'use_config_min_sale_qty' => '1', - 'use_config_max_sale_qty' => '1', - 'use_config_notify_stock_qty' => '1', - 'use_config_manage_stock' => '1', - 'use_config_qty_increments' => '1', - 'use_config_enable_qty_inc' => '1', -]; -$generator = new \Magento\ToolkitFramework\ImportExport\Fixture\Generator($pattern, $simpleProductsCount); -/** @var \Magento\ImportExport\Model\Import $import */ -$import = $this->getObjectManager()->create( - 'Magento\ImportExport\Model\Import', - ['data' => ['entity' => 'catalog_product', 'behavior' => 'append']] -); -// it is not obvious, but the validateSource() will actually save import queue data to DB -$import->validateSource($generator); -// this converts import queue into actual entities -$import->importSource(); +return new SimpleProductsFixture($this); diff --git a/dev/tools/performance-toolkit/fixtures/stores.php b/dev/tools/performance-toolkit/fixtures/stores.php index 04beb627bf582..ac56367cc2701 100644 --- a/dev/tools/performance-toolkit/fixtures/stores.php +++ b/dev/tools/performance-toolkit/fixtures/stores.php @@ -3,138 +3,177 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -$websitesCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('websites', 2); -$storeGroupsCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('store_groups', 3); -$storesCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('store_views', 5); -$this->resetObjectManager(); - -/** @var \Magento\Store\Model\StoreManager $storeManager */ -$storeManager = $this->getObjectManager()->create('Magento\Store\Model\StoreManager'); -/** @var $category \Magento\Catalog\Model\Category */ -$category = $this->getObjectManager()->create('Magento\Catalog\Model\Category'); - -/** @var $defaultWebsite \Magento\Store\Model\Website */ -$defaultWebsite = $storeManager->getWebsite(); -/** @var $defaultStoreGroup \Magento\Store\Model\Group */ -$defaultStoreGroup = $storeManager->getGroup(); -/** @var $defaultStoreView \Magento\Store\Model\Store */ -$defaultStoreView = $storeManager->getDefaultStoreView(); - -$defaultParentCategoryId = $storeManager->getStore()->getRootCategoryId(); - -$defaultWebsiteId = $defaultWebsite->getId(); -$defaultStoreGroupId = $defaultStoreGroup->getId(); -$defaultStoreViewId = $defaultStoreView->getId(); - -$websitesId = []; -$groupsId = []; - -//Create $websitesCount websites -for ($i = 0; $i < $websitesCount; $i++) { - $websiteId = null; - if ($i == 0) { - $websiteId = $defaultWebsiteId; - } - $website = clone $defaultWebsite; - $websiteCode = sprintf('website_%d', $i + 1); - $websiteName = sprintf('Website %d', $i + 1); - $website->addData( - [ - 'website_id' => $websiteId, - 'code' => $websiteCode, - 'name' => $websiteName, - 'is_default' => (int)$i == 0, - ] - ); - $website->save(); - $websitesId[$i] = $website->getId(); - usleep(20); -} - -//Create $storeGroupsCount websites -$websiteNumber = 0; -for ($i = 0; $i < $storeGroupsCount; $i++) { - $websiteId = $websitesId[$websiteNumber]; - $groupId = null; - $parentCategoryId = null; - $categoryPath = '1'; - $storeGroupName = sprintf('Store Group %d - website_id_%d', $i + 1, $websiteId); +/** + * Class StoresFixture + */ +class StoresFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 10; + + /** + * {@inheritdoc} + */ + public function execute() + { + $websitesCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('websites', 2); + $storeGroupsCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('store_groups', 3); + $storesCount = \Magento\ToolkitFramework\Config::getInstance()->getValue('store_views', 5); + $this->application->resetObjectManager(); + + /** @var \Magento\Store\Model\StoreManager $storeManager */ + $storeManager = $this->application->getObjectManager()->create('Magento\Store\Model\StoreManager'); + /** @var $category \Magento\Catalog\Model\Category */ + $category = $this->application->getObjectManager()->create('Magento\Catalog\Model\Category'); + + /** @var $defaultWebsite \Magento\Store\Model\Website */ + $defaultWebsite = $storeManager->getWebsite(); + /** @var $defaultStoreGroup \Magento\Store\Model\Group */ + $defaultStoreGroup = $storeManager->getGroup(); + /** @var $defaultStoreView \Magento\Store\Model\Store */ + $defaultStoreView = $storeManager->getDefaultStoreView(); + + $defaultParentCategoryId = $storeManager->getStore()->getRootCategoryId(); + + $defaultWebsiteId = $defaultWebsite->getId(); + $defaultStoreGroupId = $defaultStoreGroup->getId(); + $defaultStoreViewId = $defaultStoreView->getId(); + + $websitesId = []; + $groupsId = []; + + //Create $websitesCount websites + for ($i = 0; $i < $websitesCount; $i++) { + $websiteId = null; + if ($i == 0) { + $websiteId = $defaultWebsiteId; + } + $website = clone $defaultWebsite; + $websiteCode = sprintf('website_%d', $i + 1); + $websiteName = sprintf('Website %d', $i + 1); + $website->addData( + [ + 'website_id' => $websiteId, + 'code' => $websiteCode, + 'name' => $websiteName, + 'is_default' => (int)$i == 0, + ] + ); + $website->save(); + $websitesId[$i] = $website->getId(); + usleep(20); + } - if ($i == 0 && $websiteId == $defaultWebsiteId) { - $groupId = $defaultStoreGroupId; - $parentCategoryId = $defaultParentCategoryId; - $categoryPath = '1/' . $defaultParentCategoryId; - } + //Create $storeGroupsCount websites + $websiteNumber = 0; + for ($i = 0; $i < $storeGroupsCount; $i++) { + $websiteId = $websitesId[$websiteNumber]; + $groupId = null; + $parentCategoryId = null; + $categoryPath = '1'; + + $storeGroupName = sprintf('Store Group %d - website_id_%d', $i + 1, $websiteId); + + if ($i == 0 && $websiteId == $defaultWebsiteId) { + $groupId = $defaultStoreGroupId; + $parentCategoryId = $defaultParentCategoryId; + $categoryPath = '1/' . $defaultParentCategoryId; + } + + $category->setId($parentCategoryId) + ->setName("Category $storeGroupName") + ->setPath($categoryPath) + ->setLevel(1) + ->setAvailableSortBy('name') + ->setDefaultSortBy('name') + ->setIsActive(true) + ->save(); + + $storeGroup = clone $defaultStoreGroup; + $storeGroup->addData( + [ + 'group_id' => $groupId, + 'website_id' => $websiteId, + 'name' => $storeGroupName, + 'root_category_id' => $category->getId(), + ] + ); + $storeGroup->save(); + $groupsId[$websiteId][] = $storeGroup->getId(); + + $websiteNumber++; + if ($websiteNumber == count($websitesId)) { + $websiteNumber = 0; + } + usleep(20); + } - $category->setId($parentCategoryId) - ->setName("Category $storeGroupName") - ->setPath($categoryPath) - ->setLevel(1) - ->setAvailableSortBy('name') - ->setDefaultSortBy('name') - ->setIsActive(true) - ->save(); - - $storeGroup = clone $defaultStoreGroup; - $storeGroup->addData( - [ - 'group_id' => $groupId, - 'website_id' => $websiteId, - 'name' => $storeGroupName, - 'root_category_id' => $category->getId(), - ] - ); - $storeGroup->save(); - $groupsId[$websiteId][] = $storeGroup->getId(); - - $websiteNumber++; - if ($websiteNumber == count($websitesId)) { + //Create $storesCount stores $websiteNumber = 0; + $groupNumber = 0; + for ($i = 0; $i < $storesCount; $i++) { + $websiteId = $websitesId[$websiteNumber]; + $groupId = $groupsId[$websiteId][$groupNumber]; + $storeId = null; + if ($i == 0 && $groupId == $defaultStoreGroupId) { + $storeId = $defaultStoreViewId; + } + $store = clone $defaultStoreView; + $storeCode = sprintf('store_view_%d_w_%d_g_%d', $i + 1, $websiteId, $groupId); + $storeName = sprintf('Store view %d - website_id_%d - group_id_%d', $i + 1, $websiteId, $groupId); + $store->addData( + [ + 'store_id' => $storeId, + 'name' => $storeName, + 'website_id' => $websiteId, + 'group_id' => $groupId, + ] + ); + + if ($storeId == null) { + $store->addData( + [ + 'code' => $storeCode, + ] + ); + } + + $store->save(); + + $groupNumber++; + if ($groupNumber == count($groupsId[$websiteId])) { + $groupNumber = 0; + $websiteNumber++; + if ($websiteNumber == count($websitesId)) { + $websiteNumber = 0; + } + } + usleep(20); + } } - usleep(20); -} -//Create $storesCount stores -$websiteNumber = 0; -$groupNumber = 0; -for ($i = 0; $i < $storesCount; $i++) { - $websiteId = $websitesId[$websiteNumber]; - $groupId = $groupsId[$websiteId][$groupNumber]; - $storeId = null; - if ($i == 0 && $groupId == $defaultStoreGroupId) { - $storeId = $defaultStoreViewId; - } - $store = clone $defaultStoreView; - $storeCode = sprintf('store_view_%d_w_%d_g_%d', $i + 1, $websiteId, $groupId); - $storeName = sprintf('Store view %d - website_id_%d - group_id_%d', $i + 1, $websiteId, $groupId); - $store->addData( - [ - 'store_id' => $storeId, - 'name' => $storeName, - 'website_id' => $websiteId, - 'group_id' => $groupId, - ] - ); - - if ($storeId == null) { - $store->addData( - [ - 'code' => $storeCode, - ] - ); + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating websites, stores and store views'; } - $store->save(); - - $groupNumber++; - if ($groupNumber == count($groupsId[$websiteId])) { - $groupNumber = 0; - $websiteNumber++; - if ($websiteNumber == count($websitesId)) { - $websiteNumber = 0; - } + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return [ + 'websites' => 'Websites', + 'store_groups' => 'Store Groups', + 'store_views' => 'Store Views' + ]; } - usleep(20); } + +return new StoresFixture($this); diff --git a/dev/tools/performance-toolkit/fixtures/tax_rates.php b/dev/tools/performance-toolkit/fixtures/tax_rates.php index ee64573b153ba..d4a9cbbba16f6 100644 --- a/dev/tools/performance-toolkit/fixtures/tax_rates.php +++ b/dev/tools/performance-toolkit/fixtures/tax_rates.php @@ -3,29 +3,68 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -/** @var \Magento\ToolkitFramework\Application $this */ -$this->resetObjectManager(); -/** Clean predefined tax rates to maintain consistency */ -/** @var $collection Magento\Tax\Model\Resource\Calculation\Rate\Collection */ -$collection = $this->getObjectManager()->get('Magento\Tax\Model\Resource\Calculation\Rate\Collection'); - -/** @var $model Magento\Tax\Model\Calculation\Rate */ -$model = $this->getObjectManager()->get('Magento\Tax\Model\Calculation\Rate'); - -foreach ($collection->getAllIds() as $id) { - $model->setId($id); - $model->delete(); -} + /** - * Import tax rates with import handler + * Class TaxRatesFixture */ -$filename = realpath(__DIR__ . '/tax_rates.csv'); -$file = [ - 'name' => $filename, - 'type' => 'application/vnd.ms-excel', - 'tmp_name' => $filename, - 'error' => 0, - 'size' => filesize($filename), -]; -$importHandler = $this->getObjectManager()->create('Magento\TaxImportExport\Model\Rate\CsvImportHandler'); -$importHandler->importFromCsvFile($file); +class TaxRatesFixture extends \Magento\ToolkitFramework\Fixture +{ + /** + * @var int + */ + protected $priority = 90; + + /** + * {@inheritdoc} + */ + public function execute() + { + $this->application->resetObjectManager(); + /** Clean predefined tax rates to maintain consistency */ + /** @var $collection Magento\Tax\Model\Resource\Calculation\Rate\Collection */ + $collection = $this->application->getObjectManager() + ->get('Magento\Tax\Model\Resource\Calculation\Rate\Collection'); + + /** @var $model Magento\Tax\Model\Calculation\Rate */ + $model = $this->application->getObjectManager() + ->get('Magento\Tax\Model\Calculation\Rate'); + + foreach ($collection->getAllIds() as $id) { + $model->setId($id); + $model->delete(); + } + /** + * Import tax rates with import handler + */ + $filename = realpath(__DIR__ . '/tax_rates.csv'); + $file = [ + 'name' => $filename, + 'type' => 'application/vnd.ms-excel', + 'tmp_name' => $filename, + 'error' => 0, + 'size' => filesize($filename), + ]; + $importHandler = $this->application->getObjectManager() + ->create('Magento\TaxImportExport\Model\Rate\CsvImportHandler'); + $importHandler->importFromCsvFile($file); + + } + + /** + * {@inheritdoc} + */ + public function getActionTitle() + { + return 'Generating tax rates'; + } + + /** + * {@inheritdoc} + */ + public function introduceParamLabels() + { + return []; + } +} + +return new TaxRatesFixture($this); diff --git a/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Application.php b/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Application.php index 02eba95303127..083ac9fefbc6f 100644 --- a/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Application.php +++ b/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Application.php @@ -18,6 +18,16 @@ class Application */ const AREA_CODE = 'adminhtml'; + /** + * Fixtures directory + */ + const FIXTURES_DIR = '/../../../fixtures'; + + /** + * Fixtures file name pattern + */ + const FIXTURE_PATTERN = '*.php'; + /** * Application object * @@ -38,23 +48,36 @@ class Application /** * List of fixtures applied to the application * - * @var array + * @var \Magento\ToolkitFramework\Fixture[] */ protected $_fixtures = []; + /** + * Parameters labels + * + * @var array + */ + protected $_paramLabels = []; + /** * @var string */ protected $_applicationBaseDir; + /** + * @var array + */ + protected $_initArguments; + /** * @param string $applicationBaseDir * @param \Magento\Framework\Shell $shell */ - public function __construct($applicationBaseDir, \Magento\Framework\Shell $shell) + public function __construct($applicationBaseDir, \Magento\Framework\Shell $shell, array $initArguments) { $this->_applicationBaseDir = $applicationBaseDir; $this->_shell = $shell; + $this->_initArguments = $initArguments; } /** @@ -108,41 +131,49 @@ public function reindex() } /** - * Work on application, so that it has all and only $fixtures applied. May require reinstall, if - * excessive fixtures has been applied before. + * Load fixtures * - * @param array $fixtures - * - * @return void + * @return $this + * @throws \Exception */ - public function applyFixtures(array $fixtures) + public function loadFixtures() { - // Apply fixtures - $fixturesToApply = array_diff($fixtures, $this->_fixtures); - if (!$fixturesToApply) { - return; + if (!is_readable(__DIR__ . self::FIXTURES_DIR)) { + throw new \Exception( + 'Fixtures set directory `' . __DIR__ . self::FIXTURES_DIR . '` is not readable or does not exists.' + ); } - - $this->_bootstrap(); - foreach ($fixturesToApply as $fixtureFile) { - $this->applyFixture($fixtureFile); + $files = glob(__DIR__ . self::FIXTURES_DIR . DIRECTORY_SEPARATOR . self::FIXTURE_PATTERN); + foreach ($files as $file) { + /** @var \Magento\ToolkitFramework\Fixture $fixture */ + $fixture = require realpath($file); + $this->_fixtures[$fixture->getPriority()] = $fixture; } - $this->_fixtures = $fixtures; - - $this->reindex() - ->_updateFilesystemPermissions(); + ksort($this->_fixtures); + foreach ($this->_fixtures as $fixture) { + $this->_paramLabels = array_merge($this->_paramLabels, $fixture->introduceParamLabels()); + } + return $this; } /** - * Apply fixture file + * Get param labels * - * @param string $fixtureFilename + * @return array + */ + public function getParamLabels() + { + return $this->_paramLabels; + } + + /** + * Get fixtures * - * @return void + * @return Fixture[] */ - public function applyFixture($fixtureFilename) + public function getFixtures() { - require $fixtureFilename; + return $this->_fixtures; } /** @@ -153,8 +184,11 @@ public function applyFixture($fixtureFilename) public function getObjectManager() { if (!$this->_objectManager) { - $objectManagerFactory = \Magento\Framework\App\Bootstrap::createObjectManagerFactory(BP, $_SERVER); - $this->_objectManager = $objectManagerFactory->create($_SERVER); + $objectManagerFactory = \Magento\Framework\App\Bootstrap::createObjectManagerFactory( + BP, + $this->_initArguments + ); + $this->_objectManager = $objectManagerFactory->create($this->_initArguments); $this->_objectManager->get('Magento\Framework\App\State')->setAreaCode(self::AREA_CODE); } return $this->_objectManager; diff --git a/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Config.php b/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Config.php index 0b039619016a6..0572b043a8c5a 100644 --- a/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Config.php +++ b/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Config.php @@ -15,13 +15,6 @@ class Config */ protected $_config = []; - /** - * Labels for config values - * - * @var array - */ - protected $_labels = []; - /** * Get config instance * @@ -52,32 +45,6 @@ public function loadConfig($filename) $this->_config = (new \Magento\Framework\Xml\Parser())->load($filename)->xmlToArray(); } - /** - * Load labels - * - * @param string $filename - * @throws \Exception - * - * @return void - */ - public function loadLabels($filename) - { - if (!is_readable($filename)) { - throw new \Exception("Labels file `{$filename}` is not readable or does not exists."); - } - $this->_labels = (new \Magento\Framework\Xml\Parser())->load($filename)->xmlToArray(); - } - - /** - * Get labels array - * - * @return array - */ - public function getLabels() - { - return isset($this->_labels['config']['labels']) ? $this->_labels['config']['labels'] : []; - } - /** * Get profile configuration value * diff --git a/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Fixture.php b/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Fixture.php new file mode 100644 index 0000000000000..9a6a1a7e3d4fc --- /dev/null +++ b/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/Fixture.php @@ -0,0 +1,63 @@ +application = $application; + } + + /** + * Execute fixture + * + * @return void + */ + abstract public function execute(); + + /** + * Get fixture action description + * + * @return string + */ + abstract public function getActionTitle(); + + /** + * Introduce parameters labels + * + * @return array + */ + abstract public function introduceParamLabels(); + + /** + * Get fixture priority + * + * @return int + */ + public function getPriority() + { + return $this->priority; + } +} diff --git a/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/FixtureSet.php b/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/FixtureSet.php deleted file mode 100644 index 5bcdb3aef8939..0000000000000 --- a/dev/tools/performance-toolkit/framework/Magento/ToolkitFramework/FixtureSet.php +++ /dev/null @@ -1,57 +0,0 @@ -_fixtures = (new \Magento\Framework\Xml\Parser())->load($filename)->xmlToArray(); - } - - /** - * Get fixtures array - * - * @param array $default - * - * @return array - */ - public function getFixtures($default = []) - { - return isset($this->_fixtures['fixtures']) ? $this->_fixtures['fixtures'] : $default; - } -} diff --git a/dev/tools/performance-toolkit/framework/fixtures.xml b/dev/tools/performance-toolkit/framework/fixtures.xml deleted file mode 100644 index e3ed3c78bb318..0000000000000 --- a/dev/tools/performance-toolkit/framework/fixtures.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - stores.php - Generating stores, store views and websites - - - categories.php - Generating categories - - - simple_products.php - Generating simple products - - - eav_variations.php - Generating EAV variations for configurable products - - - configurable_products.php - Generating configurable products - - - customers.php - Generating customer accounts - - - cart_price_rules.php - Generating shopping cart price rules - - - catalog_price_rules.php - Generating catalog price rules - - - tax_rates.php - Generating tax rates - - - disable_form_key_usage.php - Disabling form key usage for admin - - - shipping_flatrate_enabled.php - Enabling FlatRate shipping method - - \ No newline at end of file diff --git a/dev/tools/performance-toolkit/framework/labels.xml b/dev/tools/performance-toolkit/framework/labels.xml deleted file mode 100644 index 791eb6ff3345e..0000000000000 --- a/dev/tools/performance-toolkit/framework/labels.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Websites - Store Groups - Store Views - Simple Products - Configurable Products - Categories - Catalog Price Rules - Cart Price Rules - Registered Customers - - diff --git a/dev/tools/performance-toolkit/framework/tests/unit/testsuite/Magento/ToolkitFramework/ApplicationTest.php b/dev/tools/performance-toolkit/framework/tests/unit/testsuite/Magento/ToolkitFramework/ApplicationTest.php deleted file mode 100644 index 16a820d5b29a6..0000000000000 --- a/dev/tools/performance-toolkit/framework/tests/unit/testsuite/Magento/ToolkitFramework/ApplicationTest.php +++ /dev/null @@ -1,149 +0,0 @@ -_applicationBaseDir = __DIR__ . '/../../../../../bootstrap.php'; - $this->_shell = $this->getMock('Magento\Framework\Shell', ['execute'], [], '', false); - - $this->_object = new \Magento\ToolkitFramework\Application($this->_applicationBaseDir, $this->_shell); - - $this->_object->applied = []; // For fixture testing - } - - /** - * Tear down after test - * - * @return void - */ - protected function tearDown() - { - unset($this->_shell); - unset($this->_object); - } - - /** - * Apply fixtures test - * - * @param array $fixtures - * @param array $expected - * @dataProvider applyFixturesDataProvider - * - * @return void - */ - public function testApplyFixtures($fixtures, $expected) - { - $this->_object->applyFixtures($fixtures); - $this->assertEquals($expected, $this->_object->applied); - } - - /** - * Apply fixture data provider - * - * @return array - */ - public function applyFixturesDataProvider() - { - return [ - 'empty fixtures' => [ - [], - [], - ], - 'fixtures' => [ - $this->_getFixtureFiles(['fixture1', 'fixture2']), - ['fixture1', 'fixture2'], - ], - ]; - } - - /** - * Apply fixture test - * - * @param array $initialFixtures - * @param array $subsequentFixtures - * @param array $subsequentExpected - * @dataProvider applyFixturesSeveralTimesDataProvider - * - * @return void - */ - public function testApplyFixturesSeveralTimes($initialFixtures, $subsequentFixtures, $subsequentExpected) - { - $this->_object->applyFixtures($initialFixtures); - $this->_object->applied = []; - $this->_object->applyFixtures($subsequentFixtures); - $this->assertEquals($subsequentExpected, $this->_object->applied); - } - - /** - * Apply fixture data provider - * - * @return array - */ - public function applyFixturesSeveralTimesDataProvider() - { - return [ - 'no fixtures applied, when sets are same' => [ - $this->_getFixtureFiles(['fixture1', 'fixture2']), - $this->_getFixtureFiles(['fixture1', 'fixture2']), - [], - ], - 'missing fixture applied for a super set' => [ - $this->_getFixtureFiles(['fixture1']), - $this->_getFixtureFiles(['fixture1', 'fixture2']), - ['fixture2'], - ], - 'no fixtures applied, when sets were exist before' => [ - $this->_getFixtureFiles(['fixture1', 'fixture2']), - $this->_getFixtureFiles(['fixture1']), - [], - ], - ]; - } - - /** - * Get fixture files - * - * @param array $fixtures - * - * @return array - */ - protected function _getFixtureFiles($fixtures) - { - $result = []; - foreach ($fixtures as $fixture) { - $result[] = __DIR__ . "/_files/application_test/{$fixture}.php"; - } - return $result; - } -} diff --git a/dev/tools/performance-toolkit/framework/tests/unit/testsuite/Magento/ToolkitFramework/FixtureSetTest.php b/dev/tools/performance-toolkit/framework/tests/unit/testsuite/Magento/ToolkitFramework/FixtureSetTest.php deleted file mode 100644 index ef1f62bf2235b..0000000000000 --- a/dev/tools/performance-toolkit/framework/tests/unit/testsuite/Magento/ToolkitFramework/FixtureSetTest.php +++ /dev/null @@ -1,18 +0,0 @@ -setExpectedException('Exception', 'Fixtures set file `))` is not readable or does not exists.'); - new \Magento\ToolkitFramework\FixtureSet('))'); - } -} diff --git a/dev/tools/performance-toolkit/generate.php b/dev/tools/performance-toolkit/generate.php index e004266325dba..43a4d61cc0962 100644 --- a/dev/tools/performance-toolkit/generate.php +++ b/dev/tools/performance-toolkit/generate.php @@ -23,32 +23,28 @@ exit(0); } - $config = \Magento\ToolkitFramework\Config::getInstance(); - $config->loadConfig(\Magento\ToolkitFramework\Helper\Cli::getOption('profile')); - $config->loadLabels(__DIR__ . '/framework/labels.xml'); - - $labels = $config->getLabels(); - - echo 'Generating profile with following params:' . PHP_EOL; - foreach ($labels as $configKey => $label) { - echo ' |- ' . $label . ': ' . $config->getValue($configKey) . PHP_EOL; - } - - $files = \Magento\ToolkitFramework\FixtureSet::getInstance()->getFixtures(); - $logWriter = new \Zend_Log_Writer_Stream('php://output'); $logWriter->setFormatter(new \Zend_Log_Formatter_Simple('%message%' . PHP_EOL)); $logger = new \Zend_Log($logWriter); $shell = new \Magento\Framework\Shell(new \Magento\Framework\Shell\CommandRenderer(), $logger); - $application = new \Magento\ToolkitFramework\Application($applicationBaseDir, $shell); + $application = new \Magento\ToolkitFramework\Application($applicationBaseDir, $shell, []); $application->bootstrap(); + $application->loadFixtures(); + + $config = \Magento\ToolkitFramework\Config::getInstance(); + $config->loadConfig(\Magento\ToolkitFramework\Helper\Cli::getOption('profile')); + + echo 'Generating profile with following params:' . PHP_EOL; + foreach ($application->getParamLabels() as $configKey => $label) { + echo ' |- ' . $label . ': ' . $config->getValue($configKey) . PHP_EOL; + } - foreach ($files as $fixture) { - echo $fixture['action'] . '... '; + foreach ($application->getFixtures() as $fixture) { + echo $fixture->getActionTitle() . '... '; $startTime = microtime(true); - $application->applyFixture(__DIR__ . '/fixtures/' . $fixture['file']); + $fixture->execute(); $endTime = microtime(true); $resultTime = $endTime - $startTime; echo ' done in ' . gmdate('H:i:s', $resultTime) . PHP_EOL; diff --git a/dev/tools/performance-toolkit/profiles/extra_large.xml b/dev/tools/performance-toolkit/profiles/ce/extra_large.xml similarity index 97% rename from dev/tools/performance-toolkit/profiles/extra_large.xml rename to dev/tools/performance-toolkit/profiles/ce/extra_large.xml index cea218783d218..0cefb06fff560 100644 --- a/dev/tools/performance-toolkit/profiles/extra_large.xml +++ b/dev/tools/performance-toolkit/profiles/ce/extra_large.xml @@ -16,7 +16,7 @@ 6 100 100 - 5 + 5 5000 diff --git a/dev/tools/performance-toolkit/profiles/large.xml b/dev/tools/performance-toolkit/profiles/ce/large.xml similarity index 97% rename from dev/tools/performance-toolkit/profiles/large.xml rename to dev/tools/performance-toolkit/profiles/ce/large.xml index 2bfee3eb9a9ae..31a10063eea42 100644 --- a/dev/tools/performance-toolkit/profiles/large.xml +++ b/dev/tools/performance-toolkit/profiles/ce/large.xml @@ -16,7 +16,7 @@ 3 50 50 - 2 + 2 2000 diff --git a/dev/tools/performance-toolkit/profiles/medium.xml b/dev/tools/performance-toolkit/profiles/ce/medium.xml similarity index 97% rename from dev/tools/performance-toolkit/profiles/medium.xml rename to dev/tools/performance-toolkit/profiles/ce/medium.xml index a5da176bb079f..0d2e262d8025f 100644 --- a/dev/tools/performance-toolkit/profiles/medium.xml +++ b/dev/tools/performance-toolkit/profiles/ce/medium.xml @@ -16,7 +16,7 @@ 3 20 20 - 2 + 2 200 diff --git a/dev/tools/performance-toolkit/profiles/small.xml b/dev/tools/performance-toolkit/profiles/ce/small.xml similarity index 97% rename from dev/tools/performance-toolkit/profiles/small.xml rename to dev/tools/performance-toolkit/profiles/ce/small.xml index 35bc0ab09949d..e3f4a6532a460 100644 --- a/dev/tools/performance-toolkit/profiles/small.xml +++ b/dev/tools/performance-toolkit/profiles/ce/small.xml @@ -16,7 +16,7 @@ 3 10 10 - 2 + 2 20 diff --git a/lib/internal/Magento/Framework/App/StaticResource.php b/lib/internal/Magento/Framework/App/StaticResource.php index 76995906872cf..b5fac360793f7 100644 --- a/lib/internal/Magento/Framework/App/StaticResource.php +++ b/lib/internal/Magento/Framework/App/StaticResource.php @@ -53,6 +53,10 @@ class StaticResource implements \Magento\Framework\AppInterface * @var ObjectManager\ConfigLoader */ private $configLoader; + /** + * @var \Magento\Framework\View\Asset\MinifyService + */ + protected $minifyService; /** * @param State $state @@ -63,6 +67,7 @@ class StaticResource implements \Magento\Framework\AppInterface * @param \Magento\Framework\Module\ModuleList $moduleList * @param \Magento\Framework\ObjectManagerInterface $objectManager * @param ObjectManager\ConfigLoader $configLoader + * @param \Magento\Framework\View\Asset\MinifyService $minifyService */ public function __construct( State $state, @@ -72,7 +77,8 @@ public function __construct( \Magento\Framework\View\Asset\Repository $assetRepo, \Magento\Framework\Module\ModuleList $moduleList, \Magento\Framework\ObjectManagerInterface $objectManager, - ObjectManager\ConfigLoader $configLoader + ObjectManager\ConfigLoader $configLoader, + \Magento\Framework\View\Asset\MinifyService $minifyService ) { $this->state = $state; $this->response = $response; @@ -82,6 +88,7 @@ public function __construct( $this->moduleList = $moduleList; $this->objectManager = $objectManager; $this->configLoader = $configLoader; + $this->minifyService = $minifyService; } /** @@ -103,6 +110,7 @@ public function launch() $file = $params['file']; unset($params['file']); $asset = $this->assetRepo->createAsset($file, $params); + $asset = $this->minifyService->getAssets([$asset], true)[0]; $this->response->setFilePath($asset->getSourceFile()); $this->publisher->publish($asset); } diff --git a/lib/internal/Magento/Framework/Code/Minifier/Adapter/Css/CssMinifier.php b/lib/internal/Magento/Framework/Code/Minifier/Adapter/Css/CssMinifier.php new file mode 100644 index 0000000000000..dddf0a6e4c006 --- /dev/null +++ b/lib/internal/Magento/Framework/Code/Minifier/Adapter/Css/CssMinifier.php @@ -0,0 +1,37 @@ +cssMinifier = $cssMinifier; + } + + /** + * Minify css file content + * + * @param string $content + * @return string + */ + public function minify($content) + { + return $this->cssMinifier->run($content); + } +} diff --git a/lib/internal/Magento/Framework/View/Asset/Merged.php b/lib/internal/Magento/Framework/View/Asset/Merged.php index 43cc09d461e7c..796af0be5cff4 100644 --- a/lib/internal/Magento/Framework/View/Asset/Merged.php +++ b/lib/internal/Magento/Framework/View/Asset/Merged.php @@ -169,6 +169,6 @@ public function valid() */ public static function getRelativeDir() { - return Minified::CACHE_VIEW_REL . '/merged'; + return Minified\AbstractAsset::CACHE_VIEW_REL . '/merged'; } } diff --git a/lib/internal/Magento/Framework/View/Asset/Minified.php b/lib/internal/Magento/Framework/View/Asset/Minified/AbstractAsset.php similarity index 89% rename from lib/internal/Magento/Framework/View/Asset/Minified.php rename to lib/internal/Magento/Framework/View/Asset/Minified/AbstractAsset.php index 59d9759ed0c43..f210ee94f57b0 100644 --- a/lib/internal/Magento/Framework/View/Asset/Minified.php +++ b/lib/internal/Magento/Framework/View/Asset/Minified/AbstractAsset.php @@ -3,14 +3,17 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Framework\View\Asset; + +namespace Magento\Framework\View\Asset\Minified; use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\View\Asset\MergeableInterface; +use Magento\Framework\View\Asset\LocalInterface; /** * Minified page asset */ -class Minified implements MergeableInterface +abstract class AbstractAsset implements MergeableInterface { /**#@+ * Strategies for verifying whether the files need to be minified @@ -244,7 +247,7 @@ protected function process() */ protected function isFileMinified($fileName) { - return (bool)preg_match('#.min.\w+$#', $fileName); + return (bool)preg_match('#\.min\.\w+$#', $fileName); } /** @@ -298,32 +301,12 @@ protected function fillPropertiesByOriginalAssetWithMin() $this->url = $this->composeMinifiedName($this->originalAsset->getUrl()); } - /** - * Generate minified file and fill the properties to reference that file - * - * @return void - */ - protected function fillPropertiesByMinifyingAsset() - { - $path = $this->originalAsset->getPath(); - $this->context = new \Magento\Framework\View\Asset\File\Context( - $this->baseUrl->getBaseUrl(['_type' => \Magento\Framework\UrlInterface::URL_TYPE_STATIC]), - DirectoryList::STATIC_VIEW, - self::CACHE_VIEW_REL . '/minified' - ); - $this->filePath = md5($path) . '_' . $this->composeMinifiedName(basename($path)); - $this->path = $this->context->getPath() . '/' . $this->filePath; - $this->minify(); - $this->file = $this->staticViewDir->getAbsolutePath($this->path); - $this->url = $this->context->getBaseUrl() . $this->path; - } - /** * Perform actual minification * * @return void */ - private function minify() + protected function minify() { $isExists = $this->staticViewDir->isExist($this->path); if (!$isExists) { @@ -341,4 +324,11 @@ private function minify() $this->staticViewDir->writeFile($this->path, $content); } } + + /** + * Generate minified file and fill the properties to reference that file + * + * @return void + */ + abstract protected function fillPropertiesByMinifyingAsset(); } diff --git a/lib/internal/Magento/Framework/View/Asset/Minified/ImmutablePathAsset.php b/lib/internal/Magento/Framework/View/Asset/Minified/ImmutablePathAsset.php new file mode 100644 index 0000000000000..72f0983284d62 --- /dev/null +++ b/lib/internal/Magento/Framework/View/Asset/Minified/ImmutablePathAsset.php @@ -0,0 +1,26 @@ +context = $this->originalAsset->getContext(); + $this->filePath = $this->originalAsset->getPath(); + $this->path = $this->filePath; + $this->minify(); + $this->file = $this->staticViewDir->getAbsolutePath($this->path); + $this->url = $this->context->getBaseUrl() . $this->path; + } +} diff --git a/lib/internal/Magento/Framework/View/Asset/Minified/MutablePathAsset.php b/lib/internal/Magento/Framework/View/Asset/Minified/MutablePathAsset.php new file mode 100644 index 0000000000000..f31e2ef7a0b2a --- /dev/null +++ b/lib/internal/Magento/Framework/View/Asset/Minified/MutablePathAsset.php @@ -0,0 +1,32 @@ +originalAsset->getPath(); + $this->context = new \Magento\Framework\View\Asset\File\Context( + $this->baseUrl->getBaseUrl(['_type' => \Magento\Framework\UrlInterface::URL_TYPE_STATIC]), + DirectoryList::STATIC_VIEW, + self::CACHE_VIEW_REL . '/minified' + ); + $this->filePath = md5($path) . '_' . $this->composeMinifiedName(basename($path)); + $this->path = $this->context->getPath() . '/' . $this->filePath; + $this->minify(); + $this->file = $this->staticViewDir->getAbsolutePath($this->path); + $this->url = $this->context->getBaseUrl() . $this->path; + } +} diff --git a/lib/internal/Magento/Framework/View/Asset/MinifyService.php b/lib/internal/Magento/Framework/View/Asset/MinifyService.php index b52e7be5ec987..74a1518513ac4 100644 --- a/lib/internal/Magento/Framework/View/Asset/MinifyService.php +++ b/lib/internal/Magento/Framework/View/Asset/MinifyService.php @@ -63,27 +63,18 @@ public function __construct( * Assets applicable for minification are wrapped with the minified asset * * @param array|\Iterator $assets - * @return \Magento\Framework\View\Asset\Minified[] + * @param bool $isDirectRequest + * @return Minified\AbstractAsset[] */ - public function getAssets($assets) + public function getAssets($assets, $isDirectRequest = false) { $resultAssets = []; $strategy = $this->appMode == \Magento\Framework\App\State::MODE_PRODUCTION - ? Minified::FILE_EXISTS : Minified::MTIME; + ? Minified\AbstractAsset::FILE_EXISTS : Minified\AbstractAsset::MTIME; /** @var $asset AssetInterface */ foreach ($assets as $asset) { - $contentType = $asset->getContentType(); - if ($this->isEnabled($contentType)) { - /** @var \Magento\Framework\View\Asset\Minified $asset */ - $asset = $this->objectManager - ->create( - 'Magento\Framework\View\Asset\Minified', - [ - 'asset' => $asset, - 'strategy' => $strategy, - 'adapter' => $this->getAdapter($contentType), - ] - ); + if ($this->isEnabled($asset->getContentType())) { + $asset = $this->getAssetDecorated($asset, $strategy, $isDirectRequest); } $resultAssets[] = $asset; } @@ -131,4 +122,43 @@ protected function getAdapter($contentType) } return $this->adapters[$contentType]; } + + /** + * Returns asset decorated by corresponding minifier + * + * @param AssetInterface $asset + * @param string $strategy + * @param bool $isDirectRequest + * @return AssetInterface + * @throws \Magento\Framework\Exception + */ + protected function getAssetDecorated(AssetInterface $asset, $strategy, $isDirectRequest) + { + return + $this->objectManager->create( + $this->getDecoratorClass($asset, $isDirectRequest), + [ + 'asset' => $asset, + 'strategy' => $strategy, + 'adapter' => $this->getAdapter($asset->getContentType()) + ] + ); + } + + /** + * Returns minifier decorator class name for given asset + * + * @param AssetInterface $asset + * @param bool $isDirectRequest + * @return string + */ + protected function getDecoratorClass(AssetInterface $asset, $isDirectRequest) + { + if ($isDirectRequest || $asset->getContentType() == 'css') { + $result = 'Magento\Framework\View\Asset\Minified\ImmutablePathAsset'; + } else { + $result = 'Magento\Framework\View\Asset\Minified\MutablePathAsset'; + } + return $result; + } }