diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dff18dd67b5277c060ab2df7ffb8e0725eb78bb..547218c2a2430f34900a8db688dcf9d22e5fe4fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,32 @@ +2.0.0.0-dev60 +============= +* Fixed bugs: + * Fixed an issue with exceeding the memory limit when uploading very big images + * Fixed an issue in moving a category when $afterCategoryId is null + * Fixed an issue when products from a non-default website were not available as bundle items + * Fixed an issue when orders placed via Authorize.net had the wrong statuses + * Fixed an issue where orders placed via PayPal Express Checkout could not be placed if HTTPS was used on the frontend + * Fixed a security issue with a user session during registration + * Removed a CSRF vulnerability in checkout + * Fixed an issue with JavaScript static testing framework not handling corrupted paths in white/black lists properly + * Fixed an issue with Google Shopping synchronization + * Fixed the contextual help tooltip design + * Fixed an issue with the Authorize.net CC section UI on the Onepage Checkout page + * Fixed UI issues on the order pages in the backend + * Fixed UI issues in the backend for IE9 + * Fixed UI issues on the Edit Customer page in the backend + * Fixed a UI issue with the image preview placeholder on the Edit Product page for IE9 + * Fixed UI issues with forms in the backend + * Fixed UI issues with buttons in the backend + * Fixed an issue with a product status after a virtual product was duplicated + * Fixed a fatal error with attribute file from the customer account page in the backend + * Fixed a security issue when CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST where used with improper values sometimes + * Updated the field descriptions for Secure Base URL settings in the backend + * Fixed an issue in product duplication for multiple store views + * Consolidated several 3rd-party JavaScript libraries in the pub/lib directory, and fixed license notice texts to conform to the open source license requirements +* Service Layer implementation: + * Implemented the initial set of services for the Customer module + 2.0.0.0-dev59 ============= * Fixed bugs: @@ -103,6 +132,10 @@ * Fixed date resetting to 1 Jan 1970 after saving a design change in the admin panel in case date format is DD/MM/YY * Fixed CAPTCHA on multi-address checkout flow * Fixed view files population tool + * Fixed DHL functionality of generation shipping labels + * Fixed target rule if it is applied for specific customer segment + * Fixed product importing that cleared price and weight + * Fixed fatal error when a file reference is added to HTML head * GitHub requests: * [#122](https://github.com/magento/magento2/pull/122) -- Added support of federal units of Brazil with 27 states * [#184](https://github.com/magento/magento2/issues/184) -- Removed unused blocks and methods in Magento_Wishlist module diff --git a/app/code/Magento/Authorizenet/Model/Directpost/Observer.php b/app/code/Magento/Authorizenet/Model/Directpost/Observer.php index a9091ad238770b4db0e217bfc653031ff5651880..3933a7ce5802d354afa42f2a27610ba7812dc681 100644 --- a/app/code/Magento/Authorizenet/Model/Directpost/Observer.php +++ b/app/code/Magento/Authorizenet/Model/Directpost/Observer.php @@ -57,9 +57,9 @@ class Observer protected $_authorizenetData; /** - * @var \Magento\Authorizenet\Model\DirectpostFactory + * @var \Magento\Authorizenet\Model\Directpost */ - protected $_modelFactory; + protected $_payment; /** * @var \Magento\Authorizenet\Model\Directpost\Session @@ -75,7 +75,7 @@ class Observer * @param \Magento\Authorizenet\Helper\Data $authorizenetData * @param \Magento\Core\Helper\Data $coreData * @param \Magento\Core\Model\Registry $coreRegistry - * @param \Magento\Authorizenet\Model\DirectpostFactory $modelFactory + * @param \Magento\Authorizenet\Model\Directpost $payment * @param \Magento\Authorizenet\Model\Directpost\Session $session * @param \Magento\Core\Model\StoreManagerInterface $storeManager */ @@ -83,14 +83,14 @@ class Observer \Magento\Authorizenet\Helper\Data $authorizenetData, \Magento\Core\Helper\Data $coreData, \Magento\Core\Model\Registry $coreRegistry, - \Magento\Authorizenet\Model\DirectpostFactory $modelFactory, + \Magento\Authorizenet\Model\Directpost $payment, \Magento\Authorizenet\Model\Directpost\Session $session, \Magento\Core\Model\StoreManagerInterface $storeManager ) { $this->_coreRegistry = $coreRegistry; $this->_authorizenetData = $authorizenetData; $this->_coreData = $coreData; - $this->_modelFactory = $modelFactory; + $this->_payment = $payment; $this->_session = $session; $this->_storeManager = $storeManager; } @@ -123,9 +123,11 @@ class Observer if ($order && $order->getId()) { $payment = $order->getPayment(); - if ($payment && $payment->getMethod() == $this->_modelFactory->create()->getCode()) { - $request = $observer->getEvent()->getRequest(); - $response = $observer->getEvent()->getResponse(); + if ($payment && $payment->getMethod() == $this->_payment->getCode()) { + /** @var \Magento\Checkout\Controller\Action $controller */ + $controller = $observer->getEvent()->getData('controller_action'); + $request = $controller->getRequest(); + $response = $controller->getResponse(); $result = $this->_coreData->jsonDecode($response->getBody('default')); if (empty($result['error'])) { diff --git a/app/code/Magento/Backend/App/Response/Http/FileFactory.php b/app/code/Magento/Backend/App/Response/Http/FileFactory.php index bdd5467f3eea403e0d0880f2f7d62bb6b19ac704..1d31691362280c1cfb59d95849c3742847b7d3ce 100644 --- a/app/code/Magento/Backend/App/Response/Http/FileFactory.php +++ b/app/code/Magento/Backend/App/Response/Http/FileFactory.php @@ -104,15 +104,21 @@ class FileFactory extends \Magento\App\Response\Http\FileFactory * @param string $fileName * @param string|array $content set to null to avoid starting output, $contentLength should be set explicitly in * that case + * @param string $baseDir * @param string $contentType * @param int $contentLength explicit content length, if strlen($content) isn't applicable * @return \Magento\App\ResponseInterface */ - public function create($fileName, $content, $contentType = 'application/octet-stream', $contentLength = null) - { + public function create( + $fileName, + $content, + $baseDir = \Magento\Filesystem::ROOT, + $contentType = 'application/octet-stream', + $contentLength = null + ) { if ($this->_auth->getAuthStorage()->isFirstPageAfterLogin()) { return $this->_redirect($this->_backendUrl->getStartupPageUrl()); } - return parent::create($fileName, $content, $contentType, $contentLength); + return parent::create($fileName, $content, $baseDir, $contentType, $contentLength); } } diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Currency.php b/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Currency.php index 8f7f5c740d4782464931bd1118c06116236391ea..d27929d23a4736d1fe474264b4fdf961fed230b8 100644 --- a/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Currency.php +++ b/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Currency.php @@ -63,21 +63,30 @@ class Currency */ protected $_currencyLocator; + /** + * @var \Magento\Directory\Model\Currency + */ + protected $_baseCurrency; + /** * @param \Magento\Backend\Block\Context $context * @param \Magento\Core\Model\StoreManagerInterface $storeManager * @param \Magento\Directory\Model\Currency\DefaultLocator $currencyLocator + * @param \Magento\Directory\Model\CurrencyFactory $currencyFactory * @param array $data */ public function __construct( \Magento\Backend\Block\Context $context, \Magento\Core\Model\StoreManagerInterface $storeManager, \Magento\Directory\Model\Currency\DefaultLocator $currencyLocator, + \Magento\Directory\Model\CurrencyFactory $currencyFactory, array $data = array() ) { parent::__construct($context, $data); $this->_storeManager = $storeManager; $this->_currencyLocator = $currencyLocator; + $baseCurrencyCode = $this->_app->getBaseCurrencyCode(); + $this->_baseCurrency = $currencyFactory->create()->load($baseCurrencyCode); } /** @@ -131,7 +140,7 @@ class Currency if ($rate = $row->getData($this->getColumn()->getRateField())) { return floatval($rate); } - return $this->_storeManager->getStore()->getBaseCurrency()->getRate($this->_getCurrencyCode($row)); + return $this->_baseCurrency->getRate($this->_getCurrencyCode($row)); } /** diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Config.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Config.php index 87dc52fe4cf44566df64c01f24fbf09cd6c93679..f52eeafb16267372aef95844497d2d3774132f81 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Config.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Config.php @@ -132,6 +132,6 @@ class Config extends \Magento\Backend\Controller\Adminhtml\System\AbstractConfig } $gridBlock->setWebsiteId($website->getId())->setConditionName($conditionName); $content = $gridBlock->getCsvFile(); - return $this->_fileFactory->create($fileName, $content); + return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR); } } diff --git a/app/code/Magento/Backend/etc/adminhtml/system.xml b/app/code/Magento/Backend/etc/adminhtml/system.xml index 116468e20ffd92b0aca0ef6818a07da5e9957f3d..51b94714722eeda27321f430e61df074691c6557 100644 --- a/app/code/Magento/Backend/etc/adminhtml/system.xml +++ b/app/code/Magento/Backend/etc/adminhtml/system.xml @@ -551,7 +551,7 @@ </group> <group id="secure" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Base URLs (Secure)</label> - <comment>Any of the fields allow fully qualified URLs that end with '/' (slash) e.g. http://example.com/magento/</comment> + <comment>Any of the fields allow fully qualified URLs that end with '/' (slash) e.g. https://example.com/magento/</comment> <field id="base_url" translate="label comment" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Secure Base URL</label> <backend_model>Magento\Backend\Model\Config\Backend\Baseurl</backend_model> @@ -586,11 +586,13 @@ <label>Use Secure URLs in Frontend</label> <source_model>Magento\Backend\Model\Config\Source\Yesno</source_model> <backend_model>Magento\Backend\Model\Config\Backend\Secure</backend_model> + <comment>Enter https protocol to use Secure URLs in Frontend.</comment> </field> <field id="use_in_adminhtml" translate="label" type="select" sortOrder="60" showInDefault="1" showInWebsite="0" showInStore="0"> <label>Use Secure URLs in Admin</label> <source_model>Magento\Backend\Model\Config\Source\Yesno</source_model> <backend_model>Magento\Backend\Model\Config\Backend\Secure</backend_model> + <comment>Enter https protocol to use Secure URLs in Admin.</comment> </field> <field id="offloader_header" translate="label" type="text" sortOrder="70" showInDefault="1" showInWebsite="0" showInStore="0"> <label>Offloader header</label> diff --git a/app/code/Magento/Backend/view/adminhtml/admin/login.phtml b/app/code/Magento/Backend/view/adminhtml/admin/login.phtml index 870740c2c7d1dcb535e31e11b1f08f2f9bb7f6d0..6ab6f9a707dc23fbdde47047d217d52ba138ac54 100644 --- a/app/code/Magento/Backend/view/adminhtml/admin/login.phtml +++ b/app/code/Magento/Backend/view/adminhtml/admin/login.phtml @@ -26,7 +26,6 @@ ?> <!doctype html> <html lang="en"> - <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><?php echo __('Log into Magento Admin Page') ?></title> @@ -38,10 +37,12 @@ <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/base.css') ?>" media="all" /> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/elements.css') ?>" media="all" /> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/form.css') ?>" media="all" /> - <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/styles.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/admin.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/header.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/pages.css') ?>" media="all" /> + <?php /* <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/styles.css') ?>" media="all" /> */?> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/utils.css') ?>" media="all" /> - <script src="<?php echo $this->getViewFileUrl('jquery/jquery.js') ?>"></script> <script src="<?php echo $this->getViewFileUrl('mage/jquery-no-conflict.js') ?>"></script> <script src="<?php echo $this->getViewFileUrl('jquery/jquery-ui.js') ?>"></script> @@ -55,9 +56,9 @@ <script src="<?php echo $this->getViewFileUrl('prototype/prototype.js') ?>"></script> <script src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js') ?>"></script> <script src="<?php echo $this->getViewFileUrl('mage/captcha.js') ?>"></script> - <script src="<?php echo $this->getViewFileUrl('lib/modernizr.js') ?>"></script> - <script src="<?php echo $this->getViewFileUrl('js/head.js') ?>"></script> - + <script src="<?php echo $this->getViewFileUrl('modernizr/modernizr.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('headjs/head.min.js') ?>"></script> +</head> <body id="page-login" class="page-login" onload="document.forms['login-form'].username.focus();"> <div class="wrapper"> <div class="wrapper-inner"> diff --git a/app/code/Magento/Backend/view/adminhtml/layout/default.xml b/app/code/Magento/Backend/view/adminhtml/layout/default.xml index 2617de104d60a57b35fa944584d1c408c9746ad8..6ac8380a4c0c8fb0ac9db59a8284f3fad672abfd 100644 --- a/app/code/Magento/Backend/view/adminhtml/layout/default.xml +++ b/app/code/Magento/Backend/view/adminhtml/layout/default.xml @@ -46,7 +46,7 @@ </block> <block class="Magento\Theme\Block\Html\Head\Script" name="head-load-min-js"> <arguments> - <argument name="file" xsi:type="string">head.load.min.js</argument> + <argument name="file" xsi:type="string">headjs/head.load.min.js</argument> </arguments> </block> <block class="Magento\Theme\Block\Html\Head\Script" name="underscore-js"> @@ -300,4 +300,4 @@ </block> <container name="before_body_end" as="before_body_end" label="Before Body End"/> </block> -</layout> \ No newline at end of file +</layout> diff --git a/app/code/Magento/Backend/view/adminhtml/layout/editor.xml b/app/code/Magento/Backend/view/adminhtml/layout/editor.xml index c3b4b1594a8d0534a285e6f16f1f44bfef97dcc7..da3199561ac85f8984225f9fb06c8d758c44b093 100644 --- a/app/code/Magento/Backend/view/adminhtml/layout/editor.xml +++ b/app/code/Magento/Backend/view/adminhtml/layout/editor.xml @@ -40,7 +40,7 @@ </block> <block class="Magento\Theme\Block\Html\Head\Script" name="lib-flex-js"> <arguments> - <argument name="file" xsi:type="string">lib/flex.js</argument> + <argument name="file" xsi:type="string">mage/flex.js</argument> </arguments> </block> <block class="Magento\Theme\Block\Html\Head\Script" name="lib-fabridge-js"> diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index.php b/app/code/Magento/Backup/Controller/Adminhtml/Index.php index 55e5ab38d71a89608e48b30ed7f46b94661ea2dc..7eaac4b66cdd891eb41f9b240b43b2d7fcfad2ce 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index.php @@ -212,7 +212,13 @@ class Index extends \Magento\Backend\App\Action $fileName = $this->_objectManager->get('Magento\Backup\Helper\Data') ->generateBackupDownloadName($backup); - $response = $this->_fileFactory->create($fileName, null, 'application/octet-stream', $backup->getSize()); + $response = $this->_fileFactory->create( + $fileName, + null, + \Magento\Filesystem::VAR_DIR, + 'application/octet-stream', + $backup->getSize() + ); $response->sendHeaders(); diff --git a/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Search/Grid.php b/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Search/Grid.php index 145af9ddf9f3009605c0cacb27649625a5cd2390..e16dc110396acbd01aeec50465d2137299c7b7ac 100644 --- a/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Search/Grid.php +++ b/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Search/Grid.php @@ -115,7 +115,6 @@ class Grid { $collection = $this->_productFactory->create()->getCollection() ->setOrder('id') - ->setStore($this->getStore()) ->addAttributeToSelect('name') ->addAttributeToSelect('sku') ->addAttributeToSelect('price') @@ -123,7 +122,7 @@ class Grid ->addAttributeToFilter('entity_id', array('nin' => $this->_getSelectedProducts())) ->addAttributeToFilter('type_id', array('in' => $this->getAllowedSelectionTypes())) ->addFilterByRequiredOptions() - ->addStoreFilter(); + ->addStoreFilter(\Magento\Core\Model\Store::DEFAULT_STORE_ID); if ($this->getFirstShow()) { $collection->addIdFilter('-1'); @@ -169,8 +168,6 @@ class Grid 'header' => __('Price'), 'align' => 'center', 'type' => 'currency', - 'currency_code' => $this->getStore()->getCurrentCurrencyCode(), - 'rate' => $this->getStore()->getBaseCurrency()->getRate($this->getStore()->getCurrentCurrencyCode()), 'index' => 'price', 'header_css_class'=> 'col-price', 'column_css_class'=> 'col-price' @@ -208,11 +205,6 @@ class Grid } } - public function getStore() - { - return $this->_storeManager->getStore(); - } - /** * Retrieve array of allowed product types for bundle selection product * diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php index c62e6b71d6ea3bf86be1f1b93db08bf9879d8724..ace24f16369238a9a67c7c6ce1c8990d42c6e800 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php @@ -135,15 +135,18 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended ->addAttributeToSelect('sku') ->addAttributeToSelect('name') ->addAttributeToSelect('attribute_set_id') - ->addAttributeToSelect('type_id'); + ->addAttributeToSelect('type_id') + ->setStore($store); if ($this->_catalogData->isModuleEnabled('Magento_CatalogInventory')) { - $collection->joinField('qty', + $collection->joinField( + 'qty', 'cataloginventory_stock_item', 'qty', 'product_id=entity_id', '{{table}}.stock_id=1', - 'left'); + 'left' + ); } if ($store->getId()) { //$collection->setStoreId($store->getId()); @@ -188,8 +191,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended 'left', $store->getId() ); - } - else { + } else { $collection->addAttributeToSelect('price'); $collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner'); $collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner'); @@ -206,12 +208,14 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended { if ($this->getCollection()) { if ($column->getId() == 'websites') { - $this->getCollection()->joinField('websites', + $this->getCollection()->joinField( + 'websites', 'catalog_product_website', 'website_id', 'product_id=entity_id', null, - 'left'); + 'left' + ); } } return parent::_addColumnFilterToCollection($column); @@ -219,7 +223,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended protected function _prepareColumns() { - $this->addColumn('entity_id', + $this->addColumn( + 'entity_id', array( 'header'=> __('ID'), 'width' => '50px', @@ -227,28 +232,34 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended 'index' => 'entity_id', 'header_css_class' => 'col-id', 'column_css_class' => 'col-id' - )); - $this->addColumn('name', + ) + ); + $this->addColumn( + 'name', array( 'header'=> __('Name'), 'index' => 'name', 'class' => 'xxx', 'header_css_class' => 'col-name', 'column_css_class' => 'col-name' - )); + ) + ); $store = $this->_getStore(); if ($store->getId()) { - $this->addColumn('custom_name', + $this->addColumn( + 'custom_name', array( 'header'=> __('Name in %1', $store->getName()), 'index' => 'custom_name', 'header_css_class' => 'col-name', 'column_css_class' => 'col-name' - )); + ) + ); } - $this->addColumn('type', + $this->addColumn( + 'type', array( 'header'=> __('Type'), 'width' => '60px', @@ -257,14 +268,16 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended 'options' => $this->_type->getOptionArray(), 'header_css_class' => 'col-type', 'column_css_class' => 'col-type' - )); + ) + ); $sets = $this->_setsFactory->create() ->setEntityTypeFilter($this->_productFactory->create()->getResource()->getTypeId()) ->load() ->toOptionHash(); - $this->addColumn('set_name', + $this->addColumn( + 'set_name', array( 'header'=> __('Attribute Set'), 'width' => '100px', @@ -273,19 +286,23 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended 'options' => $sets, 'header_css_class' => 'col-attr-name', 'column_css_class' => 'col-attr-name' - )); + ) + ); - $this->addColumn('sku', + $this->addColumn( + 'sku', array( 'header'=> __('SKU'), 'width' => '80px', 'index' => 'sku', 'header_css_class' => 'col-sku', 'column_css_class' => 'col-sku' - )); + ) + ); $store = $this->_getStore(); - $this->addColumn('price', + $this->addColumn( + 'price', array( 'header'=> __('Price'), 'type' => 'price', @@ -293,10 +310,12 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended 'index' => 'price', 'header_css_class' => 'col-price', 'column_css_class' => 'col-price' - )); + ) + ); if ($this->_catalogData->isModuleEnabled('Magento_CatalogInventory')) { - $this->addColumn('qty', + $this->addColumn( + 'qty', array( 'header'=> __('Quantity'), 'width' => '100px', @@ -304,10 +323,12 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended 'index' => 'qty', 'header_css_class' => 'col-qty', 'column_css_class' => 'col-qty' - )); + ) + ); } - $this->addColumn('visibility', + $this->addColumn( + 'visibility', array( 'header'=> __('Visibility'), 'width' => '70px', @@ -316,9 +337,11 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended 'options' => $this->_visibility->getOptionArray(), 'header_css_class' => 'col-visibility', 'column_css_class' => 'col-visibility' - )); + ) + ); - $this->addColumn('status', + $this->addColumn( + 'status', array( 'header'=> __('Status'), 'width' => '70px', @@ -327,10 +350,12 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended 'options' => $this->_status->getOptionArray(), 'header_css_class' => 'col-status', 'column_css_class' => 'col-status' - )); + ) + ); if (!$this->_storeManager->isSingleStoreMode()) { - $this->addColumn('websites', + $this->addColumn( + 'websites', array( 'header'=> __('Websites'), 'width' => '100px', @@ -340,10 +365,12 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended 'options' => $this->_websiteFactory->create()->getCollection()->toOptionHash(), 'header_css_class' => 'col-websites', 'column_css_class' => 'col-websites' - )); + ) + ); } - $this->addColumn('edit', + $this->addColumn( + 'edit', array( 'header' => __('Edit'), 'width' => '50px', @@ -364,7 +391,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended 'index' => 'stores', 'header_css_class' => 'col-action', 'column_css_class' => 'col-action' - )); + ) + ); if ($this->_catalogData->isModuleEnabled('Magento_Rss')) { $this->addRssList('rss/catalog/notifystock', __('Notify Low Stock RSS')); @@ -402,7 +430,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended ) )); - if ($this->_authorization->isAllowed('Magento_Catalog::update_attributes')){ + if ($this->_authorization->isAllowed('Magento_Catalog::update_attributes')) { $this->getMassactionBlock()->addItem('attributes', array( 'label' => __('Update Attributes'), 'url' => $this->getUrl('catalog/product_action_attribute/edit', array('_current'=>true)) @@ -420,9 +448,12 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended public function getRowUrl($row) { - return $this->getUrl('catalog/*/edit', array( - 'store'=>$this->getRequest()->getParam('store'), - 'id'=>$row->getId()) + return $this->getUrl( + 'catalog/*/edit', + array( + 'store'=>$this->getRequest()->getParam('store'), + 'id'=>$row->getId() + ) ); } } diff --git a/app/code/Magento/Catalog/Model/Category.php b/app/code/Magento/Catalog/Model/Category.php index abc1bf0c2ef8bf2222e72c7ff063a3ab42d83d72..857a2c412eedd2ceb21f596d99f6f06588fc04a4 100644 --- a/app/code/Magento/Catalog/Model/Category.php +++ b/app/code/Magento/Catalog/Model/Category.php @@ -291,7 +291,7 @@ class Category extends \Magento\Catalog\Model\AbstractModel * Move category * * @param int $parentId new parent category id - * @param int $afterCategoryId category id after which we have put current category + * @param null|int $afterCategoryId category id after which we have put current category * @return \Magento\Catalog\Model\Category * @throws \Magento\Core\Exception|\Exception */ diff --git a/app/code/Magento/Catalog/Model/Product.php b/app/code/Magento/Catalog/Model/Product.php index 63e0bae368b224ad28fe1b0e60af1583c799d21a..c1516b3bf3d49b715483a81aff701f64aa528aae 100644 --- a/app/code/Magento/Catalog/Model/Product.php +++ b/app/code/Magento/Catalog/Model/Product.php @@ -241,7 +241,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel * @param \Magento\Data\CollectionFactory $collectionFactory * @param \Magento\Filesystem $filesystem * @param array $data - * + * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -1184,7 +1184,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel ->setCreatedAt(null) ->setUpdatedAt(null) ->setId(null) - ->setStoreId($this->_storeManager->getStore()->getId()); + ->setStoreId(\Magento\Core\Model\Store::DEFAULT_STORE_ID); $this->_eventManager->dispatch( 'catalog_model_product_duplicate', diff --git a/app/code/Magento/Catalog/Model/Resource/Category.php b/app/code/Magento/Catalog/Model/Resource/Category.php index 48fa74ffe6b9c5ecb84d3d18b70116353f45ac3c..6ad68ce9e380887a2beaf5abbab8f5f7de57a05e 100644 --- a/app/code/Magento/Catalog/Model/Resource/Category.php +++ b/app/code/Magento/Catalog/Model/Resource/Category.php @@ -920,32 +920,19 @@ class Category extends \Magento\Catalog\Model\Resource\AbstractResource ->from($table, 'position') ->where('entity_id = :entity_id'); $position = $adapter->fetchOne($select, array('entity_id' => $afterCategoryId)); - - $bind = array( - 'position' => new \Zend_Db_Expr($positionField . ' + 1') - ); - $where = array( - 'parent_id = ?' => $newParent->getId(), - $positionField . ' > ?' => $position - ); - $adapter->update($table, $bind, $where); - } elseif ($afterCategoryId !== null) { - $position = 0; - $bind = array( - 'position' => new \Zend_Db_Expr($positionField . ' + 1') - ); - $where = array( - 'parent_id = ?' => $newParent->getId(), - $positionField . ' > ?' => $position - ); - $adapter->update($table, $bind, $where); + $position += 1; } else { - $select = $adapter->select() - ->from($table, array('position' => new \Zend_Db_Expr('MIN(' . $positionField . ')'))) - ->where('parent_id = :parent_id'); - $position = $adapter->fetchOne($select, array('parent_id' => $newParent->getId())); + $position = 1; } - $position += 1; + + $bind = array( + 'position' => new \Zend_Db_Expr($positionField . ' + 1') + ); + $where = array( + 'parent_id = ?' => $newParent->getId(), + $positionField . ' >= ?' => $position + ); + $adapter->update($table, $bind, $where); return $position; } diff --git a/app/code/Magento/Checkout/Controller/Onepage.php b/app/code/Magento/Checkout/Controller/Onepage.php index 10389798c247d855b44839f4e31a8875a207d58c..5e0eb30d8633782c8b8c8e7dd51127ff39f9a0ae 100644 --- a/app/code/Magento/Checkout/Controller/Onepage.php +++ b/app/code/Magento/Checkout/Controller/Onepage.php @@ -52,17 +52,25 @@ class Onepage extends \Magento\Checkout\Controller\Action */ protected $_coreRegistry = null; + /** + * @var \Magento\Core\App\Action\FormKeyValidator + */ + protected $_formKeyValidator; + /** * @param \Magento\App\Action\Context $context * @param \Magento\Customer\Model\Session $customerSession * @param \Magento\Core\Model\Registry $coreRegistry + * @param \Magento\Core\App\Action\FormKeyValidator $formKeyValidator */ public function __construct( \Magento\App\Action\Context $context, \Magento\Customer\Model\Session $customerSession, - \Magento\Core\Model\Registry $coreRegistry + \Magento\Core\Model\Registry $coreRegistry, + \Magento\Core\App\Action\FormKeyValidator $formKeyValidator ) { $this->_coreRegistry = $coreRegistry; + $this->_formKeyValidator = $formKeyValidator; parent::__construct($context, $customerSession); } @@ -534,6 +542,11 @@ class Onepage extends \Magento\Checkout\Controller\Action */ public function saveOrderAction() { + if (!$this->_formKeyValidator->validate($this->getRequest())) { + $this->_redirect('*/*/'); + return; + } + if ($this->_expireAjax()) { return; } diff --git a/app/code/Magento/Checkout/view/frontend/onepage/payment.phtml b/app/code/Magento/Checkout/view/frontend/onepage/payment.phtml index 07d27b92b3395ce1eed728162dc89b05bc65f626..1ac3170f3c5b5e0f03be0907f1508f7dd0d426ab 100644 --- a/app/code/Magento/Checkout/view/frontend/onepage/payment.phtml +++ b/app/code/Magento/Checkout/view/frontend/onepage/payment.phtml @@ -23,6 +23,7 @@ */ ?> <form id="co-payment-form" class="form payments"> + <?php echo $this->getBlockHtml('formkey') ?> <fieldset class="fieldset"> <?php echo $this->getChildChildHtml('methods_additional') ?> <div id="checkout-payment-method-load"><?php echo $this->getChildHtml('methods') ?></div> diff --git a/app/code/Magento/Core/Model/App.php b/app/code/Magento/Core/Model/App.php index 57bede32828d2459c0f8b145e6ce9d29d149bc16..ccc76fe963684eb77b68196e4c9d6029e983cac6 100644 --- a/app/code/Magento/Core/Model/App.php +++ b/app/code/Magento/Core/Model/App.php @@ -53,7 +53,7 @@ class App implements \Magento\Core\Model\AppInterface /** * Magento version */ - const VERSION = '2.0.0.0-dev59'; + const VERSION = '2.0.0.0-dev60'; /** @@ -804,7 +804,7 @@ class App implements \Magento\Core\Model\AppInterface 'revision' => '0', 'patch' => '0', 'stability' => 'dev', - 'number' => '59', + 'number' => '60', ); } } diff --git a/app/code/Magento/Core/view/adminhtml/prototype/magento.css b/app/code/Magento/Core/view/adminhtml/prototype/magento.css index e0e01a343585dd9995771b59684d1114cba73cb0..602c127772f365d991cff3b037e91dfcb035a8d1 100644 --- a/app/code/Magento/Core/view/adminhtml/prototype/magento.css +++ b/app/code/Magento/Core/view/adminhtml/prototype/magento.css @@ -171,8 +171,8 @@ .popup-window .page-actions { padding: 0; position: absolute; - right: 19px; - top: 29px; + right: 43px; + top: 30px; z-index: 2; } @@ -185,90 +185,6 @@ margin: 5px 0 0; } -/* - Styles for tables in popup window --------------------------------------- */ - -.popup-window .data { - border-collapse: inherit; /* do not remove this! without this rule in FF when table has only 1 row bottom and side borders disappear */ - width: 100%; -} - -.popup-window .grid .data { - border-left: 1px solid #c0bbaf; - border-right: 1px solid #c0bbaf; -} - -.popup-window .grid .data td:first-child { - border-left-width: 0; -} - -.popup-window .grid .data td:last-child { - border-left-width: 0; - border-right-width: 0; -} - -.popup-window .grid .data tr:last-child td { - border-bottom-color: #c0bbaf; -} - -.popup-window .grid tr.headings th, -.popup-window .grid tr.filter th { - background: #fff; - border-color: #c9c2b8; - border-width: 0 0 1px; - color: #666; - padding: 3px 7px; -} - -.popup-window .grid tr.headings th a { - color: #666; -} - -.popup-window .data tr.headings th:hover > span { - border-color: #cac2b5; -} - -.popup-window .grid tr.headings th a:after { - color: #dbd6ce; -} - -.popup-window .grid tr.headings th a:hover:after { - color: #cac2b5; -} - -.popup-window .grid .filter input.input-text, -.popup-window .grid .filter select { - background: #fff; - border: 1px solid #ccc; - color: #666; -} - -.popup-window .grid tr th:first-child { - border: 0; -} - -.popup-window .grid tbody tr:first-child td { - border-top: 1px solid #eae8e4; -} - -.popup-window .grid tbody tr td, -.popup-window .grid tbody tr td:hover { - border-bottom: 1px solid #eae8e4; - padding: 3px 7px; -} - -.popup-window .grid tbody tr:nth-child(odd) td, -.popup-window .grid tbody tr:nth-child(odd):hover td { - background: #fbfaf6; -} - -.popup-window .grid tr.on-mouse td, -.popup-window .grid table tbody tr.on-mouse:hover td, -.popup-window .grid table tbody tr.on-mouse:nth-child(odd):hover td { - background-color: #f3efea; -} - .popup-window .data .col-id { width: 35px; } @@ -325,6 +241,10 @@ margin: 0 5px 0 0; } +.magento_message #contents-uploader { + margin: 0 0 18px; +} + .magento_message .fileinput-button { display: inline-block; cursor: pointer; @@ -332,6 +252,18 @@ vertical-align: middle; } +.magento_message .fileinput-button span { + display: none; +} + +.magento_message .fileinput-button input { + position: static; + border: none; + opacity: 1; + filter: alpha(opacity=1); + -moz-transform: none; +} + .magento_message .file-row { background: #fff; border: 1px solid #cac2b5; @@ -422,7 +354,8 @@ .ui-dialog .ui-dialog-title { color: #676056; - font: normal 20px/1 'CallunaSans'; + font-size: 20px; + line-height: 1; display: block; padding: 19px 0 19px 20px; cursor: move; @@ -464,10 +397,6 @@ border: none; } -.ui-dialog .ui-dialog-content { - padding: 10px 10px 0; -} - .ui-dialog .ui-dialog-content .fieldset { border-radius: 0; border: none; @@ -475,7 +404,7 @@ .ui-dialog .ui-dialog-content { overflow: auto; - padding: 25px 25px 0; + padding: 25px 25px 20px; } .ui-dialog .ui-dialog-content label.mage-error { @@ -489,7 +418,7 @@ .ui-dialog .ui-dialog-buttonpane { margin: 0; - padding: 25px; + padding: 0 25px 25px; border: none; } diff --git a/app/code/Magento/Customer/Block/Adminhtml/Form/Element/File.php b/app/code/Magento/Customer/Block/Adminhtml/Form/Element/File.php index 16efc3174897d09f696fa004850cbb0ccb6ac5c4..78309d6b9d3cc2db63eae84059fa06b5c29ecc9e 100644 --- a/app/code/Magento/Customer/Block/Adminhtml/Form/Element/File.php +++ b/app/code/Magento/Customer/Block/Adminhtml/Form/Element/File.php @@ -194,7 +194,7 @@ class File extends \Magento\Data\Form\Element\AbstractElement protected function _getPreviewUrl() { return $this->_adminhtmlData->getUrl('customer/index/viewfile', array( - 'file' => $this->_escaper->urlEncode($this->getValue()), + 'file' => $this->_adminhtmlData->urlEncode($this->getValue()), )); } diff --git a/app/code/Magento/Customer/Block/Adminhtml/Grid/Renderer/Multiaction.php b/app/code/Magento/Customer/Block/Adminhtml/Grid/Renderer/Multiaction.php index ba91bb791fbd7a97132aaf7210e9d8c160235e3c..d56732b70273932a7877d1e19158674a0c736da0 100644 --- a/app/code/Magento/Customer/Block/Adminhtml/Grid/Renderer/Multiaction.php +++ b/app/code/Magento/Customer/Block/Adminhtml/Grid/Renderer/Multiaction.php @@ -71,7 +71,7 @@ class Multiaction * * @param array $action * @param \Magento\Object $row - * @return string + * @return bool|string */ protected function _toLinkHtml($action, \Magento\Object $row) { @@ -81,12 +81,10 @@ class Multiaction if ($product->canConfigure()) { $style = ''; $onClick = sprintf('onclick="return %s.configureItem(%s)"', $action['control_object'], $row->getId()); + return sprintf('<a href="%s" %s %s>%s</a>', $action['url'], $style, $onClick, $action['caption']); } else { - $style = 'style="color: #CCC;"'; - $onClick = ''; + return false; } - - return sprintf('<a href="%s" %s %s>%s</a>', $action['url'], $style, $onClick, $action['caption']); } else { return parent::_toLinkHtml($action, $row); } diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index.php b/app/code/Magento/Customer/Controller/Adminhtml/Index.php index 59ef90046cd89a3c22ccb96ad4d1f8bdc990f549..fa3cbeada28de9f770b55e3c28ebbf3aa32ba916 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index.php @@ -472,7 +472,7 @@ class Index extends \Magento\Backend\App\Action $fileName = 'customers.csv'; $content = $this->_view->getLayout()->createBlock('Magento\Customer\Block\Adminhtml\Grid')->getCsvFile(); - return $this->_fileFactory->create($fileName, $content); + return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR); } /** @@ -482,7 +482,7 @@ class Index extends \Magento\Backend\App\Action { $fileName = 'customers.xml'; $content = $this->_view->getLayout()->createBlock('Magento\Customer\Block\Adminhtml\Grid')->getExcelFile(); - return $this->_fileFactory->create($fileName, $content); + return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR); } /** @@ -851,8 +851,8 @@ class Index extends \Magento\Backend\App\Action /** @var \Magento\Filesystem $filesystem */ $filesystem = $this->_objectManager->get('Magento\Filesystem'); - $directory = $filesystem->getDirectoryRead(\Magento\Filesystem:: MEDIA); - $fileName = 'customer/' . $file; + $directory = $filesystem->getDirectoryRead(\Magento\Filesystem::MEDIA); + $fileName = 'customer' . '/' . ltrim($file, '/'); $path = $directory->getAbsolutePath($fileName); if (!$directory->isFile($fileName) && !$this->_objectManager->get('Magento\Core\Helper\File\Storage') @@ -877,7 +877,7 @@ class Index extends \Magento\Backend\App\Action $contentType = 'application/octet-stream'; break; } - $stat = $directory->stat($fileName); + $stat = $directory->stat($path); $contentLength = $stat['size']; $contentModify = $stat['mtime']; @@ -893,10 +893,14 @@ class Index extends \Magento\Backend\App\Action echo $directory->readFile($fileName); } else { $name = pathinfo($path, PATHINFO_BASENAME); - $this->_fileFactory->create($name, array( - 'type' => 'filename', - 'value' => $fileName - ))->sendResponse(); + $this->_fileFactory->create( + $name, + array( + 'type' => 'filename', + 'value' => $fileName + ), + \Magento\Filesystem::MEDIA + )->sendResponse(); } exit(); diff --git a/app/code/Magento/Customer/Model/Address.php b/app/code/Magento/Customer/Model/Address.php index 5c717ae04860cf7d8852a2079200882f39120029..4165b79e5662bb0743a6f81fec5fa59e3f4d709c 100644 --- a/app/code/Magento/Customer/Model/Address.php +++ b/app/code/Magento/Customer/Model/Address.php @@ -160,7 +160,7 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress /** * Retrieve address entity attributes * - * @return array + * @return \Magento\Customer\Model\Attribute[] */ public function getAttributes() { @@ -174,6 +174,16 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress return $attributes; } + /** + * Get attributes created by default + * + * @return string[] + */ + public function getDefaultAttributeCodes() + { + return $this->_getResource()->getDefaultAttributes(); + } + public function __clone() { $this->setId(null); diff --git a/app/code/Magento/Customer/Model/Converter.php b/app/code/Magento/Customer/Model/Converter.php new file mode 100644 index 0000000000000000000000000000000000000000..a3f039a7fc27c3f76d2412e73f3086e2ca9ca4aa --- /dev/null +++ b/app/code/Magento/Customer/Model/Converter.php @@ -0,0 +1,165 @@ +<?php +/** + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Model; + +use Magento\Customer\Service\Entity\V1\Exception; +use Magento\Customer\Service\V1\CustomerMetadataServiceInterface; + +/** + * Customer Model converter. + * + * Converts a Customer Model to a DTO. + * + * TODO: Remove this class after service refactoring is done and the model + * TODO: is no longer needed outside of service. Then this function could + * TODO: be moved to the service. + */ +class Converter +{ + /** + * @var \Magento\Customer\Service\V1\Dto\CustomerBuilder + */ + protected $_customerBuilder; + + /** + * @var CustomerFactory + */ + protected $_customerFactory; + + /** + * @param CustomerFactory $customerFactory + * @param \Magento\Customer\Service\V1\Dto\CustomerBuilder $customerBuilder + */ + public function __construct( + \Magento\Customer\Service\V1\Dto\CustomerBuilder $customerBuilder, + \Magento\Customer\Model\CustomerFactory $customerFactory + ) { + $this->_customerBuilder = $customerBuilder; + $this->_customerFactory = $customerFactory; + } + + /** + * Convert a customer model to a customer entity + * + * @param \Magento\Customer\Model\Customer $customerModel + * @throws \InvalidArgumentException + * @return \Magento\Customer\Service\V1\Dto\Customer + */ + public function createCustomerFromModel($customerModel) + { + if (!($customerModel instanceof \Magento\Customer\Model\Customer)) { + throw new \InvalidArgumentException('customer model is invalid'); + } + $this->_convertAttributesFromModel($this->_customerBuilder, $customerModel); + $this->_customerBuilder->setCustomerId($customerModel->getId()); + $this->_customerBuilder->setFirstname($customerModel->getFirstname()); + $this->_customerBuilder->setLastname($customerModel->getLastname()); + $this->_customerBuilder->setEmail($customerModel->getEmail()); + return $this->_customerBuilder->create(); + } + + + /** + * @param int $customerId + * @throws Exception If customerId is not found or other error occurs. + * @return Customer + */ + public function getCustomerModel($customerId) + { + try { + $customer = $this->_customerFactory->create()->load($customerId); + } catch (\Exception $e) { + throw new Exception($e->getMessage(), $e->getCode(), $e); + } + + if (!$customer->getId()) { + // customer does not exist + throw new Exception( + 'No customer with customerId ' . $customerId . ' exists.', + Exception::CODE_INVALID_CUSTOMER_ID + ); + } else { + return $customer; + } + } + + + /** + * Creates a customer model from a customer entity. + * + * @param \Magento\Customer\Service\V1\Dto\Customer $customer + * @return Customer + */ + public function createCustomerModel(\Magento\Customer\Service\V1\Dto\Customer $customer) + { + $customerModel = $this->_customerFactory->create(); + + $attributes = $customer->getAttributes(); + foreach ($attributes as $attributeCode => $attributeValue) { + // avoid setting password through set attribute + if ($attributeCode == 'password') { + continue; + } else { + $customerModel->setData($attributeCode, $attributeValue); + } + } + + $customerId = $customer->getCustomerId(); + if ($customerId) { + $customerModel->setId($customerId); + } + + // Need to use attribute set or future updates can cause data loss + if (!$customerModel->getAttributeSetId()) { + $customerModel->setAttributeSetId(CustomerMetadataServiceInterface::CUSTOMER_ATTRIBUTE_SET_ID); + return $customerModel; + } + + return $customerModel; + } + + /** + * Loads the values from a customer model + * + * @param \Magento\Customer\Service\V1\Dto\CustomerBuilder $customerBuilder + * @param \Magento\Customer\Model\Customer $customerModel + */ + protected function _convertAttributesFromModel($customerBuilder, $customerModel) + { + $attributes = []; + foreach ($customerModel->getAttributes() as $attribute) { + $attrCode = $attribute->getAttributeCode(); + $value = $customerModel->getData($attrCode); + if (null == $value) { + continue; + } + $attributes[$attrCode] = $value; + } + + $customerBuilder->populateWithArray($attributes); + } + +} diff --git a/app/code/Magento/Customer/Model/Customer.php b/app/code/Magento/Customer/Model/Customer.php index f50926cd4c704c065ae45f6ea679b23fe21d71ce..ea8c6f2d5af197902915df67d4fc6c7c4f0822db 100644 --- a/app/code/Magento/Customer/Model/Customer.php +++ b/app/code/Magento/Customer/Model/Customer.php @@ -30,6 +30,7 @@ namespace Magento\Customer\Model; * Customer model * * @method int getWebsiteId() getWebsiteId() + * @method \Magento\Customer\Model\Customer setWebsiteId(int) * @method int getStoreId() getStoreId() * @method string getEmail() getEmail() * @method \Magento\Customer\Model\Resource\Customer _getResource() @@ -170,14 +171,14 @@ class Customer extends \Magento\Core\Model\AbstractModel protected $_emailInfoFactory; /** - * @var \Magento\Customer\Model\GroupFactory + * @var \Magento\Customer\Model\AttributeFactory */ - protected $_groupFactory; + protected $_attributeFactory; /** - * @var \Magento\Customer\Model\AttributeFactory + * @var \Magento\Customer\Service\V1\CustomerGroupServiceInterface */ - protected $_attributeFactory; + protected $_groupService; /** * @var \Magento\Encryption\EncryptorInterface @@ -208,7 +209,7 @@ class Customer extends \Magento\Core\Model\AbstractModel * @param \Magento\Customer\Model\Resource\Address\CollectionFactory $addressesFactory * @param \Magento\Email\Model\Template\MailerFactory $mailerFactory * @param \Magento\Email\Model\InfoFactory $emailInfoFactory - * @param \Magento\Customer\Model\GroupFactory $groupFactory + * @param \Magento\Customer\Service\V1\CustomerGroupServiceInterface $groupService * @param \Magento\Customer\Model\AttributeFactory $attributeFactory * @param \Magento\Encryption\EncryptorInterface $encryptor * @param \Magento\Math\Random $mathRandom @@ -230,7 +231,7 @@ class Customer extends \Magento\Core\Model\AbstractModel \Magento\Customer\Model\Resource\Address\CollectionFactory $addressesFactory, \Magento\Email\Model\Template\MailerFactory $mailerFactory, \Magento\Email\Model\InfoFactory $emailInfoFactory, - \Magento\Customer\Model\GroupFactory $groupFactory, + \Magento\Customer\Service\V1\CustomerGroupServiceInterface $groupService, \Magento\Customer\Model\AttributeFactory $attributeFactory, \Magento\Encryption\EncryptorInterface $encryptor, \Magento\Math\Random $mathRandom, @@ -248,7 +249,7 @@ class Customer extends \Magento\Core\Model\AbstractModel $this->_addressesFactory = $addressesFactory; $this->_mailerFactory = $mailerFactory; $this->_emailInfoFactory = $emailInfoFactory; - $this->_groupFactory = $groupFactory; + $this->_groupService = $groupService; $this->_attributeFactory = $attributeFactory; $this->_encryptor = $encryptor; $this->mathRandom = $mathRandom; @@ -296,9 +297,9 @@ class Customer extends \Magento\Core\Model\AbstractModel ); } $this->_eventManager->dispatch('customer_customer_authenticated', array( - 'model' => $this, - 'password' => $password, - )); + 'model' => $this, + 'password' => $password, + )); return true; } @@ -445,14 +446,14 @@ class Customer extends \Magento\Core\Model\AbstractModel /** * Retrieve all customer attributes * - * @return array + * @return \Magento\Customer\Model\Attribute[] */ public function getAttributes() { if ($this->_attributes === null) { $this->_attributes = $this->_getResource() - ->loadAllAttributes($this) - ->getSortedAttributes(); + ->loadAllAttributes($this) + ->getSortedAttributes(); } return $this->_attributes; } @@ -821,7 +822,7 @@ class Customer extends \Magento\Core\Model\AbstractModel { if (!$this->hasData('group_id')) { $storeId = $this->getStoreId() ? $this->getStoreId() : $this->_storeManager->getStore()->getId(); - $groupId = $this->_coreStoreConfig->getConfig(\Magento\Customer\Model\Group::XML_PATH_DEFAULT_ID, $storeId); + $groupId = $this->_groupService->getDefaultGroup($storeId)->getId(); $this->setData('group_id', $groupId); } return $this->getData('group_id'); @@ -835,7 +836,8 @@ class Customer extends \Magento\Core\Model\AbstractModel public function getTaxClassId() { if (!$this->getData('tax_class_id')) { - $this->setTaxClassId($this->_createCustomerGroup()->getTaxClassId($this->getGroupId())); + $groupTaxClassId = $this->_groupService->getGroup($this->getGroupId())->getTaxClassId(); + $this->setData('tax_class_id', $groupTaxClassId); } return $this->getData('tax_class_id'); } @@ -1256,14 +1258,6 @@ class Customer extends \Magento\Core\Model\AbstractModel return $this->_emailInfoFactory->create(); } - /** - * @return \Magento\Customer\Model\Group - */ - protected function _createCustomerGroup() - { - return $this->_groupFactory->create(); - } - /** * @return \Magento\Customer\Model\Attribute */ diff --git a/app/code/Magento/Customer/Model/Metadata/ElementFactory.php b/app/code/Magento/Customer/Model/Metadata/ElementFactory.php new file mode 100644 index 0000000000000000000000000000000000000000..6c7b83f39c7458bb04b72d770bb1ba28cc1bf052 --- /dev/null +++ b/app/code/Magento/Customer/Model/Metadata/ElementFactory.php @@ -0,0 +1,91 @@ +<?php +/** + * Customer Form Element Factory + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento_Customer + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Model\Metadata; + +class ElementFactory +{ + /** + * @var \Magento\ObjectManager + */ + protected $_objectManager; + + /** + * @var \Magento\Stdlib\String + */ + protected $_string; + + /** + * @param \Magento\ObjectManager $objectManager + * @param \Magento\Stdlib\String $string + */ + public function __construct(\Magento\ObjectManager $objectManager, \Magento\Stdlib\String $string) + { + $this->_objectManager = $objectManager; + $this->_string = $string; + } + + /** + * Create Form Element + * + * @param \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata $attribute + * @param $value + * @param $entityTypeCode + * @param bool $isAjax + * @return \Magento\Customer\Model\Metadata\Form\AbstractData + */ + public function create( + \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata $attribute, + $value, + $entityTypeCode, + $isAjax = false + ) { + $dataModelClass = $attribute->getDataModel(); + $params = [ + 'entityTypeCode' => $entityTypeCode, + 'value' => is_null($value) ? false : $value, + 'isAjax' => $isAjax, + 'attribute' => $attribute + ]; + /** TODO fix when Validation is implemented MAGETWO-17341 */ + if ($dataModelClass == 'Magento\Customer\Model\Attribute\Data\Postcode') { + $dataModelClass = 'Magento\Customer\Model\Metadata\Form\Text'; + } + if (!empty($dataModelClass)) { + $dataModel = $this->_objectManager->create($dataModelClass, $params); + } else { + $dataModelClass = sprintf( + 'Magento\Customer\Model\Metadata\Form\%s', + $this->_string->upperCaseWords($attribute->getFrontendInput()) + ); + $dataModel = $this->_objectManager->create($dataModelClass, $params); + } + + return $dataModel; + } +} diff --git a/app/code/Magento/Customer/Model/Metadata/Form/AbstractData.php b/app/code/Magento/Customer/Model/Metadata/Form/AbstractData.php new file mode 100644 index 0000000000000000000000000000000000000000..2dde4619fea813693240a4fbf61f125dc6a77a07 --- /dev/null +++ b/app/code/Magento/Customer/Model/Metadata/Form/AbstractData.php @@ -0,0 +1,559 @@ +<?php +/** + * Form Element Abstract Data Model + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento_Eav + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Model\Metadata\Form; + +abstract class AbstractData +{ + /** + * Request Scope name + * + * @var string + */ + protected $_requestScope; + + /** + * Scope visibility flag + * + * @var boolean + */ + protected $_requestScopeOnly = true; + + /** + * Is AJAX request flag + * + * @var boolean + */ + protected $_isAjax = false; + + /** + * Array of full extracted data + * Needed for depends attributes + * + * @var array + */ + protected $_extractedData = array(); + + /** + * \Magento\Core\Model\LocaleInterface FORMAT + * + * @var string + */ + protected $_dateFilterFormat; + + /** + * @var \Magento\Core\Model\LocaleInterface + */ + protected $_locale; + + /** + * @var \Magento\Logger + */ + protected $_logger; + + /** + * @var \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata + */ + protected $_attribute; + + /** + * @var string + */ + protected $_value; + + /** @var string */ + protected $_entityTypeCode; + + /** + * @param \Magento\Core\Model\LocaleInterface $locale + * @param \Magento\Logger $logger + * @param \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata $attribute + * @param string $value + * @param $entityTypeCode + * @param bool $isAjax + */ + public function __construct( + \Magento\Core\Model\LocaleInterface $locale, + \Magento\Logger $logger, + \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata $attribute, + $value = null, + $entityTypeCode, + $isAjax = false + ) { + $this->_locale = $locale; + $this->_logger = $logger; + $this->_attribute = $attribute; + $this->_value = $value; + $this->_entityTypeCode = $entityTypeCode; + $this->_isAjax = $isAjax; + } + + /** + * Return Attribute instance + * + * @throws \Magento\Core\Exception + * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata + */ + public function getAttribute() + { + if (!$this->_attribute) { + throw new \Magento\Core\Exception(__('Attribute object is undefined')); + } + return $this->_attribute; + } + + /** + * Set Request scope + * + * @param string $scope + * @return string + */ + public function setRequestScope($scope) + { + $this->_requestScope = $scope; + return $this; + } + + /** + * Set scope visibility + * Search value only in scope or search value in scope and global + * + * @param boolean $flag + * @return \Magento\Customer\Model\Metadata\Form\AbstractData + */ + public function setRequestScopeOnly($flag) + { + $this->_requestScopeOnly = (bool)$flag; + return $this; + } + + /** + * Returns entity instance + * + * @return \Magento\Customer\Service\V1\Dto\Eav\EntityInterface + */ + public function getEntity() + { + if (!$this->_entity) { + throw new \Magento\Core\Exception(__('Entity object is undefined')); + } + return $this->_entity; + } + + /** + * Set array of full extracted data + * + * @param array $data + * @return \Magento\Customer\Model\Metadata\Form\AbstractData + */ + public function setExtractedData(array $data) + { + $this->_extractedData = $data; + return $this; + } + + /** + * Return extracted data + * + * @param string $index + * @return mixed + */ + public function getExtractedData($index = null) + { + if (!is_null($index)) { + if (isset($this->_extractedData[$index])) { + return $this->_extractedData[$index]; + } + return null; + } + return $this->_extractedData; + } + + /** + * Apply attribute input filter to value + * + * @param string $value + * @return string + */ + protected function _applyInputFilter($value) + { + if ($value === false) { + return false; + } + + $filter = $this->_getFormFilter(); + if ($filter) { + $value = $filter->inputFilter($value); + } + + return $value; + } + + /** + * Return Data Form Input/Output Filter + * + * @return \Magento\Data\Form\Filter\FilterInterface|false + */ + protected function _getFormFilter() + { + $filterCode = $this->getAttribute()->getInputFilter(); + if ($filterCode) { + $filterClass = 'Magento\Data\Form\Filter\\' . ucfirst($filterCode); + if ($filterCode == 'date') { + $filter = new $filterClass($this->_dateFilterFormat(), $this->_locale->getLocale()); + } else { + $filter = new $filterClass(); + } + return $filter; + } + return false; + } + + /** + * Get/Set/Reset date filter format + * + * @param string|null|false $format + * @return \Magento\Customer\Model\Metadata\Form\AbstractData|string + */ + protected function _dateFilterFormat($format = null) + { + if (is_null($format)) { + // get format + if (is_null($this->_dateFilterFormat)) { + $this->_dateFilterFormat = \Magento\Core\Model\LocaleInterface::FORMAT_TYPE_SHORT; + } + return $this->_locale->getDateFormat($this->_dateFilterFormat); + } else if ($format === false) { + // reset value + $this->_dateFilterFormat = null; + return $this; + } + + $this->_dateFilterFormat = $format; + return $this; + } + + /** + * Apply attribute output filter to value + * + * @param string $value + * @return string + */ + protected function _applyOutputFilter($value) + { + $filter = $this->_getFormFilter(); + if ($filter) { + $value = $filter->outputFilter($value); + } + + return $value; + } + + /** + * Validate value by attribute input validation rule + * + * @param string $value + * @return string|bool + */ + protected function _validateInputRule($value) + { + // skip validate empty value + if (empty($value)) { + return true; + } + + $label = $this->getAttribute()->getStoreLabel(); + $validateRules = $this->getAttribute()->getValidationRules(); + + if (!empty($validateRules['input_validation'])) { + switch ($validateRules['input_validation']) { + case 'alphanumeric': + $validator = new \Zend_Validate_Alnum(true); + $validator->setMessage( + __('"%1" invalid type entered.', $label), + \Zend_Validate_Alnum::INVALID + ); + $validator->setMessage( + __('"%1" contains non-alphabetic or non-numeric characters.', $label), + \Zend_Validate_Alnum::NOT_ALNUM + ); + $validator->setMessage( + __('"%1" is an empty string.', $label), + \Zend_Validate_Alnum::STRING_EMPTY + ); + if (!$validator->isValid($value)) { + return $validator->getMessages(); + } + break; + case 'numeric': + $validator = new \Zend_Validate_Digits(); + $validator->setMessage( + __('"%1" invalid type entered.', $label), + \Zend_Validate_Digits::INVALID + ); + $validator->setMessage( + __('"%1" contains non-numeric characters.', $label), + \Zend_Validate_Digits::NOT_DIGITS + ); + $validator->setMessage( + __('"%1" is an empty string.', $label), + \Zend_Validate_Digits::STRING_EMPTY + ); + if (!$validator->isValid($value)) { + return $validator->getMessages(); + } + break; + case 'alpha': + $validator = new \Zend_Validate_Alpha(true); + $validator->setMessage( + __('"%1" invalid type entered.', $label), + \Zend_Validate_Alpha::INVALID + ); + $validator->setMessage( + __('"%1" contains non-alphabetic characters.', $label), + \Zend_Validate_Alpha::NOT_ALPHA + ); + $validator->setMessage( + __('"%1" is an empty string.', $label), + \Zend_Validate_Alpha::STRING_EMPTY + ); + if (!$validator->isValid($value)) { + return $validator->getMessages(); + } + break; + case 'email': + /** + __("'%value%' appears to be a DNS hostname but the given punycode notation cannot be decoded") + __("Invalid type given. String expected") + __("'%value%' appears to be a DNS hostname but contains a dash in an invalid position") + __("'%value%' does not match the expected structure for a DNS hostname") + __("'%value%' appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'") + __("'%value%' does not appear to be a valid local network name") + __("'%value%' does not appear to be a valid URI hostname") + __("'%value%' appears to be an IP address, but IP addresses are not allowed") + __("'%value%' appears to be a local network name but local network names are not allowed") + __("'%value%' appears to be a DNS hostname but cannot extract TLD part") + __("'%value%' appears to be a DNS hostname but cannot match TLD against known list") + */ + $validator = new \Zend_Validate_EmailAddress(); + $validator->setMessage( + __('"%1" invalid type entered.', $label), + \Zend_Validate_EmailAddress::INVALID + ); + $validator->setMessage( + __('"%1" is not a valid email address.', $label), + \Zend_Validate_EmailAddress::INVALID_FORMAT + ); + $validator->setMessage( + __('"%1" is not a valid hostname.', $label), + \Zend_Validate_EmailAddress::INVALID_HOSTNAME + ); + $validator->setMessage( + __('"%1" is not a valid hostname.', $label), + \Zend_Validate_EmailAddress::INVALID_MX_RECORD + ); + $validator->setMessage( + __('"%1" is not a valid hostname.', $label), + \Zend_Validate_EmailAddress::INVALID_MX_RECORD + ); + $validator->setMessage( + __('"%1" is not a valid email address.', $label), + \Zend_Validate_EmailAddress::DOT_ATOM + ); + $validator->setMessage( + __('"%1" is not a valid email address.', $label), + \Zend_Validate_EmailAddress::QUOTED_STRING + ); + $validator->setMessage( + __('"%1" is not a valid email address.', $label), + \Zend_Validate_EmailAddress::INVALID_LOCAL_PART + ); + $validator->setMessage( + __('"%1" exceeds the allowed length.', $label), + \Zend_Validate_EmailAddress::LENGTH_EXCEEDED + ); + $validator->setMessage( + __("'%value%' appears to be an IP address, but IP addresses are not allowed."), + \Zend_Validate_Hostname::IP_ADDRESS_NOT_ALLOWED + ); + $validator->setMessage( + __("'%value%' appears to be a DNS hostname but cannot match TLD against known list."), + \Zend_Validate_Hostname::UNKNOWN_TLD + ); + $validator->setMessage( + __("'%value%' appears to be a DNS hostname but contains a dash in an invalid position."), + \Zend_Validate_Hostname::INVALID_DASH + ); + $validator->setMessage( + __("'%value%' appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'."), + \Zend_Validate_Hostname::INVALID_HOSTNAME_SCHEMA + ); + $validator->setMessage( + __("'%value%' appears to be a DNS hostname but cannot extract TLD part."), + \Zend_Validate_Hostname::UNDECIPHERABLE_TLD + ); + $validator->setMessage( + __("'%value%' does not appear to be a valid local network name."), + \Zend_Validate_Hostname::INVALID_LOCAL_NAME + ); + $validator->setMessage( + __("'%value%' appears to be a local network name but local network names are not allowed."), + \Zend_Validate_Hostname::LOCAL_NAME_NOT_ALLOWED + ); + $validator->setMessage( + __("'%value%' appears to be a DNS hostname but the given punycode notation cannot be decoded."), + \Zend_Validate_Hostname::CANNOT_DECODE_PUNYCODE + ); + if (!$validator->isValid($value)) { + return array_unique($validator->getMessages()); + } + break; + case 'url': + $parsedUrl = parse_url($value); + if ($parsedUrl === false || empty($parsedUrl['scheme']) || empty($parsedUrl['host'])) { + return array(__('"%1" is not a valid URL.', $label)); + } + $validator = new \Zend_Validate_Hostname(); + if (!$validator->isValid($parsedUrl['host'])) { + return array(__('"%1" is not a valid URL.', $label)); + } + break; + case 'date': + $validator = new \Zend_Validate_Date(\Magento\Stdlib\DateTime::DATE_INTERNAL_FORMAT); + $validator->setMessage( + __('"%1" invalid type entered.', $label), + \Zend_Validate_Date::INVALID + ); + $validator->setMessage( + __('"%1" is not a valid date.', $label), + \Zend_Validate_Date::INVALID_DATE + ); + $validator->setMessage( + __('"%1" does not fit the entered date format.', $label), + \Zend_Validate_Date::FALSEFORMAT + ); + if (!$validator->isValid($value)) { + return array_unique($validator->getMessages()); + } + + break; + } + } + return true; + } + + /** + * Return is AJAX Request + * + * @return boolean + */ + public function getIsAjaxRequest() + { + return $this->_isAjax; + } + + /** + * Return Original Attribute value from Request + * + * @param \Magento\App\RequestInterface $request + * @return mixed + */ + protected function _getRequestValue(\Magento\App\RequestInterface $request) + { + $attrCode = $this->getAttribute()->getAttributeCode(); + if ($this->_requestScope) { + if (strpos($this->_requestScope, '/') !== false) { + $params = $request->getParams(); + $parts = explode('/', $this->_requestScope); + foreach ($parts as $part) { + if (isset($params[$part])) { + $params = $params[$part]; + } else { + $params = array(); + } + } + } else { + $params = $request->getParam($this->_requestScope); + } + + if (isset($params[$attrCode])) { + $value = $params[$attrCode]; + } else { + $value = false; + } + + if (!$this->_requestScopeOnly && $value === false) { + $value = $request->getParam($attrCode, false); + } + } else { + $value = $request->getParam($attrCode, false); + } + return $value; + } + + /** + * Extract data from request and return value + * + * @param \Magento\App\RequestInterface $request + * @return array|string + */ + abstract public function extractValue(\Magento\App\RequestInterface $request); + + /** + * Validate data + * + * @param array|string $value + * @throws \Magento\Core\Exception + * @return boolean + */ + abstract public function validateValue($value); + + /** + * Export attribute value to entity model + * + * @param array|string $value + * @return string|bool + */ + abstract public function compactValue($value); + + /** + * Restore attribute value from SESSION to entity model + * + * @param array|string $value + * @return string|bool + */ + abstract public function restoreValue($value); + + /** + * Return formated attribute value from entity model + * + * @param string $format + * @return string|array + */ + abstract public function outputValue($format = \Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_TEXT); +} diff --git a/app/code/Magento/Customer/Model/Metadata/Validator.php b/app/code/Magento/Customer/Model/Metadata/Validator.php new file mode 100644 index 0000000000000000000000000000000000000000..b727a6e85fb95ff3fd5073cc45675f3af244fe24 --- /dev/null +++ b/app/code/Magento/Customer/Model/Metadata/Validator.php @@ -0,0 +1,94 @@ +<?php +/** + * Attribute data validator + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento_Customer + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Model\Metadata; + +class Validator extends \Magento\Eav\Model\Validator\Attribute\Data +{ + /** + * @var string + */ + protected $_entityType; + + /** + * @param \Magento\Customer\Model\Metadata\ElementFactory $attrDataFactory + */ + public function __construct(\Magento\Customer\Model\Metadata\ElementFactory $attrDataFactory) + { + $this->_attrDataFactory = $attrDataFactory; + } + + /** + * Validate EAV model attributes with data models + * + * @param \Magento\Core\Model\AbstractModel $entity + * @return bool + */ + public function isValid($entity) + { + $data = array(); + if ($this->_data) { + $data = $this->_data; + } elseif ($entity instanceof \Magento\Object) { + $data = $entity->getData(); + } + $this->validateData($data, $this->_attributes, $this->_entityType); + } + + public function validateData($data, $attributes, $entityType) + { + foreach ($attributes as $attribute) { + $attributeCode = $attribute->getAttributeCode(); + if (!$attribute->getDataModel() && !$attribute->getFrontendInput()) { + continue; + } + if (!isset($data[$attributeCode])) { + $data[$attributeCode] = null; + } + $dataModel = $this->_attrDataFactory->create( + $attribute, $entityType, $data[$attributeCode] + ); + $dataModel->setExtractedData($data); + $result = $dataModel->validateValue($data[$attributeCode]); + if (true !== $result) { + $this->_addErrorMessages($attributeCode, (array)$result); + } + } + return count($this->_messages) == 0; + } + + /** + * Set type of the entity + * + * @param string $entityType + * @return null + */ + public function setEntityType($entityType) + { + $this->_entityType = $entityType; + } +} diff --git a/app/code/Magento/Customer/Model/Session.php b/app/code/Magento/Customer/Model/Session.php index f0171b5904e89bb9e109d00f6893cb6c39a3e734..6c971a51859f434f6ac0997efafae69401398d49 100644 --- a/app/code/Magento/Customer/Model/Session.php +++ b/app/code/Magento/Customer/Model/Session.php @@ -292,16 +292,20 @@ class Session extends \Magento\Session\SessionManager if ($customer->authenticate($username, $password)) { $this->setCustomerAsLoggedIn($customer); - $this->regenerateId(); return true; } return false; } + /** + * @param \Magento\Customer\Model\Customer $customer + * @return $this + */ public function setCustomerAsLoggedIn($customer) { $this->setCustomer($customer); $this->_eventManager->dispatch('customer_login', array('customer' => $customer)); + $this->regenerateId(); return $this; } @@ -316,7 +320,6 @@ class Session extends \Magento\Session\SessionManager $customer = $this->_createCustomer()->load($customerId); if ($customer->getId()) { $this->setCustomerAsLoggedIn($customer); - $this->regenerateId(); return true; } return false; diff --git a/app/code/Magento/Customer/Service/Customer.php b/app/code/Magento/Customer/Service/Customer.php index 110cd07febab1365ef4fd2db0003d00a0067c1eb..ff922d06d93cdda283771f37933eb227a658b8f8 100644 --- a/app/code/Magento/Customer/Service/Customer.php +++ b/app/code/Magento/Customer/Service/Customer.php @@ -386,7 +386,8 @@ class Customer $address = $customer->getAddressItemById($addressId); if (!$address || !$address->getId()) { throw new \Magento\Core\Exception( - __('The address with the specified ID not found.')); + __('The address with the specified ID not found.') + ); } } else { $address = $this->_addressFactory->create(); diff --git a/app/code/Magento/Customer/Service/Entity/V1/AggregateException.php b/app/code/Magento/Customer/Service/Entity/V1/AggregateException.php new file mode 100644 index 0000000000000000000000000000000000000000..aff94b4f4f51576e2df6f3bb904247f8d15e4078 --- /dev/null +++ b/app/code/Magento/Customer/Service/Entity/V1/AggregateException.php @@ -0,0 +1,58 @@ +<?php +/** + * Aggregate of multiple service exceptions + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\Entity\V1; + +class AggregateException extends Exception +{ + protected $_listOfExceptions = []; + + /** + * Returns the list of exceptions. + * @return array of exceptions that are stored + */ + public function getExceptions() + { + return $this->_listOfExceptions; + } + + /** + * Add an exception to the aggregate list. + * @param Exception $exception + */ + public function pushException(Exception $exception) + { + $this->_listOfExceptions[] = $exception; + } + + /** + * Returns true if the aggregate list contains exceptions. + * @return bool + */ + public function hasExceptions() + { + return !empty($this->_listOfExceptions); + } +} \ No newline at end of file diff --git a/app/code/Magento/Customer/Service/Entity/V1/Exception.php b/app/code/Magento/Customer/Service/Entity/V1/Exception.php new file mode 100644 index 0000000000000000000000000000000000000000..97596d6121a9e9666b0265fc8df6ea54494c903b --- /dev/null +++ b/app/code/Magento/Customer/Service/Entity/V1/Exception.php @@ -0,0 +1,46 @@ +<?php +/** + * Base service exception + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\Entity\V1; + +class Exception extends \Exception +{ + /** Error codes */ + const CODE_UNKNOWN = 0; + const CODE_ACCT_ALREADY_ACTIVE = 1; + const CODE_INVALID_RESET_TOKEN = 2; + const CODE_RESET_TOKEN_EXPIRED = 3; + const CODE_EMAIL_NOT_FOUND = 4; + const CODE_CONFIRMATION_NOT_NEEDED = 5; + const CODE_CUSTOMER_ID_MISMATCH = 6; + const CODE_EMAIL_NOT_CONFIRMED = 7; + const CODE_INVALID_EMAIL_OR_PASSWORD = 8; + const CODE_EMAIL_EXISTS = 9; + const CODE_INVALID_RESET_PASSWORD_LINK_TOKEN = 10; + const CODE_ADDRESS_NOT_FOUND = 11; + const CODE_INVALID_ADDRESS_ID = 12; + const CODE_VALIDATION_FAILED = 13; + const CODE_INVALID_CUSTOMER_ID = 14; +} diff --git a/app/code/Magento/Customer/Service/V1/CustomerAccountService.php b/app/code/Magento/Customer/Service/V1/CustomerAccountService.php new file mode 100644 index 0000000000000000000000000000000000000000..bf3f4e52e5c929ed5a7a2ddd32b36d4fbba9e219 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/CustomerAccountService.php @@ -0,0 +1,341 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1; +use Magento\Customer\Service\Entity\V1\Exception; + +/** + * Manipulate Customer Address Entities * + */ +class CustomerAccountService implements CustomerAccountServiceInterface +{ + + /** @var \Magento\Customer\Model\CustomerFactory */ + private $_customerFactory; + /** + * Core event manager proxy + * + * @var \Magento\Event\ManagerInterface + */ + private $_eventManager = null; + + /** @var \Magento\Core\Model\StoreManagerInterface */ + private $_storeManager; + + /** + * @var \Magento\Math\Random + */ + private $_mathRandom; + + /** + * @var \Magento\Customer\Model\Converter + */ + private $_converter; + + /** + * @var \Magento\Customer\Model\Metadata\Validator + */ + private $_validator; + + /** + * @var \Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder + */ + private $_createCustomerAccountResponseBuilder; + + /** + * @var CustomerServiceInterface + */ + private $_customerService; + + /** + * @var CustomerAddressServiceInterface + */ + private $_customerAddressService; + + /** + * Constructor + * + * @param \Magento\Customer\Model\CustomerFactory $customerFactory + * @param \Magento\Customer\Model\AddressFactory $addressFactory + * @param \Magento\Customer\Service\V1\CustomerMetadataServiceInterface $eavMetadataService + * @param \Magento\Event\ManagerInterface $eventManager + * @param \Magento\Core\Model\StoreManagerInterface $storeManager + * @param \Magento\Math\Random $mathRandom + * @param \Magento\Customer\Model\Converter $converter + * @param \Magento\Customer\Model\Metadata\Validator $validator + * @param \Magento\Customer\Service\V1\Dto\RegionBuilder $regionBuilder + * @param \Magento\Customer\Service\V1\Dto\AddressBuilder $addressBuilder + * @param \Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder $createCustomerAccountResponseBuilder + */ + public function __construct( + \Magento\Customer\Model\CustomerFactory $customerFactory, + \Magento\Event\ManagerInterface $eventManager, + \Magento\Core\Model\StoreManagerInterface $storeManager, + \Magento\Math\Random $mathRandom, + \Magento\Customer\Model\Converter $converter, + \Magento\Customer\Model\Metadata\Validator $validator, + Dto\Response\CreateCustomerAccountResponseBuilder $createCustomerAccountResponseBuilder, + CustomerServiceInterface $customerService, + CustomerAddressServiceInterface $customerAddressService + ) { + $this->_customerFactory = $customerFactory; + $this->_eventManager = $eventManager; + $this->_storeManager = $storeManager; + $this->_mathRandom = $mathRandom; + $this->_converter = $converter; + $this->_validator = $validator; + $this->_createCustomerAccountResponseBuilder = $createCustomerAccountResponseBuilder; + $this->_customerService = $customerService; + $this->_customerAddressService = $customerAddressService; + } + + + /** + * @inheritdoc + */ + public function sendConfirmation($email) + { + $customer = $this->_customerFactory->create(); + $customer->setWebsiteId($this->_storeManager->getStore()->getWebsiteId())->loadByEmail($email); + if (!$customer->getId()) { + throw new Exception('Wrong email.', Exception::CODE_EMAIL_NOT_FOUND); + } + if ($customer->getConfirmation()) { + $customer->sendNewAccountEmail('confirmation', '', $this->_storeManager->getStore()->getId()); + } else { + throw new Exception( + 'This email does not require confirmation.', + Exception::CODE_CONFIRMATION_NOT_NEEDED + ); + } + } + + + /** + * @inheritdoc + */ + public function activateAccount($customerId, $key) + { + // load customer by id + $customer = $this->_converter->getCustomerModel($customerId); + + // check if customer is inactive + if ($customer->getConfirmation()) { + if ($customer->getConfirmation() !== $key) { + throw new \Magento\Core\Exception('Wrong confirmation key.'); + } + + // activate customer + try { + $customer->setConfirmation(null); + $customer->save(); + } catch (\Exception $e) { + throw new \Magento\Core\Exception('Failed to confirm customer account.'); + } + $customer->sendNewAccountEmail('confirmed', '', $this->_storeManager->getStore()->getId()); + } else { + throw new Exception( + 'Customer account is already active.', + Exception::CODE_ACCT_ALREADY_ACTIVE + ); + } + + return $this->_converter->createCustomerFromModel($customer); + } + + /** + * @inheritdoc + */ + public function authenticate($username, $password) + { + $customerModel = $this->_customerFactory->create(); + $customerModel->setWebsiteId($this->_storeManager->getStore()->getWebsiteId()); + try { + $customerModel->authenticate($username, $password); + } catch (\Magento\Core\Exception $e) { + switch ($e->getCode()) { + case \Magento\Customer\Model\Customer::EXCEPTION_EMAIL_NOT_CONFIRMED: + $code = Exception::CODE_EMAIL_NOT_CONFIRMED; + break; + case \Magento\Customer\Model\Customer::EXCEPTION_INVALID_EMAIL_OR_PASSWORD: + $code = Exception::CODE_INVALID_EMAIL_OR_PASSWORD; + break; + default: + $code = Exception::CODE_UNKNOWN; + } + throw new Exception($e->getMessage(), $code, $e); + } + + $this->_eventManager->dispatch('customer_login', array('customer'=>$customerModel)); + + return $this->_converter->createCustomerFromModel($customerModel); + } + + /** + * @inheritdoc + */ + public function validateResetPasswordLinkToken($customerId, $resetPasswordLinkToken) + { + $this->_validateResetPasswordToken($customerId, $resetPasswordLinkToken); + } + + /** + * @inheritdoc + */ + public function sendPasswordResetLink($email, $websiteId) + { + $customer = $this->_customerFactory->create() + ->setWebsiteId($websiteId) + ->loadByEmail($email); + + if (!$customer->getId()) { + throw new Exception( + 'No customer found for the provided email and website ID.', Exception::CODE_EMAIL_NOT_FOUND); + } + try { + $newPasswordToken = $this->_mathRandom->getUniqueHash(); + $customer->changeResetPasswordLinkToken($newPasswordToken); + $customer->sendPasswordResetConfirmationEmail(); + } catch (\Exception $exception) { + throw new Exception($exception->getMessage(), Exception::CODE_UNKNOWN, $exception); + } + } + + /** + * @inheritdoc + */ + public function resetPassword($customerId, $password, $resetToken) + { + $customerModel = $this->_validateResetPasswordToken($customerId, $resetToken); + $customerModel->setRpToken(null); + $customerModel->setRpTokenCreatedAt(null); + $customerModel->setPassword($password); + $customerModel->save(); + } + + /** + * @inheritdoc + */ + public function createAccount( + Dto\Customer $customer, + array $addresses, + $password = null, + $confirmationBackUrl = '', + $registeredBackUrl = '', + $storeId = 0 + ) { + $customerId = $customer->getCustomerId(); + if ($customerId) { + $customerModel = $this->_converter->getCustomerModel($customerId); + if ($customerModel->isInStore($storeId)) { + return $this->_createCustomerAccountResponseBuilder->setCustomerId($customerId) + ->setStatus('') + ->create(); + } + } + $customerId = $this->_customerService->saveCustomer($customer, $password); + $this->_customerAddressService->saveAddresses($customerId, $addresses); + + $customerModel = $this->_converter->getCustomerModel($customerId); + + $newLinkToken = $this->_mathRandom->getUniqueHash(); + $customerModel->changeResetPasswordLinkToken($newLinkToken); + + if (!$storeId) { + $storeId = $this->_storeManager->getStore()->getId(); + } + + if ($customerModel->isConfirmationRequired()) { + $customerModel->sendNewAccountEmail('confirmation', $confirmationBackUrl, $storeId); + return $this->_createCustomerAccountResponseBuilder->setCustomerId($customerId) + ->setStatus(self::ACCOUNT_CONFIRMATION) + ->create(); + } else { + $customerModel->sendNewAccountEmail('registered', $registeredBackUrl, $storeId); + return $this->_createCustomerAccountResponseBuilder->setCustomerId($customerId) + ->setStatus(self::ACCOUNT_REGISTERED) + ->create(); + } + } + + /** + * @inheritdoc + */ + public function validateCustomerData(Dto\Customer $customer, array $attributes) + { + $customerErrors = $this->_validator->validateData( + $customer->__toArray(), + $attributes, + 'customer' + ); + + if ($customerErrors !== true) { + return array( + 'error' => -1, + 'message' => implode(', ', $customerErrors) + ); + } + + $customerModel = $this->_converter->createCustomerModel($customer); + + $result = $customerModel->validate(); + if (true !== $result && is_array($result)) { + return array( + 'error' => -1, + 'message' => implode(', ', $result) + ); + } + return true; + } + + + /** + * @param $customerId + * @param $resetPasswordLinkToken + * @return \Magento\Customer\Model\Customer + * @throws Exception + */ + private function _validateResetPasswordToken($customerId, $resetPasswordLinkToken) + { + if (!is_int($customerId) + || !is_string($resetPasswordLinkToken) + || empty($resetPasswordLinkToken) + || empty($customerId) + || $customerId < 0 + ) { + throw new Exception('Invalid password reset token.', Exception::CODE_INVALID_RESET_TOKEN); + } + + $customerModel = $this->_converter->getCustomerModel($customerId); + + $customerToken = $customerModel->getRpToken(); + if (strcmp($customerToken, $resetPasswordLinkToken) !== 0 + || $customerModel->isResetPasswordLinkTokenExpired($customerId) + ) { + throw new Exception('Your password reset link has expired.', Exception::CODE_RESET_TOKEN_EXPIRED); + } + + return $customerModel; + } +} diff --git a/app/code/Magento/Customer/Service/V1/CustomerAccountServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerAccountServiceInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..510cb3a97423b1a09f491f18e7a763f8adb3b112 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/CustomerAccountServiceInterface.php @@ -0,0 +1,127 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1; + +/** + * Manipulate Customer Address Entities * + */ +interface CustomerAccountServiceInterface +{ + /** account response status */ + const ACCOUNT_CONFIRMATION = "confirmation"; + const ACCOUNT_REGISTERED = "registered"; + + // Constants for the type of new account email to be sent + const NEW_ACCOUNT_EMAIL_REGISTERED = 'registered'; // welcome email, when confirmation is disabled + const NEW_ACCOUNT_EMAIL_CONFIRMED = 'confirmed'; // welcome email, when confirmation is enabled + const NEW_ACCOUNT_EMAIL_CONFIRMATION = 'confirmation'; // email with confirmation link + + /** + * Create Customer Account + * + * @param \Magento\Customer\Service\V1\Dto\Customer $customer + * @param \Magento\Customer\Service\V1\Dto\Address[] $addresses + * @param string $password + * @param string $confirmationBackUrl + * @param string $registeredBackUrl + * @param int $storeId + * @return Dto\Response\CreateCustomerAccountResponse + */ + public function createAccount( + Dto\Customer $customer, + array $addresses, + $password = null, + $confirmationBackUrl = '', + $registeredBackUrl = '', + $storeId = 0 + ); + + /** + * Used to activate a customer account using a key that was sent in a confirmation e-mail. + * + * @param int $customerId + * @param string $key + * @throws \Magento\Customer\Service\Entity\V1\Exception If customerId is invalid, does not exist, or customer account was already active + * @throws \Magento\Core\Exception If there is an issue with supplied $customerId or $key + * @return \Magento\Customer\Service\V1\Dto\Customer + */ + public function activateAccount($customerId, $key); + + /** + * Login a customer account using username and password + * + * @param string $username username in plain-text + * @param string $password password in plain-text + * @throws \Magento\Customer\Service\Entity\V1\Exception if unable to login due to issue with username or password or others + * @return \Magento\Customer\Service\V1\Dto\Customer + */ + public function authenticate($username, $password); + + /** + * Check if password reset token is valid + * + * @param int $customerId + * @param string $resetPasswordLinkToken + * @throws \Magento\Customer\Service\Entity\V1\Exception if expired or invalid + */ + public function validateResetPasswordLinkToken($customerId, $resetPasswordLinkToken); + + /** + * Send an email to the customer with a password reset link. + * + * @param string $email + * @param int $websiteId + * @throws \Magento\Customer\Service\Entity\V1\Exception + */ + public function sendPasswordResetLink($email, $websiteId); + + + /** + * Reset customer password. + * + * @param int $customerId + * @param string $password + * @param string $resetToken + */ + public function resetPassword($customerId, $password, $resetToken); + + /* + * Send Confirmation email + * + * @param string $email email address of customer + * @throws Entity\V1\Exception if error occurs getting customerId + */ + public function sendConfirmation($email); + + /** + * Validate customer entity + * + * @param \Magento\Customer\Service\V1\Dto\Customer $customer + * @param \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata[] $attributes + * @return array|bool + */ + public function validateCustomerData(Dto\Customer $customer, array $attributes); + +} diff --git a/app/code/Magento/Customer/Service/V1/CustomerAddressService.php b/app/code/Magento/Customer/Service/V1/CustomerAddressService.php new file mode 100644 index 0000000000000000000000000000000000000000..cc385b75d36308eb23588a209e175ebc677f01f1 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/CustomerAddressService.php @@ -0,0 +1,323 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1; + +use Magento\Customer\Service\Entity\V1\AggregateException; +use Magento\Customer\Service\Entity\V1\Exception; + +class CustomerAddressService implements CustomerAddressServiceInterface +{ + /** @var \Magento\Customer\Model\AddressFactory */ + private $_addressFactory; + + /** + * @var \Magento\Customer\Model\Converter + */ + private $_converter; + + /** + * @var \Magento\Customer\Service\V1\Dto\RegionBuilder + */ + private $_regionBuilder; + + /** + * @var \Magento\Customer\Service\V1\Dto\AddressBuilder + */ + private $_addressBuilder; + + + /** + * Constructor + * + * @param \Magento\Customer\Model\CustomerFactory $customerFactory + * @param \Magento\Customer\Model\AddressFactory $addressFactory + * @param \Magento\Customer\Service\V1\CustomerMetadataServiceInterface $eavMetadataService + * @param \Magento\Event\ManagerInterface $eventManager + * @param \Magento\Core\Model\StoreManagerInterface $storeManager + * @param \Magento\Math\Random $mathRandom + * @param \Magento\Customer\Model\Converter $converter + * @param \Magento\Customer\Model\Metadata\Validator $validator + * @param \Magento\Customer\Service\V1\Dto\RegionBuilder $regionBuilder + * @param \Magento\Customer\Service\V1\Dto\AddressBuilder $addressBuilder + * @param \Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder $createCustomerAccountResponseBuilder + */ + public function __construct( + \Magento\Customer\Model\AddressFactory $addressFactory, + \Magento\Customer\Model\Converter $converter, + Dto\RegionBuilder $regionBuilder, + Dto\AddressBuilder $addressBuilder + ) { + $this->_addressFactory = $addressFactory; + $this->_converter = $converter; + $this->_regionBuilder = $regionBuilder; + $this->_addressBuilder = $addressBuilder; + } + + /** + * @inheritdoc + */ + public function getAddresses($customerId) + { + //TODO: use cache MAGETWO-16862 + $customer = $this->_converter->getCustomerModel($customerId); + $addresses = $customer->getAddresses(); + $defaultBillingId = $customer->getDefaultBilling(); + $defaultShippingId = $customer->getDefaultShipping(); + + $result = array(); + /** @var $address \Magento\Customer\Model\Address */ + foreach ($addresses as $address) { + $result[] = $this->_createAddress( + $address, + $defaultBillingId, + $defaultShippingId + ); + } + return $result; + } + + /** + * @inheritdoc + */ + public function getDefaultBillingAddress($customerId) + { + //TODO: use cache MAGETWO-16862 + $customer = $this->_converter->getCustomerModel($customerId); + $address = $customer->getDefaultBillingAddress(); + if ($address === false) { + return null; + } + return $this->_createAddress( + $address, + $customer->getDefaultBilling(), + $customer->getDefaultShipping() + ); + } + + /** + * @inheritdoc + */ + public function getDefaultShippingAddress($customerId) + { + //TODO: use cache MAGETWO-16862 + $customer = $this->_converter->getCustomerModel($customerId); + $address = $customer->getDefaultShippingAddress(); + if ($address === false) { + return null; + } + return $this->_createAddress($address, + $customer->getDefaultBilling(), + $customer->getDefaultShipping() + ); + } + + /** + * @inheritdoc + */ + public function getAddressById($customerId, $addressId) + { + //TODO: use cache MAGETWO-16862 + $customer = $this->_converter->getCustomerModel($customerId); + $address = $customer->getAddressById($addressId); + if (!$address->getId()) { + throw new Exception( + 'Address id ' . $addressId . ' not found', + Exception::CODE_ADDRESS_NOT_FOUND + ); + } + return $this->_createAddress( + $address, + $customer->getDefaultBilling(), + $customer->getDefaultShipping() + ); + } + + /** + * Create address based on model + * + * @param \Magento\Customer\Model\Address $addressModel + * @param int $defaultBillingId + * @param int $defaultShippingId + * @return \Magento\Customer\Service\V1\Dto\Address + */ + private function _createAddress(\Magento\Customer\Model\Address $addressModel, + $defaultBillingId, $defaultShippingId + ) { + $addressId = $addressModel->getId(); + $validAttributes = array_merge( + $addressModel->getDefaultAttributeCodes(), + [ + 'id', 'region_id', 'region', 'street', 'vat_is_valid', + 'default_billing', 'default_shipping', + //TODO: create VAT object at MAGETWO-16860 + 'vat_request_id', 'vat_request_date', 'vat_request_success' + ] + ); + $addressData = []; + foreach ($addressModel->getAttributes() as $attribute) { + $code = $attribute->getAttributeCode(); + if (!in_array($code, $validAttributes) && $addressModel->getData($code) !== null) { + $addressData[$code] = $addressModel->getData($code); + } + } + + $region = $this->_regionBuilder->setRegionCode($addressModel->getRegionCode()) + ->setRegion($addressModel->getRegion()) + ->setRegionId($addressModel->getRegionId()) + ->create(); + $this->_addressBuilder->populateWithArray(array_merge($addressData, [ + 'street' => $addressModel->getStreet(), + 'id' => $addressId, + 'default_billing' => $addressId === $defaultBillingId, + 'default_shipping' => $addressId === $defaultShippingId, + 'customer_id' => $addressModel->getCustomerId(), + 'region' => $region + ])); + + $retValue = $this->_addressBuilder->create(); + return $retValue; + } + + + /** + * @inheritdoc + */ + public function deleteAddressFromCustomer($customerId, $addressId) + { + if (!$addressId) { + throw new Exception('Invalid addressId', Exception::CODE_INVALID_ADDRESS_ID); + } + + $address = $this->_addressFactory->create(); + $address->load($addressId); + + if (!$address->getId()) { + throw new Exception( + 'Address id ' . $addressId . ' not found', + Exception::CODE_ADDRESS_NOT_FOUND + ); + } + + // Validate address_id <=> customer_id + if ($address->getCustomerId() != $customerId) { + throw new Exception( + 'The address does not belong to this customer', + Exception::CODE_CUSTOMER_ID_MISMATCH + ); + } + + $address->delete(); + } + + /** + * @inheritdoc + */ + public function saveAddresses($customerId, array $addresses) + { + $customerModel = $this->_converter->getCustomerModel($customerId); + $addressModels = []; + + $aggregateException = new AggregateException("All validation exceptions for all addresses.", + Exception::CODE_VALIDATION_FAILED); + foreach ($addresses as $address) { + $addressModel = null; + if ($address->getId()) { + $addressModel = $customerModel->getAddressItemById($address->getId()); + } + if (is_null($addressModel)) { + $addressModel = $this->_addressFactory->create(); + $addressModel->setCustomer($customerModel); + } + $this->_updateAddressModel($addressModel, $address); + + $validationErrors = $addressModel->validate(); + if ($validationErrors !== true) { + $aggregateException->pushException( + new Exception( + 'There were one or more errors validating the address with id ' . $address->getId(), + Exception::CODE_VALIDATION_FAILED, + new \Magento\Validator\ValidatorException([$validationErrors]) + ) + ); + continue; + } + $addressModels[] = $addressModel; + } + if ($aggregateException->hasExceptions()) { + throw $aggregateException; + } + $addressIds = []; + + foreach ($addressModels as $addressModel) { + try { + $addressModel->save(); + $addressIds[] = $addressModel->getId(); + } catch (\Exception $e) { + switch ($e->getCode()) { + case \Magento\Customer\Model\Customer::EXCEPTION_EMAIL_EXISTS: + $code = Exception::CODE_EMAIL_EXISTS; + break; + default: + $code = Exception::CODE_UNKNOWN; + } + throw new Exception($e->getMessage(), $code, $e); + } + } + + return $addressIds; + } + + /** + * Updates an Address Model based on information from an Address DTO. + * + * @param \Magento\Customer\Model\Address $addressModel + * @param \Magento\Customer\Service\V1\Dto\Address $address + * return null + */ + private function _updateAddressModel(\Magento\Customer\Model\Address $addressModel, Dto\Address $address) + { + // Set all attributes + foreach ($address->getAttributes() as $attributeCode => $attributeData) { + if ('region' == $attributeCode + && $address->getRegion() instanceof Dto\Region + ) { + $addressModel->setData('region', $address->getRegion()->getRegion()); + $addressModel->setData('region_code', $address->getRegion()->getRegionCode()); + $addressModel->setData('region_id', $address->getRegion()->getRegionId()); + } else { + $addressModel->setData($attributeCode, $attributeData); + } + } + // Set customer related data + $isBilling = $address->isDefaultBilling(); + $addressModel->setIsDefaultBilling($isBilling); + $addressModel->setIsDefaultShipping($address->isDefaultShipping()); + // Need to use attribute set or future updates can cause data loss + if (!$addressModel->getAttributeSetId()) { + $addressModel->setAttributeSetId(CustomerMetadataServiceInterface::ADDRESS_ATTRIBUTE_SET_ID); + } + } + +} diff --git a/app/code/Magento/Customer/Service/V1/CustomerAddressServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerAddressServiceInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..7f4a619a0b7c261e5b2a1de2b22b0ba239912531 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/CustomerAddressServiceInterface.php @@ -0,0 +1,101 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1; +use Magento\Customer\Service\Entity\V1\AggregateException; +use Magento\Customer\Service\Entity\V1\Exception; + +/** + * Manipulate Customer Address Entities * + */ +interface CustomerAddressServiceInterface +{ + /** + * Retrieve all Customer Addresses + * + * @param int $customerId, + * @return \Magento\Customer\Service\V1\Dto\Address[] + * @throws Exception + */ + public function getAddresses($customerId); + + /** + * Retrieve default billing address + * + * @param int $customerId + * @return \Magento\Customer\Service\V1\Dto\Address + * @throws Exception + */ + public function getDefaultBillingAddress($customerId); + + /** + * Retrieve default shipping address + * + * @param int $customerId + * @return \Magento\Customer\Service\V1\Dto\Address + * @throws Exception + */ + public function getDefaultShippingAddress($customerId); + + /** + * Retrieve address by id + * + * @param int $customerId + * @param int $addressId + * @return \Magento\Customer\Service\V1\Dto\Address + * @throws Exception + */ + public function getAddressById($customerId, $addressId); + + /** + * Removes an address by id. + * + * @param int $customerId + * @param int $addressId + * @throws Exception if the address does not belong to the given customer + */ + public function deleteAddressFromCustomer($customerId, $addressId); + + /** + * Insert and/or update a list of addresses. + * + * This will add the addresses to the provided customerId. + * Only one address can be the default billing or shipping + * so if more than one is set, or if one was already set + * then the last address in this provided list will take + * over as the new default. + * + * This doesn't support partial updates to addresses, meaning + * that a full set of data must be provided with each Address + * + * @param int $customerId + * @param \Magento\Customer\Service\V1\Dto\Address[] $addresses + * + * @throws AggregateException if there are validation errors. + * @throws Exception If customerId is not found or other error occurs. + * @return int[] address ids + */ + public function saveAddresses($customerId, array $addresses); + +} diff --git a/app/code/Magento/Customer/Service/V1/CustomerGroupService.php b/app/code/Magento/Customer/Service/V1/CustomerGroupService.php new file mode 100644 index 0000000000000000000000000000000000000000..e001c415359271f42a994f2a97d3c96911174973 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/CustomerGroupService.php @@ -0,0 +1,203 @@ +<?php +/** + * Customer service is responsible for customer business workflow encapsulation + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1; + +use Magento\Customer\Service\V1\Dto\SearchCriteria; +use Magento\Customer\Service\Entity\V1\Exception; + +class CustomerGroupService implements CustomerGroupServiceInterface +{ + /** + * @var \Magento\Customer\Model\GroupFactory + */ + private $_groupFactory; + + /** + * @var \Magento\Core\Model\Store\Config + */ + private $_storeConfig; + + /** + * @var \Magento\Customer\Service\V1\Dto\SearchResultsBuilder + */ + private $_searchResultsBuilder; + + /** + * @var \Magento\Customer\Service\V1\Dto\CustomerGroupBuilder + */ + private $_customerGroupBuilder; + + /** + * @param \Magento\Customer\Model\GroupFactory $groupFactory + * @param \Magento\Core\Model\Store\Config $storeConfig + * @param \Magento\Customer\Service\V1\Dto\SearchResultsBuilder $searchResultsBuilder + * @param \Magento\Customer\Service\V1\Dto\CustomerGroupBuilder $customerGroupBuilder + */ + public function __construct( + \Magento\Customer\Model\GroupFactory $groupFactory, + \Magento\Core\Model\Store\Config $storeConfig, + Dto\SearchResultsBuilder $searchResultsBuilder, + Dto\CustomerGroupBuilder $customerGroupBuilder + ) { + $this->_groupFactory = $groupFactory; + $this->_storeConfig = $storeConfig; + $this->_searchResultsBuilder = $searchResultsBuilder; + $this->_customerGroupBuilder = $customerGroupBuilder; + } + + /** + * @inheritdoc + */ + public function getGroups($includeNotLoggedIn = true, $taxClassId = null) + { + $groups = array(); + /** @var \Magento\Customer\Model\Resource\Group\Collection $collection */ + $collection = $this->_groupFactory->create()->getCollection(); + if (!$includeNotLoggedIn) { + $collection->setRealGroupsFilter(); + } + if (!is_null($taxClassId)) { + $collection->addFieldToFilter('tax_class_id', $taxClassId); + } + /** @var \Magento\Customer\Model\Group $group */ + foreach ($collection as $group) { + $this->_customerGroupBuilder->setId($group->getId()) + ->setCode($group->getCode()) + ->setTaxClassId($group->getTaxClassId()); + $groups[] = $this->_customerGroupBuilder->create(); + } + return $groups; + } + + /** + * @inheritdoc + */ + public function searchGroups(SearchCriteria $searchCriteria) + { + $this->_searchResultsBuilder->setSearchCriteria($searchCriteria); + + $groups = array(); + /** @var \Magento\Customer\Model\Resource\Group\Collection $collection */ + $collection = $this->_groupFactory->create()->getCollection(); + foreach ($searchCriteria->getFilters() as $filter) { + $collection->addFilter($filter->getField(), $filter->getValue(), $filter->getConditionType()); + } + $this->_searchResultsBuilder->setTotalCount($collection->getSize()); + foreach ($searchCriteria->getSortOrders() as $field => $direction) { + switch($field) { + case 'id' : + $field = 'customer_group_id'; + break; + case 'code': + $field = 'customer_group_code'; + break; + case "tax_class_id": + default: + break; + } + $collection->addOrder($field, $direction == SearchCriteria::SORT_ASC ? 'ASC' : 'DESC'); + } + $collection->setCurPage($searchCriteria->getCurrentPage()); + $collection->setPageSize($searchCriteria->getPageSize()); + + /** @var \Magento\Customer\Model\Group $group */ + foreach ($collection as $group) { + $this->_customerGroupBuilder->setId($group->getId()) + ->setCode($group->getCode()) + ->setTaxClassId($group->getTaxClassId()); + $groups[] = $this->_customerGroupBuilder->create(); + } + $this->_searchResultsBuilder->setItems($groups); + return $this->_searchResultsBuilder->create(); + } + + /** + * @inheritdoc + */ + public function getGroup($groupId) + { + $customerGroup = $this->_groupFactory->create(); + $customerGroup->load($groupId); + // Throw exception if a customer group does not exist + if (is_null($customerGroup->getId())) { + throw new Exception(__('groupId ' . $groupId . ' does not exist.')); + } + $this->_customerGroupBuilder->setId($customerGroup->getId()) + ->setCode($customerGroup->getCode()) + ->setTaxClassId($customerGroup->getTaxClassId()); + return $this->_customerGroupBuilder->create(); + } + + /** + * @inheritdoc + */ + public function getDefaultGroup($storeId) + { + $groupId = $this->_storeConfig->getConfig(\Magento\Customer\Model\Group::XML_PATH_DEFAULT_ID, $storeId); + return $this->getGroup($groupId); + } + + /** + * @inheritdoc + */ + public function canDelete($groupId) + { + $customerGroup = $this->_groupFactory->create(); + $customerGroup->load($groupId); + return $groupId > 0 && !$customerGroup->usesAsDefault(); + } + + /** + * @inheritdoc + */ + public function saveGroup(Dto\CustomerGroup $group) + { + $customerGroup = $this->_groupFactory->create(); + if ($group->getId()) { + $customerGroup->load($group->getId()); + } + $customerGroup->setCode($group->getCode()); + $customerGroup->setTaxClassId($group->getTaxClassId()); + $customerGroup->save(); + return $customerGroup->getId(); + } + + /** + * @inheritdoc + */ + public function deleteGroup($groupId) + { + try { + // Get group so we can throw an exception if it doesn't exist + $this->getGroup($groupId); + $customerGroup = $this->_groupFactory->create(); + $customerGroup->setId($groupId); + $customerGroup->delete(); + } catch (\Exception $e) { + throw new Exception($e->getMessage(), $e->getCode(), $e); + } + } +} diff --git a/app/code/Magento/Customer/Service/V1/CustomerGroupServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerGroupServiceInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..fae88d4d955353f1a60f4a8462589fc2f712971c --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/CustomerGroupServiceInterface.php @@ -0,0 +1,94 @@ +<?php +/** + * Customer Service Interface + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1; + +use Magento\Customer\Service\V1\Dto\CustomerGroup; +use Magento\Customer\Service\V1\Dto\SearchCriteria; +use Magento\Validator\Test\True; + +interface CustomerGroupServiceInterface +{ + const NOT_LOGGED_IN_ID = 0; + const CUST_GROUP_ALL = 32000; + const GROUP_CODE_MAX_LENGTH = 32; + + /** + * Retrieve Customer Groups + * + * The list of groups can be filtered to exclude the NOT_LOGGED_IN group using the first parameter and/or it can + * be filtered by tax class. + * + * @param boolean $includeNotLoggedIn + * @param int $taxClassId + * + * @return \Magento\Customer\Service\V1\Dto\CustomerGroup[] + */ + public function getGroups($includeNotLoggedIn = true, $taxClassId = null); + + /** + * @param \Magento\Customer\Service\V1\Dto\SearchCriteria $searchCriteria + * + * @return \Magento\Customer\Service\V1\Dto\SearchResults + */ + public function searchGroups(Dto\SearchCriteria $searchCriteria); + + /** + * Get a customer group by group ID. + * + * @param int $groupId + * @throws \Magento\Customer\Service\Entity\V1\Exception if groupId is not found + * @return \Magento\Customer\Service\V1\Dto\CustomerGroup + */ + public function getGroup($groupId); + + /** + * @param int $storeId + * + * @return \Magento\Customer\Service\V1\Dto\CustomerGroup + */ + public function getDefaultGroup($storeId); + + /** + * @param int $groupId + * + * @return boolean true, if this group can be deleted + */ + public function canDelete($groupId); + + /** + * @param \Magento\Customer\Service\V1\Dto\CustomerGroup $group + * + * @return int customer group ID + */ + public function saveGroup(CustomerGroup $group); + + /** + * @param int $groupId + * + * @return null + */ + public function deleteGroup($groupId); +} diff --git a/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php b/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php new file mode 100644 index 0000000000000000000000000000000000000000..695b5cf701b62039e3d719ea7b6260774402ede2 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php @@ -0,0 +1,241 @@ +<?php +/** + * EAV attribute metadata service + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1; + +use Magento\Customer\Service\V1\CustomerMetadataServiceInterface; +use Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata; +use Magento\Customer\Service\V1\Dto\Eav\OptionBuilder; + +class CustomerMetadataService implements CustomerMetadataServiceInterface +{ + /** + * @var \Magento\Eav\Model\Config + */ + private $_eavConfig; + + /** @var array Cache of DTOs - entityType => attributeCode => DTO */ + private $_cache; + + /** + * @var \Magento\Customer\Model\Resource\Form\Attribute\Collection + */ + private $_attrFormCollection; + + /** + * @var \Magento\Core\Model\StoreManager + */ + private $_storeManager; + + /** + * @var \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder + */ + private $_optionBuilder; + + /** + * @var \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder + */ + private $_attributeMetadataBuilder; + + /** + * @param \Magento\Eav\Model\Config $eavConfig + * @param \Magento\Customer\Model\Resource\Form\Attribute\Collection $attrFormCollection + * @param \Magento\Core\Model\StoreManager $storeManager + * @param \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder $optionBuilder + * @param \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder $attributeMetadataBuilder + */ + public function __construct( + \Magento\Eav\Model\Config $eavConfig, + \Magento\Customer\Model\Resource\Form\Attribute\Collection $attrFormCollection, + \Magento\Core\Model\StoreManager $storeManager, + \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder $optionBuilder, + \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder $attributeMetadataBuilder + ) { + $this->_eavConfig = $eavConfig; + $this->_cache = []; + $this->_attrFormCollection = $attrFormCollection; + $this->_storeManager = $storeManager; + $this->_optionBuilder = $optionBuilder; + $this->_attributeMetadataBuilder = $attributeMetadataBuilder; + } + + /** + * Retrieve EAV attribute metadata + * + * @param mixed $entityType + * @param mixed $attributeCode + * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata + */ + public function getAttributeMetadata($entityType, $attributeCode) + { + $dtoCache = $this->_getEntityCache($entityType); + if (isset($dtoCache[$attributeCode])) { + return $dtoCache[$attributeCode]; + } + + /** @var \Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute */ + $attribute = $this->_eavConfig->getAttribute($entityType, $attributeCode); + $attributeMetadata = $this->_createMetadataAttribute($attribute); + $dtoCache[$attributeCode] = $attributeMetadata; + return $attributeMetadata; + } + + /** + * Returns all known attributes metadata for a given entity type and attribute set + * + * @param string $entityType + * @param int $attributeSetId + * @param int $storeId + * @return AttributeMetadata[] + */ + public function getAllAttributeSetMetadata($entityType, $attributeSetId = 0, $storeId = null) + { + if (null === $storeId) { + $storeId = $this->_storeManager->getStore()->getId(); + } + $object = new \Magento\Object([ + 'store_id' => $storeId, + 'attribute_set_id' => $attributeSetId, + ]); + $attributeCodes = $this->_eavConfig->getEntityAttributeCodes($entityType, $object); + + $attributesMetadata = []; + foreach ($attributeCodes as $attributeCode) { + $attributesMetadata[] = $this->getAttributeMetadata($entityType, $attributeCode); + } + return $attributesMetadata; + } + + /** + * Retrieve all attributes for entityType filtered by form code + * + * @param $entityType + * @param $formCode + * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata[] + */ + public function getAttributes($entityType, $formCode) + { + $attributes = []; + $this->_loadAttributesCollection($entityType, $formCode); + foreach ($this->_attrFormCollection as $attribute) { + $attributes[$attribute->getAttributeCode()] = $this->_createMetadataAttribute($attribute); + } + return $attributes; + } + + /** + * Load collection with filters applied + * + * @param $entityType + * @param $formCode + * @return null + */ + private function _loadAttributesCollection($entityType, $formCode) + { + $this->_attrFormCollection + ->setStore($this->_storeManager->getStore()) + ->setEntityType($entityType) + ->addFormCodeFilter($formCode) + ->setSortOrder() + ->load(); + } + + /** + * @param \Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute + * @return AttributeMetadata + */ + private function _createMetadataAttribute($attribute) + { + $options = []; + try { + foreach ($attribute->getSource()->getAllOptions() as $option) { + $options[$option['label']] = $this->_optionBuilder->setLabel($option['label']) + ->setValue($option['value']) + ->create(); + } + } catch (\Exception $e) { + // There is no source for this attribute + } + $this->_attributeMetadataBuilder->setAttributeCode($attribute->getAttributeCode()) + ->setFrontendInput($attribute->getFrontendInput()) + ->setInputFilter($attribute->getInputFilter()) + ->setStoreLabel($attribute->getStoreLabel()) + ->setValidationRules($attribute->getValidateRules()) + ->setIsVisible($attribute->getIsVisible()) + ->setIsRequired($attribute->getIsRequired()) + ->setMultilineCount($attribute->getMultilineCount()) + ->setDataModel($attribute->getDataModel()) + ->setOptions($options); + + return $this->_attributeMetadataBuilder->create(); + } + + /** + * @inheritdoc + */ + public function getCustomerAttributeMetadata($attributeCode) + { + return $this->getAttributeMetadata('customer', $attributeCode); + } + + /** + * @inheritdoc + */ + public function getAllCustomerAttributeMetadata() + { + return $this->getAllAttributeSetMetadata('customer', self::CUSTOMER_ATTRIBUTE_SET_ID); + } + + /** + * @inheritdoc + */ + public function getAddressAttributeMetadata($attributeCode) + { + return $this->getAttributeMetadata('customer_address', $attributeCode); + } + + /** + * @inheritdoc + */ + public function getAllAddressAttributeMetadata() + { + return $this->getAllAttributeSetMetadata('customer_address', self::ADDRESS_ATTRIBUTE_SET_ID); + } + + + /** + * Helper for getting access to an entity types DTO cache. + * + * @param $entityType + * @return \ArrayAccess + */ + private function _getEntityCache($entityType) + { + if (!isset($this->_cache[$entityType])) { + $this->_cache[$entityType] = new \ArrayObject(); + } + return $this->_cache[$entityType]; + } +} diff --git a/app/code/Magento/Customer/Service/V1/CustomerMetadataServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerMetadataServiceInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..d0619bb0da4d83b521a4546f102a4d7e28eeec8f --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/CustomerMetadataServiceInterface.php @@ -0,0 +1,95 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1; + +use Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata; + +/** + * Manipulate Customer Metadata Attributes * + */ +interface CustomerMetadataServiceInterface +{ + const CUSTOMER_ATTRIBUTE_SET_ID = 1; + const ADDRESS_ATTRIBUTE_SET_ID = 2; + + /** + * Retrieve Attribute Metadata + * + * @param mixed $entityType + * @param mixed $attributeCode + * @return AttributeMetadata + */ + public function getAttributeMetadata($entityType, $attributeCode); + + /** + * Returns all known attributes metadata for a given entity type + * + * @param string $entityType + * @param int $attributeSetId + * @param int $storeId + * @return AttributeMetadata[] + */ + public function getAllAttributeSetMetadata($entityType, $attributeSetId = 0, $storeId = null); + + /** + * Retrieve all attributes for entityType filtered by form code + * + * @param $entityType + * @param $formCode + * @return AttributeMetadata[] + */ + public function getAttributes($entityType, $formCode); + + /** + * Retrieve Customer EAV attribute metadata + * + * @param string $attributeCode + * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata + */ + public function getCustomerAttributeMetadata($attributeCode); + + /** + * Returns all attribute metadata for customers + * + * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata[] + */ + public function getAllCustomerAttributeMetadata(); + + /** + * Retrieve Customer Addresses EAV attribute metadata + * + * @param string $attributeCode + * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata + */ + public function getAddressAttributeMetadata($attributeCode); + + /** + * Returns all attribute metadata for Addresses + * + * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata[] + */ + public function getAllAddressAttributeMetadata(); + +} diff --git a/app/code/Magento/Customer/Service/V1/CustomerService.php b/app/code/Magento/Customer/Service/V1/CustomerService.php new file mode 100644 index 0000000000000000000000000000000000000000..7f53131bfe711410341d2877666524aba14b2deb --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/CustomerService.php @@ -0,0 +1,120 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1; + +use Magento\Customer\Service\Entity\V1\Exception; +use Magento\Customer\Model\Customer; +use Magento\Validator\ValidatorException; + +/** + * Manipulate Customer Address Entities * + */ +class CustomerService implements CustomerServiceInterface +{ + + /** @var array Cache of DTOs */ + private $_cache = []; + + + /** + * @var \Magento\Customer\Model\Converter + */ + private $_converter; + + + /** + * Constructor + * + * @param \Magento\Customer\Model\CustomerFactory $customerFactory + * @param \Magento\Customer\Model\AddressFactory $addressFactory + * @param \Magento\Customer\Service\V1\CustomerMetadataServiceInterface $eavMetadataService + * @param \Magento\Event\ManagerInterface $eventManager + * @param \Magento\Core\Model\StoreManagerInterface $storeManager + * @param \Magento\Math\Random $mathRandom + * @param \Magento\Customer\Model\Converter $converter + * @param \Magento\Customer\Model\Metadata\Validator $validator + * @param \Magento\Customer\Service\V1\Dto\RegionBuilder $regionBuilder + * @param \Magento\Customer\Service\V1\Dto\AddressBuilder $addressBuilder + * @param \Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder $createCustomerAccountResponseBuilder + */ + public function __construct( + \Magento\Customer\Model\Converter $converter + ) { + $this->_converter = $converter; + } + + + /** + * @inheritdoc + */ + public function getCustomer($customerId) + { + if (!isset($this->_cache[$customerId])) { + $customerModel = $this->_converter->getCustomerModel($customerId); + $customerEntity = $this->_converter->createCustomerFromModel($customerModel); + $this->_cache[$customerId] = $customerEntity; + } + + return $this->_cache[$customerId]; + } + + + /** + * @inheritdoc + */ + public function saveCustomer(Dto\Customer $customer, $password = null) + { + $customerModel = $this->_converter->createCustomerModel($customer); + + if ($password) { + $customerModel->setPassword($password); + } + + $validationErrors = $customerModel->validate(); + if ($validationErrors !== true) { + throw new Exception( + 'There were one or more errors validating the customer object.', + Exception::CODE_VALIDATION_FAILED, + new ValidatorException([$validationErrors]) + ); + } + + try { + $customerModel->save(); + unset($this->_cache[$customerModel->getId()]); + } catch (\Exception $e) { + switch ($e->getCode()) { + case Customer::EXCEPTION_EMAIL_EXISTS: + $code = Exception::CODE_EMAIL_EXISTS; + break; + default: + $code = Exception::CODE_UNKNOWN; + } + throw new Exception($e->getMessage(), $code, $e); + } + + return $customerModel->getId(); + } +} diff --git a/app/code/Magento/Customer/Service/V1/CustomerServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerServiceInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..6d12afb3c3dbcb1fdb9fcecffb6a212d129d4d7d --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/CustomerServiceInterface.php @@ -0,0 +1,50 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1; + +/** + * Manipulate Customer Address Entities * + */ +interface CustomerServiceInterface +{ + /** + * Create or update customer information + * + * @param \Magento\Customer\Service\V1\Dto\Customer $customer + * @param string $password + * @throws \Magento\Customer\Service\Entity\V1\Exception + * @return int customer ID + */ + public function saveCustomer(Dto\Customer $customer, $password = null); + + /** + * Retrieve Customer + * + * @param int $customerId + * @return \Magento\Customer\Service\V1\Dto\Customer + */ + public function getCustomer($customerId); + +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Address.php b/app/code/Magento/Customer/Service/V1/Dto/Address.php new file mode 100644 index 0000000000000000000000000000000000000000..771209452dc0c729dd6141757e364e2f47f77c3b --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Address.php @@ -0,0 +1,214 @@ +<?php +/** + * Address class acts as a DTO for the Customer Service + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +use Magento\Customer\Service\V1\Dto\Region; + +class Address extends \Magento\Service\Entity\AbstractDto implements Eav\EntityInterface +{ + /** + * @var array + */ + private static $_nonAttributes = ['id', 'customer_id', 'region', 'default_billing', 'default_shipping']; + + /** + * @return int|null + */ + public function getId() + { + return $this->_get('id'); + } + + /** + * @return boolean|null + */ + public function isDefaultShipping() + { + return $this->_get('default_shipping'); + } + + /** + * @return boolean|null + */ + public function isDefaultBilling() + { + return $this->_get('default_billing'); + } + + /** + * @return string[] + */ + public function getAttributes() + { + $attributes = $this->_data; + foreach (self::$_nonAttributes as $keyName) { + unset ($attributes[$keyName]); + } + + /** This triggers some code in _updateAddressModel in CustomerV1 Service */ + if (!is_null($this->getRegion())) { + $attributes['region_id'] = $this->getRegion()->getRegionId(); + + $attributes['region'] = $this->getRegion()->getRegion(); + } + + return $attributes; + } + + /** + * @param string $attributeCode + * @return string|null + */ + public function getAttribute($attributeCode) + { + $attributes = $this->getAttributes(); + if (isset($attributes[$attributeCode]) + && !in_array($attributeCode, self::$_nonAttributes)) { + return $attributes[$attributeCode]; + } + return null; + } + + /** + * @return Region + */ + public function getRegion() + { + return $this->_get('region'); + } + + /** + * @return int|null + */ + public function getCountryId() + { + return $this->_get('country_id'); + } + + /** + * @return \string[]|null + */ + public function getStreet() + { + return $this->_get('street'); + } + + /** + * @return string|null + */ + public function getCompany() + { + return $this->_get('company'); + } + + /** + * @return string|null + */ + public function getTelephone() + { + return $this->_get('telephone'); + } + + /** + * @return string|null + */ + public function getFax() + { + return $this->_get('fax'); + } + + /** + * @return string|null + */ + public function getPostcode() + { + return $this->_get('postcode'); + } + + /** + * @return string|null + */ + public function getCity() + { + return $this->_get('city'); + } + + /** + * @return string|null + */ + public function getFirstname() + { + return $this->_get('firstname'); + } + + /** + * @return string|null + */ + public function getLastname() + { + return $this->_get('lastname'); + } + + /** + * @return string|null + */ + public function getMiddlename() + { + return $this->_get('middlename'); + } + + /** + * @return string|null + */ + public function getPrefix() + { + return $this->_get('prefix'); + } + + /** + * @return string|null + */ + public function getSuffix() + { + return $this->_get('suffix'); + } + + /** + * @return string|null + */ + public function getVatId() + { + return $this->_get('vat_id'); + } + + /** + * @return string|null + */ + public function getCustomerId() + { + return $this->_get('customer_id'); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/AddressBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/AddressBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..e5b6eb54f060b8f31b2945b5f46ac7fca5a62819 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/AddressBuilder.php @@ -0,0 +1,226 @@ +<?php +/** + * Address class acts as a DTO for the Customer Service + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +use Magento\Customer\Service\V1\Dto\Region; + +class AddressBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + protected $_regionBuilder; + + /** + * @param \Magento\Customer\Service\V1\Dto\RegionBuilder $regionBuilder + */ + public function __construct( + \Magento\Customer\Service\V1\Dto\RegionBuilder $regionBuilder + ) { + parent::__construct(); + $this->_regionBuilder = $regionBuilder; + $this->_data['region'] = $regionBuilder->create(); + } + + /** + * @param int $id + * @return AddressBuilder + */ + public function setId($id) + { + return $this->_set('id', (string)$id); + } + + /** + * @param boolean $defaultShipping + * @return AddressBuilder + */ + public function setDefaultShipping($defaultShipping) + { + return $this->_set('default_shipping', (bool)$defaultShipping); + } + + /** + * @param boolean $defaultBilling + * @return AddressBuilder + */ + public function setDefaultBilling($defaultBilling) + { + return $this->_set('default_billing', (bool)$defaultBilling); + } + + /** + * @param string[] $data + * @return AddressBuilder + */ + public function populateWithArray(array $data) + { + unset($data['region_id']); + if (isset($data['region'])) { + $region = $data['region']; + if (!($region instanceof Region)) { + unset($data['region']); + } + } + + parent::populateWithArray($data); + + return $this; + } + + /** + * @param Region $region + * @return AddressBuilder + */ + public function setRegion(Region $region) + { + return $this->_set('region', $region); + } + + /** + * @param int $countryId + * @return AddressBuilder + */ + public function setCountryId($countryId) + { + return $this->_set('country_id', $countryId); + } + + /** + * @param \string[] $street + * @return AddressBuilder + */ + public function setStreet($street) + { + return $this->_set('street', $street); + } + + /** + * @param string $company + * @return AddressBuilder + */ + public function setCompany($company) + { + return $this->_set('company', $company); + } + + /** + * @param string $telephone + * @return AddressBuilder + */ + public function setTelephone($telephone) + { + return $this->_set('telephone', $telephone); + } + + /** + * @param string $fax + * @return AddressBuilder + */ + public function setFax($fax) + { + return $this->_set('fax', $fax); + } + + /** + * @param string $postcode + * @return AddressBuilder + */ + public function setPostcode($postcode) + { + return $this->_set('postcode', $postcode); + } + + /** + * @param string $city + * @return AddressBuilder + */ + public function setCity($city) + { + return $this->_set('city', $city); + } + + /** + * @param string $firstname + * @return AddressBuilder + */ + public function setFirstname($firstname) + { + return $this->_set('firstname', $firstname); + } + + /** + * @param string $lastname + * @return AddressBuilder + */ + public function setLastname($lastname) + { + return $this->_set('lastname', $lastname); + } + + /** + * @param string $middlename + * @return AddressBuilder + */ + public function setMiddlename($middlename) + { + return $this->_set('middlename', $middlename); + } + + /** + * @param string $prefix + * @return AddressBuilder + */ + public function setPrefix($prefix) + { + return $this->_set('prefix', $prefix); + } + + /** + * @param string $suffix + * @return AddressBuilder + */ + public function setSuffix($suffix) + { + return $this->_set('suffix', $suffix); + } + + /** + * @param string $vatId + * @return AddressBuilder + */ + public function setVatId($vatId) + { + return $this->_set('vat_id', $vatId); + } + + /** + * @param string $customerId + * @return AddressBuilder + */ + public function setCustomerId($customerId) + { + /** XXX: (string) Needed for tests to pass */ + return $this->_set('customer_id', (string)$customerId); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Customer.php b/app/code/Magento/Customer/Service/V1/Dto/Customer.php new file mode 100644 index 0000000000000000000000000000000000000000..323759306b7da14a2fd5bb483ccce5ee5ccf6961 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Customer.php @@ -0,0 +1,248 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +/** + * Class Customer + * Uses array to hold data, setters return $this so they can be chained. + * + * @package Magento\Customer\Service\Entity\V1 + */ +class Customer extends \Magento\Service\Entity\AbstractDto implements Eav\EntityInterface +{ + + /** + * @var array Special attribute codes which cannot be set or gotten + * they are used by the model but should not be exposed in the DTO + */ + private static $_nonAttributes = [self::ID]; + + /** + * name of field containing entity id, used to exclude this field from list of attributes. + */ + const ID = 'id'; + + /** + * constants defined for keys of array, makes typos less likely + */ + const CONFIRMATION = 'confirmation'; + const CREATED_AT = 'created_at'; + const CREATED_IN = 'created_in'; + const DOB = 'dob'; + const EMAIL = 'email'; + const FIRSTNAME = 'firstname'; + const GENDER = 'gender'; + const GROUP_ID = 'group_id'; + const LASTNAME = 'lastname'; + const MIDDLENAME = 'middlename'; + const PREFIX = 'prefix'; + const STORE_ID = 'store_id'; + const SUFFIX = 'suffix'; + const TAXVAT = 'taxvat'; + const WEBSITE_ID = 'website_id'; + const DEFAULT_BILLING = 'default_billing'; + const DEFAULT_SHIPPING = 'default_shipping'; + + /** + * Retrieve array of all attributes, in the form of 'attribute code' => <attribute value' + * + * @return array|\ArrayAccess|\string[] + */ + public function getAttributes() + { + $attributes = $this->__toArray(); + foreach (self::$_nonAttributes as $keyName) { + unset ($attributes[$keyName]); + } + return $attributes; + } + + /** + * Gets an attribute value. + * + * @param string $attributeCode + * @return mixed The attribute value or null if the attribute has not been set + */ + public function getAttribute($attributeCode) + { + if (isset($this->_data[$attributeCode])) { + return $this->_data[$attributeCode]; + } else { + return null; + } + } + + /** + * @return string + */ + public function getDefaultBilling() + { + return $this->_get(self::DEFAULT_BILLING); + } + + /** + * @return string + */ + public function getDefaultShipping() + { + return $this->_get(self::DEFAULT_SHIPPING); + } + + /** + * @return string + */ + public function getConfirmation() + { + return $this->_get(self::CONFIRMATION); + } + + /** + * @param string $confirmation + * @return Customer + */ + public function setConfirmation($confirmation) + { + return $this->_set(self::CONFIRMATION, $confirmation); + } + + /** + * @return string + */ + public function getCreatedAt() + { + return $this->_get(self::CREATED_AT); + } + + /** + * @return string + */ + public function getCreatedIn() + { + return $this->_get(self::CREATED_IN); + } + + /** + * @return string + */ + public function getDob() + { + return $this->_get(self::DOB); + } + + /** + * @return string + */ + public function getEmail() + { + return $this->_get(self::EMAIL); + } + + /** + * @return string + */ + public function getFirstname() + { + return $this->_get(self::FIRSTNAME); + } + + /** + * @return string + */ + public function getGender() + { + return $this->_get(self::GENDER); + } + + /** + * @return string + */ + public function getGroupId() + { + return $this->_get(self::GROUP_ID); + } + + /** + * @return int + */ + public function getCustomerId() + { + return $this->_get(self::ID); + } + + /** + * @return string + */ + public function getLastname() + { + return $this->_get(self::LASTNAME); + } + + /** + * @return string + */ + public function getMiddlename() + { + return $this->_get(self::MIDDLENAME); + } + + /** + * @return string + */ + public function getPrefix() + { + return $this->_get(self::PREFIX); + } + + /** + * @return int + */ + public function getStoreId() + { + return $this->_get(self::STORE_ID); + } + + /** + * @return string + */ + public function getSuffix() + { + return $this->_get(self::SUFFIX); + } + + /** + * @return string + */ + public function getTaxvat() + { + return $this->_get(self::TAXVAT); + } + + /** + * @return int + */ + public function getWebsiteId() + { + return $this->_get(self::WEBSITE_ID, 0); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/CustomerBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/CustomerBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..150e4a474ff06a515941daeef69005c70cbbad03 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/CustomerBuilder.php @@ -0,0 +1,179 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; +use Magento\Customer\Service\V1\Dto\Customer; + +/** + * Class Customer + * Uses array to hold data, setters return $this so they can be chained. + * + * @package Magento\Customer\Service\Entity\V1 + */ +class CustomerBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + + /** + * @param string $confirmation + * @return CustomerBuilder + */ + public function setConfirmation($confirmation) + { + return $this->_set(Customer::CONFIRMATION, $confirmation); + } + + /** + * @param string $createdAt + * @return CustomerBuilder + */ + public function setCreatedAt($createdAt) + { + return $this->_set(Customer::CREATED_AT, $createdAt); + } + + /** + * @param string $createdIn + * @return CustomerBuilder + */ + public function setCreatedIn($createdIn) + { + return $this->_set(Customer::CREATED_IN, $createdIn); + } + + /** + * @param string $dob + * @return CustomerBuilder + */ + public function setDob($dob) + { + return $this->_set(Customer::DOB, $dob); + } + + /** + * @param string $email + * @return CustomerBuilder + */ + public function setEmail($email) + { + return $this->_set(Customer::EMAIL, $email); + } + + /** + * @param string $firstname + * @return CustomerBuilder + */ + public function setFirstname($firstname) + { + return $this->_set(Customer::FIRSTNAME, $firstname); + } + + /** + * @param string $gender + * @return CustomerBuilder + */ + public function setGender($gender) + { + return $this->_set(Customer::GENDER, $gender); + } + + /** + * @param string $groupId + * @return CustomerBuilder + */ + public function setGroupId($groupId) + { + return $this->_set(Customer::GROUP_ID, $groupId); + } + + /** + * @param int $id + * @return CustomerBuilder + */ + public function setCustomerId($id) + { + return $this->_set(Customer::ID, $id); + } + + /** + * @param string $lastname + * @return CustomerBuilder + */ + public function setLastname($lastname) + { + return $this->_set(Customer::LASTNAME, $lastname); + } + + /** + * @param string $middlename + * @return CustomerBuilder + */ + public function setMiddlename($middlename) + { + return $this->_set(Customer::MIDDLENAME, $middlename); + } + + /** + * @param string $prefix + * @return CustomerBuilder + */ + public function setPrefix($prefix) + { + return $this->_set(Customer::PREFIX, $prefix); + } + + /** + * @param int $storeId + * @return CustomerBuilder + */ + public function setStoreId($storeId) + { + return $this->_set(Customer::STORE_ID, $storeId); + } + + /** + * @param string $suffix + * @return CustomerBuilder + */ + public function setSuffix($suffix) + { + return $this->_set(Customer::SUFFIX, $suffix); + } + + /** + * @param string $taxvat + * @return CustomerBuilder + */ + public function setTaxvat($taxvat) + { + return $this->_set(Customer::TAXVAT, $taxvat); + } + + /** + * @param int $websiteId + * @return CustomerBuilder + */ + public function setWebsiteId($websiteId) + { + return $this->_set(Customer::WEBSITE_ID, $websiteId); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/CustomerGroup.php b/app/code/Magento/Customer/Service/V1/Dto/CustomerGroup.php new file mode 100644 index 0000000000000000000000000000000000000000..550278599f494fd4e2857d8f058ff9162b8e999e --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/CustomerGroup.php @@ -0,0 +1,53 @@ +<?php +/** + * Customer Service Address Interface + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +class CustomerGroup extends \Magento\Service\Entity\AbstractDto +{ + /** + * @return int + */ + public function getId() + { + return $this->_get('id'); + } + + /** + * @return string + */ + public function getCode() + { + return $this->_get('code'); + } + + /** + * @return int + */ + public function getTaxClassId() + { + return $this->_get('tax_class_id'); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/CustomerGroupBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/CustomerGroupBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..0c81be242f5a9d76ceda41fe3c355aa27bfe4210 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/CustomerGroupBuilder.php @@ -0,0 +1,59 @@ +<?php +/** + * Customer Service Address Interface + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +class CustomerGroupBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + /** + * @param string $id + * + * @return CustomerGroupBuilder + */ + public function setId($id) + { + return $this->_set('id', $id); + } + + /** + * @param string $code + * + * @return CustomerGroupBuilder + */ + public function setCode($code) + { + return $this->_set('code', $code); + } + + /** + * @param string $taxClassId + * + * @return CustomerGroupBuilder + */ + public function setTaxClassId($taxClassId) + { + return $this->_set('tax_class_id', $taxClassId); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/Attribute.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/Attribute.php new file mode 100644 index 0000000000000000000000000000000000000000..1b475810b8c676f9281ecea6857f4ec90708bb4e --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/Attribute.php @@ -0,0 +1,51 @@ +<?php +/** + * Eav Attribute + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto\Eav; + +class Attribute extends \Magento\Service\Entity\AbstractDto +{ + /** + * Constants used as keys into $_data + */ + const ATTRIBUTE_CODE = 'attribute_code'; + const VALUE = 'value'; + + /** + * @return string the attribute code + */ + public function getAttributeCode() + { + return $this->_get(self::ATTRIBUTE_CODE); + } + + /** + * @return string the attribute value + */ + public function getValue() + { + return $this->_get(self::VALUE); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..0f067c1f21d97c512847e42b77b36106281f1395 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeBuilder.php @@ -0,0 +1,49 @@ +<?php +/** + * Eav Attribute + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto\Eav; + +use Magento\Customer\Service\V1\Dto\Eav\Attribute; + +class AttributeBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + /** + * @param string $attributeCode + * @return AttributeBuilder + */ + public function setAttributeCode($attributeCode) + { + return $this->_set(Attribute::ATTRIBUTE_CODE, $attributeCode); + } + + /** + * @param string $value + * @return AttributeBuilder + */ + public function setValue($value) + { + return $this->_set(Attribute::VALUE, $value); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadata.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadata.php new file mode 100644 index 0000000000000000000000000000000000000000..7c1c05328af526ff1d8414a84f51aa932bbac97d --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadata.php @@ -0,0 +1,125 @@ +<?php +/** + * Eav Attribute Metadata + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto\Eav; + +use Magento\Customer\Service\V1\Dto\Eav\Option; + +class AttributeMetadata extends \Magento\Service\Entity\AbstractDto +{ + /** + * Constants used as keys into $_data + */ + const ATTRIBUTE_CODE = 'attribute_code'; + const FRONT_END_INPUT = 'front_end_input'; + const INPUT_FILTER = 'input_filter'; + const STORE_LABEL = 'store_label'; + const VALIDATION_RULES = 'validation_rules'; + const OPTIONS = 'options'; + const VISIBLE = 'is_visible'; + const REQUIRED = 'is_required'; + const MULTILINE_COUNT = 'multiline_count'; + const DATA_MODEL = 'data_model'; + + /** + * @return string + */ + public function getAttributeCode() + { + return $this->_get(self::ATTRIBUTE_CODE); + } + + /** + * @return string + */ + public function getFrontendInput() + { + return $this->_get(self::FRONT_END_INPUT); + } + + /** + * @return string + */ + public function getInputFilter() + { + return $this->_get(self::INPUT_FILTER); + } + + /** + * @return string + */ + public function getStoreLabel() + { + return $this->_get(self::STORE_LABEL); + } + + /** + * @return string + */ + public function getValidationRules() + { + return $this->_get(self::VALIDATION_RULES); + } + + /** + * @return int + */ + public function getMultilineCount() + { + return $this->_get(self::MULTILINE_COUNT); + } + + /** + * @return boolean + */ + public function getIsVisible() + { + return $this->_get(self::VISIBLE); + } + + /** + * @return boolean + */ + public function getIsRequired() + { + return $this->_get(self::REQUIRED); + } + + /** + * @return string + */ + public function getDataModel() + { + return $this->_get(self::DATA_MODEL); + } + + /** + * @return Option[] + */ + public function getOptions() + { + return $this->_get(self::OPTIONS); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..72792c4292fd73664acbce60e0844fe5f15f37bd --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataBuilder.php @@ -0,0 +1,131 @@ +<?php +/** + * Eav Attribute Metadata + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto\Eav; + +use Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata; + +class AttributeMetadataBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + /** + * Initializes builder. + */ + public function __construct() + { + parent::__construct(); + $this->_data[AttributeMetadata::OPTIONS] = array(); + } + + /** + * @param $attributeCode + * @return AttributeMetadataBuilder + */ + public function setAttributeCode($attributeCode) + { + return $this->_set(AttributeMetadata::ATTRIBUTE_CODE, $attributeCode); + } + + /** + * @param $frontendInput + * @return AttributeMetadataBuilder + */ + public function setFrontendInput($frontendInput) + { + return $this->_set(AttributeMetadata::FRONT_END_INPUT, $frontendInput); + } + + /** + * @param $inputFilter + * @return AttributeMetadataBuilder + */ + public function setInputFilter($inputFilter) + { + return $this->_set(AttributeMetadata::INPUT_FILTER, $inputFilter); + } + + /** + * @param $storeLabel + * @return AttributeMetadataBuilder + */ + public function setStoreLabel($storeLabel) + { + return $this->_set(AttributeMetadata::STORE_LABEL, $storeLabel); + } + + /** + * @param string $validationRules + * @return AttributeMetadataBuilder + */ + public function setValidationRules($validationRules) + { + return $this->_set(AttributeMetadata::VALIDATION_RULES, $validationRules); + } + + /** + * @param \Magento\Customer\Service\V1\Dto\Eav\Option[] $options + * @return AttributeMetadataBuilder + */ + public function setOptions($options) + { + $this->_set(AttributeMetadata::OPTIONS, $options); + } + + /** + * @param boolean $visible + * @return AttributeMetadataBuilder + */ + public function setIsVisible($visible) + { + return $this->_set(AttributeMetadata::VISIBLE, $visible); + } + + /** + * @param boolean $required + * @return AttributeMetadataBuilder + */ + public function setIsRequired($required) + { + return $this->_set(AttributeMetadata::REQUIRED, $required); + } + + + /** + * @param int $count + * @return AttributeMetadataBuilder + */ + public function setMultilineCount($count) + { + return $this->_set(AttributeMetadata::MULTILINE_COUNT, $count); + } + + /** + * @param string + * @return AttributeMetadataBuilder + */ + public function setDataModel($dataModel) + { + return $this->_set(AttributeMetadata::DATA_MODEL, $dataModel); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/EntityInterface.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/EntityInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..9375c6d00e4e7257d57853093a348d3a3a41d5ea --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/EntityInterface.php @@ -0,0 +1,41 @@ +<?php +/** + * Eav Attribute + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto\Eav; + +interface EntityInterface +{ + /** + * @return string[] + */ + public function getAttributes(); + + /** + * @param string $attributeCode + * @return string|null + */ + public function getAttribute($attributeCode); + +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/Option.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/Option.php new file mode 100644 index 0000000000000000000000000000000000000000..077539ae37c63c44c0aa68485879bccadc9909f3 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/Option.php @@ -0,0 +1,55 @@ +<?php +/** + * Eav attribute option + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto\Eav; + +class Option extends \Magento\Service\Entity\AbstractDto +{ + /** + * Constants used as keys into $_data + */ + const LABEL = 'label'; + const VALUE = 'value'; + + /** + * Get option label + * + * @return string + */ + public function getLabel() + { + return $this->_get(self::LABEL); + } + + /** + * Get option value + * + * @return string + */ + public function getValue() + { + return $this->_get(self::VALUE); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/OptionBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/OptionBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..045cfad463ad0ea4251f3f091265307adedbf466 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/OptionBuilder.php @@ -0,0 +1,51 @@ +<?php +/** + * Eav attribute option + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto\Eav; + +use Magento\Customer\Service\V1\Dto\Eav\Option; + +class OptionBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + /** + * Set option label + * + * @return OptionBuilder + */ + public function setLabel($label) + { + return $this->_set(Option::LABEL, $label); + } + + /** + * Set option value + * + * @return OptionBuilder + */ + public function setValue($value) + { + return $this->_set(Option::VALUE, $value); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Filter.php b/app/code/Magento/Customer/Service/V1/Dto/Filter.php new file mode 100644 index 0000000000000000000000000000000000000000..be4afba2ec1cf93cac16dd3500ded24bac53103b --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Filter.php @@ -0,0 +1,53 @@ +<?php +/** + * Customer Service Address Interface + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +class Filter extends \Magento\Service\Entity\AbstractDto +{ + /** + * @return string + */ + public function getField() + { + return $this->_get('field'); + } + + /** + * @return string + */ + public function getValue() + { + return $this->_get('value'); + } + + /** + * @return string + */ + public function getConditionType() + { + return $this->_get('condition_type'); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/FilterBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/FilterBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..f6f1c37619dcf3119221f86f9728c91f7eb97702 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/FilterBuilder.php @@ -0,0 +1,70 @@ +<?php +/** + * Customer Service Address Interface + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +class FilterBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + /** + * Initializes the builder. + */ + public function __construct() + { + parent::__construct(); + + /* XXX: special constructor to set default values */ + $this->_data['condition_type'] = 'and'; + } + + /** + * @param string $field + * @return FilterBuilder + */ + public function setField($field) + { + $this->_data['field'] = $field; + return $this; + } + + /** + * @param string $value + * @return FilterBuilder + */ + public function setValue($value) + { + $this->_data['value'] = $value; + return $this; + } + + /** + * @param string $conditionType + * @return FilterBuilder + */ + public function setConditionType($conditionType) + { + $this->_data['condition_type'] = $conditionType; + return $this; + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Region.php b/app/code/Magento/Customer/Service/V1/Dto/Region.php new file mode 100644 index 0000000000000000000000000000000000000000..475602a5e774d50d3d7c05aceb8c96b2ab083ee4 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Region.php @@ -0,0 +1,53 @@ +<?php +/** + * Class Region + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +class Region extends \Magento\Service\Entity\AbstractDto +{ + /** + * @return string + */ + public function getRegionCode() + { + return $this->_get('region_code'); + } + + /** + * @return string + */ + public function getRegion() + { + return $this->_get('region'); + } + + /** + * @return int + */ + public function getRegionId() + { + return $this->_get('region_id'); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/RegionBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/RegionBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..1f1d0bbdde0f25be112ff4e892a5bbb4b1c1f13f --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/RegionBuilder.php @@ -0,0 +1,59 @@ +<?php +/** + * Customer Service Address Interface + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +class RegionBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + /** + * @param string $regionCode + * @return RegionBuilder + */ + public function setRegionCode($regionCode) + { + $this->_data['region_code'] = $regionCode; + return $this; + } + + /** + * @param string $regionName + * @return RegionBuilder + */ + public function setRegion($regionName) + { + $this->_data['region'] = $regionName; + return $this; + } + + /** + * @param string $regionId + * @return RegionBuilder + */ + public function setRegionId($regionId) + { + $this->_data['region_id'] = $regionId; + return $this; + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponse.php b/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponse.php new file mode 100644 index 0000000000000000000000000000000000000000..e9b88ac826c1edef220f6dafa76317f3b7dc8ca9 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponse.php @@ -0,0 +1,45 @@ +<?php +/** + * Class CreateCustomerAccountResponse + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto\Response; + +class CreateCustomerAccountResponse extends \Magento\Service\Entity\AbstractDto +{ + /** + * @return int + */ + public function getCustomerId() + { + return $this->_get('customer_id'); + } + + /** + * @return string + */ + public function getStatus() + { + return $this->_get('status'); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponseBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponseBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..4e5236b66f5a42fb6d75412b6085af06e817a109 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponseBuilder.php @@ -0,0 +1,47 @@ +<?php +/** + * Class CreateCustomerAccountResponse + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto\Response; + +class CreateCustomerAccountResponseBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + /** + * @param int $customerId + * @return CreateCustomerAccountResponseBuilder + */ + public function setCustomerId($customerId) + { + return $this->_set('customer_id', $customerId); + } + + /** + * @param string $status + * @return CreateCustomerAccountResponseBuilder + */ + public function setStatus($status) + { + return $this->_set('status', $status); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchCriteria.php b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteria.php new file mode 100644 index 0000000000000000000000000000000000000000..87136556f6fd8ba359328b9ffe46472995acfe0e --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteria.php @@ -0,0 +1,66 @@ +<?php +/** + * Customer Service Address Interface + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +use Magento\Customer\Service\V1\Dto\Filter; + +class SearchCriteria extends \Magento\Service\Entity\AbstractDto +{ + const SORT_ASC = 1; + const SORT_DESC = -1; + + /** + * @return Filter[] + */ + public function getFilters() + { + return $this->_get('filters', $this->_createArray()); + } + + /** + * @return array + */ + public function getSortOrders() + { + return $this->_get('sort_orders', $this->_createArray()); + } + + /** + * @return int + */ + public function getPageSize() + { + return $this->_get('page_size'); + } + + /** + * @return int + */ + public function getCurrentPage() + { + return $this->_get('current_page'); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchCriteriaBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteriaBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..559135790f3eac1bbdf6b6de1b318b7503bd1d37 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteriaBuilder.php @@ -0,0 +1,82 @@ +<?php +/** + * Customer Service Address Interface + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +use Magento\Customer\Service\V1\Dto\Filter; + +class SearchCriteriaBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + /** + * @param Filter $filter + * + * @return SearchCriteriaBuilder + */ + public function addFilter($filter) + { + if (!isset($this->_data['filters'])) { + $this->_data['filters'] = array(); + } + + $this->_data['filters'][] = $filter; + return $this; + } + + /** + * @param string $field + * @param int $direction + * + * @return SearchCriteriaBuilder + */ + public function addSortOrder($field, $direction) + { + if (!isset($this->_data['sort_orders'])) { + $this->_data['sort_orders'] = array(); + } + + $this->_data['sort_orders'][$field] = $direction; + return $this; + } + + /** + * @param int $pageSize + * + * @return SearchCriteriaBuilder + */ + public function setPageSize($pageSize) + { + return $this->_set('page_size', $pageSize); + } + + /** + * @param int $currentPage + * + * @return SearchCriteriaBuilder + */ + public function setCurrentPage($currentPage) + { + return $this->_set('current_page', $currentPage); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchResults.php b/app/code/Magento/Customer/Service/V1/Dto/SearchResults.php new file mode 100644 index 0000000000000000000000000000000000000000..27f53ba92e5af8348641401fa177cdafc534b490 --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/SearchResults.php @@ -0,0 +1,56 @@ +<?php +/** + * Customer Service Address Interface + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + + +use Magento\Customer\Service\V1\Dto\SearchCriteria; + +class SearchResults extends \Magento\Service\Entity\AbstractDto +{ + /** + * @return array + */ + public function getItems() + { + return $this->_get('items'); + } + + /** + * @return SearchCriteria + */ + public function getSearchCriteria() + { + return $this->_get('search_criteria'); + } + + /** + * @return int + */ + public function getTotalCount() + { + return $this->_get('total_count'); + } +} diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchResultsBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/SearchResultsBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..356703d11c54e49fb7522dd15a54518d5c4d482b --- /dev/null +++ b/app/code/Magento/Customer/Service/V1/Dto/SearchResultsBuilder.php @@ -0,0 +1,61 @@ +<?php +/** + * Customer Service Address Interface + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +use Magento\Customer\Service\V1\Dto\SearchCriteria; + +class SearchResultsBuilder extends \Magento\Service\Entity\AbstractDtoBuilder +{ + /** + * @param \Magento\Customer\Service\V1\Dto\SearchCriteria $searchCriteria + * + * @return SearchResultsBuilder + */ + public function setSearchCriteria(SearchCriteria $searchCriteria) + { + return $this->_set('search_criteria', $searchCriteria); + } + + /** + * @param int $totalCount + * + * @return SearchResultsBuilder + */ + public function setTotalCount($totalCount) + { + return $this->_set('total_count', $totalCount); + } + + /** + * @param array $items + * + * @return SearchResultsBuilder + */ + public function setItems($items) + { + return $this->_set('items', $items); + } +} diff --git a/app/code/Magento/Customer/etc/di.xml b/app/code/Magento/Customer/etc/di.xml index 95daf16f147a1ce500600fb7bf3cff4cc084cbb7..dfb7026534a0e9f723c0b35307557e52d4ba9366 100644 --- a/app/code/Magento/Customer/etc/di.xml +++ b/app/code/Magento/Customer/etc/di.xml @@ -24,6 +24,16 @@ */ --> <config> + <preference for="Magento\Customer\Service\V1\CustomerServiceInterface" + type="Magento\Customer\Service\V1\CustomerService" /> + <preference for="Magento\Customer\Service\V1\CustomerAddressServiceInterface" + type="Magento\Customer\Service\V1\CustomerAddressService" /> + <preference for="Magento\Customer\Service\V1\CustomerGroupServiceInterface" + type="Magento\Customer\Service\V1\CustomerGroupService" /> + <preference for="Magento\Customer\Service\V1\CustomerAccountServiceInterface" + type="Magento\Customer\Service\V1\CustomerAccountService" /> + <preference for="Magento\Customer\Service\V1\CustomerMetadataServiceInterface" + type="Magento\Customer\Service\V1\CustomerMetadataService" /> <type name="Magento\Customer\Model\Session"> <param name="configShare"> <instance type="Magento\Customer\Model\Config\Share\Proxy" /> @@ -60,4 +70,15 @@ <instance type="Magento\Customer\Helper\Data\Proxy" /> </param> </type> + <type name="Magento\Customer\Service\V1\Dto\AddressBuilder" shared="false" /> + <type name="Magento\Customer\Service\V1\Dto\CustomerBuilder" shared="false" /> + <type name="Magento\Customer\Service\V1\Dto\CustomerGroupBuilder" shared="false" /> + <type name="Magento\Customer\Service\V1\Dto\Eav\AttributeBuilder" shared="false" /> + <type name="Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder" shared="false" /> + <type name="Magento\Customer\Service\V1\Dto\Eav\OptionBuilder" shared="false" /> + <type name="Magento\Customer\Service\V1\Dto\FilterBuilder" shared="false" /> + <type name="Magento\Customer\Service\V1\Dto\RegionBuilder" shared="false" /> + <type name="Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder" shared="false" /> + <type name="Magento\Customer\Service\V1\Dto\SearchCriteriaBuilder" shared="false" /> + <type name="Magento\Customer\Service\V1\Dto\SearchResultsBuilder" shared="false" /> </config> diff --git a/app/code/Magento/Customer/etc/validation.xml b/app/code/Magento/Customer/etc/validation.xml index 6e0813f81bc2aaa27d227b0c6b0c83947ffe4ac7..9bd9094cc9a465d9147be8575998d71370788529 100644 --- a/app/code/Magento/Customer/etc/validation.xml +++ b/app/code/Magento/Customer/etc/validation.xml @@ -33,6 +33,11 @@ <constraint alias="eav_data_validator" class="Magento\Eav\Model\Validator\Attribute\Data" /> </entity_constraints> </rule> + <rule name="metadata_form_data"> + <entity_constraints> + <constraint alias="metadata_data_validator" class="Magento\Customer\Model\Metadata\Validator" /> + </entity_constraints> + </rule> </rules> <groups> <group name="save"> @@ -40,6 +45,11 @@ <use rule="check_eav"/> </uses> </group> + <group name="form"> + <uses> + <use rule="metadata_form_data"/> + </uses> + </group> </groups> </entity> diff --git a/app/code/Magento/Directory/Model/Currency/DefaultLocator.php b/app/code/Magento/Directory/Model/Currency/DefaultLocator.php index 65980fc452475c18ffd2603296f03afa22126946..c7293304413c9292871255c75fb190713b597137 100644 --- a/app/code/Magento/Directory/Model/Currency/DefaultLocator.php +++ b/app/code/Magento/Directory/Model/Currency/DefaultLocator.php @@ -63,7 +63,7 @@ class DefaultLocator $group = $request->getParam('group'); $currencyCode = $this->_app->getGroup($group)->getWebsite()->getBaseCurrencyCode(); } else { - $currencyCode = $this->_app->getStore()->getBaseCurrencyCode(); + $currencyCode = $this->_app->getBaseCurrencyCode(); } return $currencyCode; diff --git a/app/code/Magento/Eav/Model/Resource/Entity/Attribute/Collection.php b/app/code/Magento/Eav/Model/Resource/Entity/Attribute/Collection.php index 27de52a584350e036315e016ee1d72778c4ffb70..f9c2abcfecd8e6eece40b9b9e768ce90ec57b17f 100644 --- a/app/code/Magento/Eav/Model/Resource/Entity/Attribute/Collection.php +++ b/app/code/Magento/Eav/Model/Resource/Entity/Attribute/Collection.php @@ -135,7 +135,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl 'entity_attribute.attribute_id = main_table.attribute_id' ); $this->addFieldToFilter('entity_attribute.attribute_set_id', $setId); - $this->setOrder('sort_order', self::SORT_ORDER_ASC); + $this->setOrder('entity_attribute.sort_order', self::SORT_ORDER_ASC); } return $this; diff --git a/app/code/Magento/GiftMessage/view/adminhtml/sales/order/create/giftoptions.phtml b/app/code/Magento/GiftMessage/view/adminhtml/sales/order/create/giftoptions.phtml index 875818a9e24b1697281e995ab698094468338274..3525079772c20c177d0f0e2b3c431c833d415eec 100644 --- a/app/code/Magento/GiftMessage/view/adminhtml/sales/order/create/giftoptions.phtml +++ b/app/code/Magento/GiftMessage/view/adminhtml/sales/order/create/giftoptions.phtml @@ -31,7 +31,7 @@ <?php if ($_childHtml): ?> <tr class="border"> <td colspan="8"> - <a class="action-link" href="#" id="gift_options_link_<?php echo $_item->getId() ?>"><?php echo __('Gift Options') ?></a></strong> + <a class="action-link" href="#" id="gift_options_link_<?php echo $_item->getId() ?>"><?php echo __('Gift Options') ?></a> <script type="text/javascript"> giftOptionsTooltip.addTargetLink('gift_options_link_<?php echo $_item->getId() ?>', <?php echo $_item->getId() ?>); </script> diff --git a/app/code/Magento/GoogleShopping/Model/Observer.php b/app/code/Magento/GoogleShopping/Model/Observer.php index 44826071f98b32d62e28363dfe26832e6218446c..7a71ecaf6b78553e199a6bbedf6978d9d997bae5 100644 --- a/app/code/Magento/GoogleShopping/Model/Observer.php +++ b/app/code/Magento/GoogleShopping/Model/Observer.php @@ -165,13 +165,13 @@ class Observer */ public function checkSynchronizationOperations(\Magento\Event\Observer $observer) { - $flag = $this->_flag->loadSelf(); - if ($flag->isExpired()) { + $this->_flag->loadSelf(); + if ($this->_flag->isExpired()) { $this->_inboxFactory->create()->addMajor( __('Google Shopping operation has expired.'), __('One or more google shopping synchronization operations failed because of timeout.') ); - $flag->unlock(); + $this->_flag->unlock(); } return $this; } diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php index 770832a391450e7fdc239197e7ba0778d5b46ee6..1f423a0a46e9533554e6c85d9ad01fa28005d662 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php @@ -91,6 +91,7 @@ class Export extends \Magento\Backend\App\Action return $this->_fileFactory->create( $model->getFileName(), + \Magento\Filesystem::VAR_DIR, $model->export(), $model->getContentType() ); diff --git a/app/code/Magento/Install/view/install/page.phtml b/app/code/Magento/Install/view/install/page.phtml index 0869785b199e8a9105f97678541bb94f00baa6f9..60bd43b8308e796a66a7bd5e395445dfd7d59528 100644 --- a/app/code/Magento/Install/view/install/page.phtml +++ b/app/code/Magento/Install/view/install/page.phtml @@ -40,7 +40,7 @@ <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.js') ?>"></script> <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery-ui.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('head.load.min.js') ?>"></script> + <script type="text/javascript" src="<?php echo $this->getViewFileUrl('headjs/head.load.min.js') ?>"></script> <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/mage.js') ?>"></script> <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/translate.js') ?>"></script> diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber.php index 1016c5d79a8662484380a26964cf7ac6258eeb45..1735bdb1359e6277d745d0269591d988518b9f1b 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber.php @@ -82,7 +82,7 @@ class Subscriber extends \Magento\Backend\App\Action $fileName = 'subscribers.csv'; $content = $this->_view->getLayout()->getChildBlock('adminhtml.newslettrer.subscriber.grid', 'grid.export'); - return $this->_fileFactory->create($fileName, $content->getCsvFile($fileName)); + return $this->_fileFactory->create($fileName, $content->getCsvFile($fileName), \Magento\Filesystem::VAR_DIR); } /** @@ -93,7 +93,7 @@ class Subscriber extends \Magento\Backend\App\Action $this->_view->loadLayout(); $fileName = 'subscribers.xml'; $content = $this->_view->getLayout()->getChildBlock('adminhtml.newslettrer.subscriber.grid', 'grid.export'); - return $this->_fileFactory->create($fileName, $content->getExcelFile($fileName)); + return $this->_fileFactory->create($fileName, $content->getExcelFile($fileName), \Magento\Filesystem::VAR_DIR); } public function massUnsubscribeAction() diff --git a/app/code/Magento/Paygate/view/frontend/info/cc.phtml b/app/code/Magento/Paygate/view/frontend/info/cc.phtml index 5c722a71191d794149a78077679285ecfa13de9d..6d818bec2cabd0bf9478715adf3b436d83e86ad8 100644 --- a/app/code/Magento/Paygate/view/frontend/info/cc.phtml +++ b/app/code/Magento/Paygate/view/frontend/info/cc.phtml @@ -27,30 +27,28 @@ <?php if (!$this->getHideTitle()): ?> <p><strong><?php echo $this->escapeHtml($this->getMethod()->getTitle()) ?></strong></p> -<?php endif;?> +<?php endif; ?> <?php $cards = $this->getCards(); $showCount = count($cards) > 1; ?> -<dl class="cards-list"> +<dl class="cards items"> <?php foreach ($cards as $key => $card): ?> + <?php if ($showCount): ?> <dt><?php echo sprintf(__('Credit Card %s'), $key + 1); ?></dt> - <?php endif;?> + <?php endif; ?> - <dd <?php if ($showCount):?> class="offset"<?php endif;?>> - <table class="info-table"> - <tbody> - <?php foreach ($card as $_label => $_value):?> - <tr> - <th><?php echo $this->escapeHtml($_label)?>:</th> - <td><?php echo nl2br(implode($this->getValueAsArray($_value, true), "\n"))?></td> - </tr> + <dd> + <dl class="card item"> + <?php foreach ($card as $_label => $_value): ?> + <dt><?php echo $this->escapeHtml($_label); ?>:</dt> + <dd><?php echo nl2br(implode($this->getValueAsArray($_value, true), "\n")); ?></dd> <?php endforeach; ?> - </tbody> - </table> + </dl> </dd> + <?php endforeach; ?> </dl> diff --git a/app/code/Magento/Payment/view/adminhtml/form/cc.phtml b/app/code/Magento/Payment/view/adminhtml/form/cc.phtml index 740d205c29e2618d70d9618ff3cf0b90e8e69db4..a959fe651697589bbccb3985e587fc2eaef6dfe7 100644 --- a/app/code/Magento/Payment/view/adminhtml/form/cc.phtml +++ b/app/code/Magento/Payment/view/adminhtml/form/cc.phtml @@ -25,93 +25,95 @@ */ ?> <?php $_code=$this->getMethodCode() ?> -<ul id="payment_form_<?php echo $_code ?>" style="display:none"> - <li> - <div class="input-box"> - <label for="<?php echo $_code ?>_cc_type"><?php echo __('Credit Card Type') ?> <span class="required">*</span></label><br/> +<fieldset class="fieldset payment method" id="payment_form_<?php echo $_code ?>" style="display:none"> + <div class="field field-type required"> + <label class="label" for="<?php echo $_code ?>_cc_type"><span><?php echo __('Credit Card Type') ?></span></label> + <div class="control"> <select id="<?php echo $_code ?>_cc_type" name="payment[cc_type]" class="required-entry validate-cc-type-select"> - <?php $_ccType = $this->getInfoData('cc_type') ?> + <?php $_ccType = $this->getInfoData('cc_type') ?> <option value=""></option> - <?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?> - <option value="<?php echo $_typeCode ?>" <?php if($_typeCode==$_ccType): ?>selected="selected"<?php endif ?>><?php echo $_typeName ?></option> - <?php endforeach ?> + <?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?> + <option value="<?php echo $_typeCode ?>" <?php if($_typeCode==$_ccType): ?>selected="selected"<?php endif ?>><?php echo $_typeName ?></option> + <?php endforeach ?> </select> </div> - </li> - <li> - <div class="input-box"> - <label for="<?php echo $_code ?>_cc_number"><?php echo __('Credit Card Number') ?> <span class="required">*</span></label><br/> + </div> + <div class="field field-number required"> + <label class="label" for="<?php echo $_code ?>_cc_number"><span><?php echo __('Credit Card Number') ?></span></label> + <div class="control"> <input type="text" id="<?php echo $_code ?>_cc_number" name="payment[cc_number]" title="<?php echo __('Credit Card Number') ?>" class="input-text validate-cc-number" value="<?php echo $this->getInfoData('cc_number')?>"/> </div> - </li> - <li> - <div class="input-box"> - <label for="<?php echo $_code ?>_expiration"><?php echo __('Expiration Date') ?> <span class="required">*</span></label><br/> + </div> + <div class="field field-date required"> + <label class="label" for="<?php echo $_code ?>_expiration"><span><?php echo __('Expiration Date') ?></span></label> + <div class="control"> <select id="<?php echo $_code ?>_expiration" style="width:140px;" name="payment[cc_exp_month]" class="validate-cc-exp required-entry"> - <?php $_ccExpMonth = $this->getInfoData('cc_exp_month') ?> - <?php foreach ($this->getCcMonths() as $k=>$v): ?> - <option value="<?php echo $k ?>" <?php if($k==$_ccExpMonth): ?>selected="selected"<?php endif ?>><?php echo $v ?></option> - <?php endforeach ?> + <?php $_ccExpMonth = $this->getInfoData('cc_exp_month') ?> + <?php foreach ($this->getCcMonths() as $k=>$v): ?> + <option value="<?php echo $k ?>" <?php if($k==$_ccExpMonth): ?>selected="selected"<?php endif ?>><?php echo $v ?></option> + <?php endforeach ?> </select> <?php $_ccExpYear = $this->getInfoData('cc_exp_year') ?> <select id="<?php echo $_code ?>_expiration_yr" style="width:103px;" name="payment[cc_exp_year]" class="required-entry"> - <?php foreach ($this->getCcYears() as $k=>$v): ?> - <option value="<?php echo $k ? $k : '' ?>" <?php if($k==$_ccExpYear): ?>selected="selected"<?php endif ?>><?php echo $v ?></option> - <?php endforeach ?> + <?php foreach ($this->getCcYears() as $k=>$v): ?> + <option value="<?php echo $k ? $k : '' ?>" <?php if($k==$_ccExpYear): ?>selected="selected"<?php endif ?>><?php echo $v ?></option> + <?php endforeach ?> </select> </div> - </li> + </div> + <?php if($this->hasVerification()): ?> - <li> - <div class="input-box"> - <label for="<?php echo $_code ?>_cc_cid"><?php echo __('Card Verification Number') ?> <span class="required">*</span></label><br/> - <input type="text" title="<?php echo __('Card Verification Number') ?>" class="required-entry input-text validate-cc-cvn" id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" style="width:3em;" value="<?php echo $this->getInfoData('cc_cid')?>"/> + <div class="field field-number required"> + <label class="label" for="<?php echo $_code ?>_cc_cid"><span><?php echo __('Card Verification Number') ?></span></label> + <div class="control"> + <input type="text" title="<?php echo __('Card Verification Number') ?>" class="required-entry input-text validate-cc-cvn" id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" style="width:3em;" value="<?php echo $this->getInfoData('cc_cid')?>"/> + </div> </div> - </li> <?php endif; ?> <?php if ($this->hasSsCardType()): ?> - <li id="<?php echo $_code ?>_cc_type_ss_div"> - <ul class="inner-form"> - <li class="form-alt"><label for="<?php echo $_code ?>_cc_issue" class="required"><em>*</em><?php echo __('Switch/Solo/Maestro Only') ?></label></li> - <li> - <label for="<?php echo $_code ?>_cc_issue"><?php echo __('Issue Number') ?>:</label> - <span class="input-box"> + <div id="<?php echo $_code ?>_cc_type_ss_div"> + <div class="field field-type required"> + <label class="label" for="<?php echo $_code ?>_cc_issue"><span><?php echo __('Switch/Solo/Maestro Only') ?></span></label> + </div> + <div class="field field-issue"> + <label class="label" for="<?php echo $_code ?>_cc_issue"><span><?php echo __('Issue Number') ?>:</span></label> + <div class="control"> <input type="text" title="<?php echo __('Issue Number') ?>" class="input-text validate-cc-ukss cvv" id="<?php echo $_code ?>_cc_issue" name="payment[cc_ss_issue]" value="" /> - </span> - </li> - - <li> - <label for="<?php echo $_code ?>_start_month"><?php echo __('Start Date') ?>:</label> - <div class="input-box"> - <select id="<?php echo $_code ?>_start_month" name="payment[cc_ss_start_month]" class="validate-cc-ukss month"> + </div> + </div> + <div class="field field-date"> + <label class="label" for="<?php echo $_code ?>_start_month"><span><?php echo __('Start Date') ?>:</span></label> + <div class="control"> + <select id="<?php echo $_code ?>_start_month" name="payment[cc_ss_start_month]" class="validate-cc-ukss month"> <?php foreach ($this->getCcMonths() as $k=>$v): ?> <option value="<?php echo $k?$k:'' ?>"<?php if($k==$this->getInfoData('cc_ss_start_month')): ?> selected="selected"<?php endif ?>><?php echo $v ?></option> <?php endforeach ?> - </select> - <select id="<?php echo $_code ?>_start_year" name="payment[cc_ss_start_year]" class="validate-cc-ukss year"> + </select> + <select id="<?php echo $_code ?>_start_year" name="payment[cc_ss_start_year]" class="validate-cc-ukss year"> <?php foreach ($this->getSsStartYears() as $k=>$v): ?> <option value="<?php echo $k?$k:'' ?>"<?php if($k==$this->getInfoData('cc_ss_start_year')): ?> selected="selected"<?php endif ?>><?php echo $v ?></option> <?php endforeach ?> - </select> + </select> </div> - </li> - <li class="adv-container"> </li> - </ul> - <script type="text/javascript"> - //<![CDATA[ - var SSChecked<?php echo $_code ?> = function() { - var elm = $('<?php echo $_code ?>_cc_type'); - if (['SS','SM','SO'].indexOf(elm.value) != -1) { - $('<?php echo $_code ?>_cc_type_ss_div').show(); - } else { - $('<?php echo $_code ?>_cc_type_ss_div').hide(); - } - }; - Event.observe($('<?php echo $_code ?>_cc_type'), 'change', SSChecked<?php echo $_code ?>); - SSChecked<?php echo $_code ?>(); - //]]> - </script> - </li> + </div> + + <div class="adv-container"> </div> + + <script type="text/javascript"> + //<![CDATA[ + var SSChecked<?php echo $_code ?> = function() { + var elm = $('<?php echo $_code ?>_cc_type'); + if (['SS','SM','SO'].indexOf(elm.value) != -1) { + $('<?php echo $_code ?>_cc_type_ss_div').show(); + } else { + $('<?php echo $_code ?>_cc_type_ss_div').hide(); + } + }; + Event.observe($('<?php echo $_code ?>_cc_type'), 'change', SSChecked<?php echo $_code ?>); + SSChecked<?php echo $_code ?>(); + //]]> + </script> + </div> <?php endif; ?> -</ul> +</fieldset> diff --git a/app/code/Magento/Payment/view/adminhtml/form/ccsave.phtml b/app/code/Magento/Payment/view/adminhtml/form/ccsave.phtml index 02ed20f1d74647a73827ca6f82433c88cce8e42e..f6d632f930b6732e2255a1cd30b07906fdac166e 100644 --- a/app/code/Magento/Payment/view/adminhtml/form/ccsave.phtml +++ b/app/code/Magento/Payment/view/adminhtml/form/ccsave.phtml @@ -25,98 +25,106 @@ */ ?> <?php $_code=$this->getMethodCode() ?> -<ul id="payment_form_<?php echo $_code ?>" style="display:none"> - <li> - <div class="input-box"> - <label for="<?php echo $_code ?>_cc_owner"><?php echo __('Name on Card') ?> <span class="required">*</span></label><br/> +<fieldset class="fieldset payment method" id="payment_form_<?php echo $_code ?>" style="display:none"> + <div class="field field-name required"> + <label class="label" for="<?php echo $_code ?>_cc_owner"><span><?php echo __('Name on Card') ?></span></label> + <div class="control"> <input type="text" title="<?php echo __('Name on Card') ?>" class="required-entry input-text" id="<?php echo $_code ?>_cc_owner" name="payment[cc_owner]" value="<?php echo $this->getInfoData('cc_owner') ?>"/> </div> - </li> - <li> - <div class="input-box"> - <label for="<?php echo $_code ?>_cc_type"><?php echo __('Credit Card Type') ?> <span class="required">*</span></label><br/> + </div> + + <div class="field field-type required"> + <label class="label" for="<?php echo $_code ?>_cc_type"><span><?php echo __('Credit Card Type') ?></span></label> + <div class="control"> <select id="<?php echo $_code ?>_cc_type" name="payment[cc_type]" class="required-entry validate-cc-type-select"> - <?php $_ccType = $this->getInfoData('cc_type') ?> + <?php $_ccType = $this->getInfoData('cc_type') ?> <option value=""></option> - <?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?> - <option value="<?php echo $_typeCode ?>" <?php if($_typeCode==$_ccType): ?>selected="selected"<?php endif ?>><?php echo $_typeName ?></option> - <?php endforeach ?> + <?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?> + <option value="<?php echo $_typeCode ?>" <?php if($_typeCode==$_ccType): ?>selected="selected"<?php endif ?>><?php echo $_typeName ?></option> + <?php endforeach ?> </select> </div> - </li> - <li> - <div class="input-box"> - <label for="<?php echo $_code ?>_cc_number"><?php echo __('Credit Card Number') ?> <span class="required">*</span></label><br/> + </div> + + <div class="field field-number required"> + <label class="label" for="<?php echo $_code ?>_cc_number"><span><?php echo __('Credit Card Number') ?></span></label> + <div class="control"> <input type="text" id="<?php echo $_code ?>_cc_number" name="payment[cc_number]" title="<?php echo __('Credit Card Number') ?>" class="input-text validate-cc-number" value="<?php echo $this->getInfoData('cc_number')?>"/> </div> - </li> - <li> - <div class="input-box"> - <label for="<?php echo $_code ?>_expiration"><?php echo __('Expiration Date') ?> <span class="required">*</span></label><br/> + </div> + + <div class="field field-date required"> + <label class="label" for="<?php echo $_code ?>_expiration"><span><?php echo __('Expiration Date') ?></span></label> + <div class="control"> <select id="<?php echo $_code ?>_expiration" style="width:140px;" name="payment[cc_exp_month]" class="validate-cc-exp required-entry"> - <?php $_ccExpMonth = $this->getInfoData('cc_exp_month') ?> - <?php foreach ($this->getCcMonths() as $k=>$v): ?> - <option value="<?php echo $k ?>" <?php if($k==$_ccExpMonth): ?>selected="selected"<?php endif ?>><?php echo $v ?></option> - <?php endforeach ?> + <?php $_ccExpMonth = $this->getInfoData('cc_exp_month') ?> + <?php foreach ($this->getCcMonths() as $k=>$v): ?> + <option value="<?php echo $k ?>" <?php if($k==$_ccExpMonth): ?>selected="selected"<?php endif ?>><?php echo $v ?></option> + <?php endforeach ?> </select> <?php $_ccExpYear = $this->getInfoData('cc_exp_year') ?> <select id="<?php echo $_code ?>_expiration_yr" style="width:103px;" name="payment[cc_exp_year]" class="required-entry"> - <?php foreach ($this->getCcYears() as $k=>$v): ?> - <option value="<?php echo $k ? $k : '' ?>" <?php if($k==$_ccExpYear): ?>selected="selected"<?php endif ?>><?php echo $v ?></option> - <?php endforeach ?> + <?php foreach ($this->getCcYears() as $k=>$v): ?> + <option value="<?php echo $k ? $k : '' ?>" <?php if($k==$_ccExpYear): ?>selected="selected"<?php endif ?>><?php echo $v ?></option> + <?php endforeach ?> </select> </div> - </li> + </div> + <?php if($this->hasVerification()): ?> - <li> - <div class="input-box"> - <label for="<?php echo $_code ?>_cc_cid"><?php echo __('Card Verification Number') ?> <span class="required">*</span></label><br/> - <input type="text" title="<?php echo __('Card Verification Number') ?>" class="required-entry input-text validate-cc-cvn" id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" style="width:3em;" value="<?php echo $this->getInfoData('cc_cid')?>"/> + <div class="field field-number required"> + <label class="label" for="<?php echo $_code ?>_cc_cid"><span><?php echo __('Card Verification Number') ?></span></label> + <div class="control"> + <input type="text" title="<?php echo __('Card Verification Number') ?>" class="required-entry input-text validate-cc-cvn" id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" style="width:3em;" value="<?php echo $this->getInfoData('cc_cid')?>"/> + </div> </div> - </li> <?php endif; ?> + <?php if ($this->hasSsCardType()): ?> - <li id="<?php echo $_code ?>_cc_type_ss_div"> - <ul class="inner-form"> - <li class="form-alt"><label for="<?php echo $_code ?>_cc_issue" class="required"><em>*</em><?php echo __('Switch/Solo/Maestro Only') ?></label></li> - <li> - <label for="<?php echo $_code ?>_cc_issue"><?php echo __('Issue Number') ?>:</label> - <span class="input-box"> + <div id="<?php echo $_code ?>_cc_type_ss_div"> + <div class="field field-type required"> + <label for="<?php echo $_code ?>_cc_issue"><span><?php echo __('Switch/Solo/Maestro Only') ?></span></label> + </div> + + <div class="field field-issue"> + <label class="label" for="<?php echo $_code ?>_cc_issue"><span><?php echo __('Issue Number') ?>:</span></label> + <div class="control"> <input type="text" title="<?php echo __('Issue Number') ?>" class="input-text validate-cc-ukss cvv" id="<?php echo $_code ?>_cc_issue" name="payment[cc_ss_issue]" value="" /> - </span> - </li> + </div> + </div> - <li> - <label for="<?php echo $_code ?>_start_month"><?php echo __('Start Date') ?>:</label> - <div class="input-box"> - <select id="<?php echo $_code ?>_start_month" name="payment[cc_ss_start_month]" class="validate-cc-ukss month"> + <div class="field field-date"> + <label class="label" for="<?php echo $_code ?>_start_month"><span><?php echo __('Start Date') ?>:</span></label> + <div class="control"> + <select id="<?php echo $_code ?>_start_month" name="payment[cc_ss_start_month]" class="validate-cc-ukss month"> <?php foreach ($this->getCcMonths() as $k=>$v): ?> <option value="<?php echo $k?$k:'' ?>"<?php if($k==$this->getInfoData('cc_ss_start_month')): ?> selected="selected"<?php endif ?>><?php echo $v ?></option> <?php endforeach ?> - </select> - <select id="<?php echo $_code ?>_start_year" name="payment[cc_ss_start_year]" class="validate-cc-ukss year"> + </select> + <select id="<?php echo $_code ?>_start_year" name="payment[cc_ss_start_year]" class="validate-cc-ukss year"> <?php foreach ($this->getSsStartYears() as $k=>$v): ?> <option value="<?php echo $k?$k:'' ?>"<?php if($k==$this->getInfoData('cc_ss_start_year')): ?> selected="selected"<?php endif ?>><?php echo $v ?></option> <?php endforeach ?> - </select> + </select> </div> - </li> - <li class="adv-container"> </li> - </ul> - <script type="text/javascript"> - //<![CDATA[ - var SSChecked<?php echo $_code ?> = function() { - var elm = $('<?php echo $_code ?>_cc_type'); - if (['SS','SM','SO'].indexOf(elm.value) != -1) { - $('<?php echo $_code ?>_cc_type_ss_div').show(); - } else { - $('<?php echo $_code ?>_cc_type_ss_div').hide(); - } - }; - Event.observe($('<?php echo $_code ?>_cc_type'), 'change', SSChecked<?php echo $_code ?>); - SSChecked<?php echo $_code ?>(); - //]]> - </script> - </li> + </div> + + <div class="adv-container"> </div> + + <script type="text/javascript"> + //<![CDATA[ + var SSChecked<?php echo $_code ?> = function() { + var elm = $('<?php echo $_code ?>_cc_type'); + if (['SS','SM','SO'].indexOf(elm.value) != -1) { + $('<?php echo $_code ?>_cc_type_ss_div').show(); + } else { + $('<?php echo $_code ?>_cc_type_ss_div').hide(); + } + }; + Event.observe($('<?php echo $_code ?>_cc_type'), 'change', SSChecked<?php echo $_code ?>); + SSChecked<?php echo $_code ?>(); + //]]> + </script> + </div> <?php endif; ?> -</ul> +</fieldset> diff --git a/app/code/Magento/Payment/view/adminhtml/form/checkmo.phtml b/app/code/Magento/Payment/view/adminhtml/form/checkmo.phtml index e4d1417abdf5567822f0e6a0ae62a78bda38d637..9f5d0cc4517fd21b32069b878a63993158381ab1 100644 --- a/app/code/Magento/Payment/view/adminhtml/form/checkmo.phtml +++ b/app/code/Magento/Payment/view/adminhtml/form/checkmo.phtml @@ -24,18 +24,16 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<ul id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none"> - <li> - <div class="input-box"> - <?php if ($this->getMethod()->getPayableTo()): ?> - <?php echo __('<label>Make Check payable to:</label> %1', $this->escapeHtml($this->getMethod()->getPayableTo())) ?><br /> - <?php endif; ?> - <?php if ($this->getMethod()->getMailingAddress()): ?> - <label><?php echo __('Send Check to:') ?></label> - <div class="checkmo-mailing-address"> - <?php echo nl2br($this->escapeHtml($this->getMethod()->getMailingAddress())) ?> - </div> - <?php endif; ?> +<fieldset class="fieldset payment method" id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none"> + <?php if ($this->getMethod()->getPayableTo()): ?> + <?php echo __('<label class="label"><span>Make Check payable to:</span></label> %1', $this->escapeHtml($this->getMethod()->getPayableTo())) ?> + <?php endif; ?> + <?php if ($this->getMethod()->getMailingAddress()): ?> + <div class="field field-check"> + <label class="label"><span><?php echo __('Send Check to:') ?></span></label> + <div class="control checkmo-mailing-address"> + <?php echo nl2br($this->escapeHtml($this->getMethod()->getMailingAddress())) ?> + </div> </div> - </li> -</ul> + <?php endif; ?> +</fieldset> diff --git a/app/code/Magento/Payment/view/adminhtml/form/purchaseorder.phtml b/app/code/Magento/Payment/view/adminhtml/form/purchaseorder.phtml index 907cff225fd257e716f8add2b328c3fca38e942f..51675035d87ff5b3e7b5a80205890da6b3f61cc0 100644 --- a/app/code/Magento/Payment/view/adminhtml/form/purchaseorder.phtml +++ b/app/code/Magento/Payment/view/adminhtml/form/purchaseorder.phtml @@ -24,11 +24,11 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<ul id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none"> - <li> - <div class="input-box"> - <label for="po_number"><?php echo __('Purchase Order Number') ?> <span class="required">*</span></label><br/> +<fieldset class="fieldset payment method" id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none"> + <div class="field field-number required"> + <label for="po_number" class="label"><span><?php echo __('Purchase Order Number') ?></span></label> + <div class="control"> <input type="text" id="po_number" name="payment[po_number]" title="<?php echo __("Purchase Order Number") ?>" class="required-entry input-text" value="<?php echo $this->getInfoData('po_number') ?>"/> </div> - </li> -</ul> + </div> +</fieldset> \ No newline at end of file diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Index.php b/app/code/Magento/Reports/Controller/Adminhtml/Index.php index 3b320b9e8ee6c7254540d13aa45a3d84bcd71a6b..bfe3bf7a9bccf34693ce194729b7d9098b9ee215 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Index.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Index.php @@ -79,7 +79,7 @@ class Index extends \Magento\Backend\App\Action { $this->_view->loadLayout(false); $content = $this->_view->getLayout()->getChildBlock('adminhtml.report.search.grid', 'grid.export'); - return $this->_fileFactory->create('search.csv', $content->getCsvFile()); + return $this->_fileFactory->create('search.csv', $content->getCsvFile(), \Magento\Filesystem::VAR_DIR); } /** @@ -89,7 +89,7 @@ class Index extends \Magento\Backend\App\Action { $this->_view->loadLayout(false); $content = $this->_view->getLayout()->getChildBlock('adminhtml.report.search.grid', 'grid.export'); - return $this->_fileFactory->create('search.xml', $content->getExcelFile()); + return $this->_fileFactory->create('search.xml', $content->getExcelFile(), \Magento\Filesystem::VAR_DIR); } protected function _isAllowed() diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer.php index 0edf0e421c85756815ac0d65962bcfc581677e1b..84a840000f8947647c595bc60d8d9875735b2de0 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer.php @@ -94,7 +94,7 @@ class Customer extends \Magento\Backend\App\Action $fileName = 'new_accounts.csv'; /** @var \Magento\Backend\Block\Widget\Grid\ExportInterface $exportBlock */ $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.report.grid', 'grid.export'); - return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile()); + return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile(), \Magento\Filesystem::VAR_DIR); } /** @@ -106,7 +106,11 @@ class Customer extends \Magento\Backend\App\Action $fileName = 'new_accounts.xml'; /** @var \Magento\Backend\Block\Widget\Grid\ExportInterface $exportBlock */ $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.report.grid', 'grid.export'); - return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile($fileName)); + return $this->_fileFactory->create( + $fileName, + $exportBlock->getExcelFile($fileName), + \Magento\Filesystem::VAR_DIR + ); } public function ordersAction() diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review.php index 6ef34439d8cc919986c4c4efc2df7ef0cf2d41d4..91d9307fed24da63d85092cd84ad97cc71cdece6 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review.php @@ -86,8 +86,10 @@ class Review extends \Magento\Backend\App\Action { $this->_view->loadLayout(false); $fileName = 'review_customer.csv'; - $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.block.report.review.customer.grid','grid.export'); - return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile()); + $exportBlock = $this->_view + ->getLayout() + ->getChildBlock('adminhtml.block.report.review.customer.grid', 'grid.export'); + return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile(), \Magento\Filesystem::VAR_DIR); } /** @@ -97,8 +99,10 @@ class Review extends \Magento\Backend\App\Action { $this->_view->loadLayout(false); $fileName = 'review_customer.xml'; - $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.block.report.review.customer.grid','grid.export'); - return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile()); + $exportBlock = $this->_view + ->getLayout() + ->getChildBlock('adminhtml.block.report.review.customer.grid', 'grid.export'); + return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile(), \Magento\Filesystem::VAR_DIR); } @@ -109,9 +113,9 @@ class Review extends \Magento\Backend\App\Action $this->_initAction() ->_setActiveMenu('Magento_Review::report_review_product') ->_addBreadcrumb( - __('Products Report'), - __('Products Report') - ); + __('Products Report'), + __('Products Report') + ); $this->_view->renderLayout(); } @@ -122,8 +126,10 @@ class Review extends \Magento\Backend\App\Action { $this->_view->loadLayout(false); $fileName = 'review_product.csv'; - $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.block.report.review.product.grid','grid.export'); - return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile()); + $exportBlock = $this->_view + ->getLayout() + ->getChildBlock('adminhtml.block.report.review.product.grid', 'grid.export'); + return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile(), \Magento\Filesystem::VAR_DIR); } /** @@ -133,8 +139,10 @@ class Review extends \Magento\Backend\App\Action { $this->_view->loadLayout(false); $fileName = 'review_product.xml'; - $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.block.report.review.product.grid','grid.export'); - return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile()); + $exportBlock = $this->_view + ->getLayout() + ->getChildBlock('adminhtml.block.report.review.product.grid', 'grid.export'); + return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile(), \Magento\Filesystem::VAR_DIR); } public function productDetailAction() @@ -160,7 +168,7 @@ class Review extends \Magento\Backend\App\Action $content = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Review\Detail\Grid') ->getCsv(); - return $this->_fileFactory->create($fileName, $content); + return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR); } /** @@ -172,7 +180,7 @@ class Review extends \Magento\Backend\App\Action $content = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Review\Detail\Grid') ->getExcel($fileName); - return $this->_fileFactory->create($fileName, $content); + return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR); } protected function _isAllowed() diff --git a/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php b/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php index 9ebf45ed5554175db9463cda31f91356518d6d6b..be5030fb15657a2757fa579ebd557862afd675c1 100644 --- a/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php +++ b/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php @@ -185,8 +185,6 @@ class AbstractCollection extends \Magento\Core\Model\Resource\Db\Collection\Abst $nullCheck = true; } - $storeIds[0] = ($storeIds[0] == '') ? 0 : $storeIds[0]; - if ($nullCheck) { $select->where('store_id IN(?) OR store_id IS NULL', $storeIds); } else { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo.php index 18092ade67288aa7604a1b2c624c3e739dcef46c..9b703cfebe4409c166b937f87e6b85d4e679c80f 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo.php @@ -124,11 +124,16 @@ class AbstractCreditmemo extends \Magento\Backend\App\Action $pdf = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Creditmemo')->getPdf($invoices); } else { $pages = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Creditmemo')->getPdf($invoices); - $pdf->pages = array_merge ($pdf->pages, $pages->pages); + $pdf->pages = array_merge($pdf->pages, $pages->pages); } $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s'); - return $this->_fileFactory->create('creditmemo' . $date . '.pdf', $pdf->render(), 'application/pdf'); + return $this->_fileFactory->create( + 'creditmemo' . $date . '.pdf', + $pdf->render(), + \Magento\Filesystem::VAR_DIR, + 'application/pdf' + ); } $this->_redirect('sales/*/'); } @@ -143,7 +148,12 @@ class AbstractCreditmemo extends \Magento\Backend\App\Action $pdf = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Creditmemo') ->getPdf(array($creditmemo)); $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s'); - return $this->_fileFactory->create('creditmemo' . $date . '.pdf', $pdf->render(), 'application/pdf'); + return $this->_fileFactory->create( + 'creditmemo' . $date . '.pdf', + $pdf->render(), + \Magento\Filesystem::VAR_DIR, + 'application/pdf' + ); } } else { $this->_forward('noroute'); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice.php b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice.php index ff57034fb879fd92092d7ae1807f1bb0c44150ba..282aa1dc44e03e1d2d0145b3fd454b909fbfe695 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice.php @@ -130,7 +130,12 @@ class AbstractInvoice if ($invoice) { $pdf = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Invoice')->getPdf(array($invoice)); $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s'); - return $this->_fileFactory->create('invoice' . $date . '.pdf', $pdf->render(), 'application/pdf'); + return $this->_fileFactory->create( + 'invoice' . $date . '.pdf', + $pdf->render(), + \Magento\Filesystem::VAR_DIR, + 'application/pdf' + ); } } else { $this->_forward('noroute'); @@ -153,7 +158,12 @@ class AbstractInvoice } $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s'); - return $this->_fileFactory->create('invoice' . $date . '.pdf', $pdf->render(), 'application/pdf'); + return $this->_fileFactory->create( + 'invoice' . $date . '.pdf', + $pdf->render(), + \Magento\Filesystem::VAR_DIR, + 'application/pdf' + ); } $this->_redirect('sales/*/'); } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order.php b/app/code/Magento/Sales/Controller/Adminhtml/Order.php index d1849e99f048c6344103576d162517d3e707b712..e580e81b29eaa239b68cdc0406086cf86edbbb9c 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order.php @@ -62,7 +62,7 @@ class Order extends \Magento\Backend\App\Action protected $_translator; /** - * @param \Magento\Backend\App\Action\Context $context + * @param Action\Context $context * @param \Magento\Core\Model\Registry $coreRegistry * @param \Magento\App\Response\Http\FileFactory $fileFactory * @param \Magento\Core\Model\Translate $translator @@ -529,6 +529,7 @@ class Order extends \Magento\Backend\App\Action return $this->_fileFactory->create( 'invoice' . $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s') . '.pdf', $pdf->render(), + \Magento\Filesystem::VAR_DIR, 'application/pdf' ); } else { @@ -567,6 +568,7 @@ class Order extends \Magento\Backend\App\Action return $this->_fileFactory->create( 'packingslip' . $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s') . '.pdf', $pdf->render(), + \Magento\Filesystem::VAR_DIR, 'application/pdf' ); } else { @@ -605,6 +607,7 @@ class Order extends \Magento\Backend\App\Action return $this->_fileFactory->create( 'creditmemo' . $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s') . '.pdf', $pdf->render(), + \Magento\Filesystem::VAR_DIR, 'application/pdf' ); } else { @@ -669,6 +672,7 @@ class Order extends \Magento\Backend\App\Action return $this->_fileFactory->create( 'docs' . $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s') . '.pdf', $pdf->render(), + \Magento\Filesystem::VAR_DIR, 'application/pdf' ); } else { @@ -757,7 +761,7 @@ class Order extends \Magento\Backend\App\Action $fileName = 'orders.csv'; /** @var \Magento\Backend\Block\Widget\Grid\ExportInterface $exportBlock */ $exportBlock = $this->_view->getLayout()->getChildBlock('sales.order.grid', 'grid.export'); - return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile()); + return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile(), \Magento\Filesystem::VAR_DIR); } /** @@ -769,7 +773,11 @@ class Order extends \Magento\Backend\App\Action $fileName = 'orders.xml'; /** @var \Magento\Backend\Block\Widget\Grid\ExportInterface $exportBlock */ $exportBlock = $this->_view->getLayout()->getChildBlock('sales.order.grid', 'grid.export'); - return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile($fileName)); + return $this->_fileFactory->create( + $fileName, + $exportBlock->getExcelFile($fileName), + \Magento\Filesystem::VAR_DIR + ); } /** diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipment.php index 5514f6a2ef7a0b0c07ff9ab802072824ed75842a..051f034840df5e2e4dea29257cb9a76406706818 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipment.php @@ -584,6 +584,7 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip return $this->_fileFactory->create( 'ShippingLabel(' . $shipment->getIncrementId() . ').pdf', $pdfContent, + \Magento\Filesystem::VAR_DIR, 'application/pdf' ); } @@ -612,6 +613,7 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip return $this->_fileFactory->create( 'packingslip' . $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s') . '.pdf', $pdf->render(), + \Magento\Filesystem::VAR_DIR, 'application/pdf' ); } else { @@ -662,7 +664,12 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip if (!empty($labelsContent)) { $outputPdf = $this->_combineLabelsPdf($labelsContent); - return $this->_fileFactory->create('ShippingLabels.pdf', $outputPdf->render(), 'application/pdf'); + return $this->_fileFactory->create( + 'ShippingLabels.pdf', + $outputPdf->render(), + \Magento\Filesystem::VAR_DIR, + 'application/pdf' + ); } if ($createdFromOrders) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment.php b/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment.php index c30f0fecdc1c2fa570f2138967ad936d1cff8cf2..15456ce7a7eaa4d28a3cfe8775a27122c53d41da 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment.php @@ -99,10 +99,15 @@ class AbstractShipment extends \Magento\Backend\App\Action $pdf = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Shipment')->getPdf($shipments); } else { $pages = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Shipment')->getPdf($shipments); - $pdf->pages = array_merge ($pdf->pages, $pages->pages); + $pdf->pages = array_merge($pdf->pages, $pages->pages); } $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s'); - return $this->_fileFactory->create('packingslip' . $date . '.pdf', $pdf->render(), 'application/pdf'); + return $this->_fileFactory->create( + 'packingslip' . $date . '.pdf', + $pdf->render(), + \Magento\Filesystem::VAR_DIR, + 'application/pdf' + ); } $this->_redirect('sales/*/'); } @@ -118,7 +123,10 @@ class AbstractShipment extends \Magento\Backend\App\Action ->getPdf(array($shipment)); $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s'); return $this->_fileFactory->create( - 'packingslip' . $date . '.pdf', $pdf->render(), 'application/pdf' + 'packingslip' . $date . '.pdf', + $pdf->render(), + \Magento\Filesystem::VAR_DIR, + 'application/pdf' ); } } else { diff --git a/app/code/Magento/Sales/Controller/Download.php b/app/code/Magento/Sales/Controller/Download.php index 9753e8f62a77d7bd25c47bafffe77df3d4005bc6..14c38e37d5fc5facfa7b0729a6c3ac8271f45fd2 100644 --- a/app/code/Magento/Sales/Controller/Download.php +++ b/app/code/Magento/Sales/Controller/Download.php @@ -93,10 +93,14 @@ class Download extends \Magento\App\Action\Action throw new \Exception(); } } - $this->_fileResponseFactory->create($info['title'], array( - 'value' => $filePath, - 'type' => 'filename' - )); + $this->_fileResponseFactory->create( + $info['title'], + array( + 'value' => $filePath, + 'type' => 'filename' + ), + \Magento\Filesystem::ROOT + ); } catch (\Exception $e) { $this->_forward('noroute'); } diff --git a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/form.phtml b/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/form.phtml index d55a002445a2a3f460a2ab23e3105a7b508f30b3..10a7347f03ff5805aeda481961cfd3d4734a7677 100644 --- a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/form.phtml +++ b/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/form.phtml @@ -27,13 +27,19 @@ <form id="edit_form" method="post" action="<?php echo $this->getSaveUrl() ?>"> <?php echo $this->getBlockHtml('formkey')?> <?php $_order = $this->getCreditmemo()->getOrder() ?> + <?php echo $this->getChildHtml('order_info') ?> + + <?php if (!$_order->getIsVirtual()): ?> <div class="clearfix"> + <?php endif; ?> + <?php if (!$_order->getIsVirtual()): ?> <div class="order-payment-method"> <?php else: ?> <div class="order-payment-method order-payment-method-virtual"> <?php endif; ?> + <?php /* Billing Address */ ?> <div class="fieldset-wrapper"> <div class="fieldset-wrapper-title"> @@ -46,7 +52,9 @@ <label for="creditmemo_do_refund" class="normal"><?php echo __('Refund Amount') ?></label> <?php endif;*/ ?> </div> + </div> + <?php if (!$_order->getIsVirtual()): ?> <div class="order-shipping-address"> <?php /* Shipping Address */ ?> @@ -75,9 +83,10 @@ </div> </div> <?php endif; ?> - </div> + + </div><?php /* opening div can be in app\code\Magento\Sales\view\adminhtml\order\view\info.phtml or above */?> <div id="creditmemo_item_container"> - <?php echo $this->getChildHtml('order_items') ?> + <?php echo $this->getChildHtml('order_items') ?> </div> </form> diff --git a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items.phtml b/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items.phtml index c3f9ed7e23c769fccd411e440c0481b4485933e7..784a7669f9b53621d11999f910ed4d8fc3098cd4 100644 --- a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items.phtml +++ b/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items.phtml @@ -25,10 +25,12 @@ */ ?> <?php $_items = $this->getCreditmemo()->getAllItems() ?> + <div class="fieldset-wrapper"> <div class="fieldset-wrapper-title"> <span class="title"><?php echo __('Items to Refund') ?></span> </div> + <?php if (count($_items)) : ?> <div class="grid"> <table cellspacing="0" class="data order-tables"> @@ -67,16 +69,21 @@ <?php endforeach; ?> </table> </div> - <?php else : ?> <div class="no-items"> <?php echo __('No Items To Refund') ?> </div> -<?php endif; ?> + <?php endif; ?> </div> + +<?php $orderTotalBar = $this->getChildHtml('order_totalbar'); ?> + +<?php if (!empty($orderTotalBar)): ?> <div class="fieldset-wrapper"> - <?php echo $this->getChildHtml('order_totalbar') ?> + <?php echo $orderTotalBar; ?> </div> +<?php endif; ?> + <div class="clearfix"> <input type="hidden" name="creditmemo[do_offline]" id="creditmemo_do_offline" value="0" /> <div class="order-comments-history"> diff --git a/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items.phtml b/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items.phtml index cce963b9c96aeca35d4c9b9ca3c8462a1adbf568..925d811bc5dd918641ee1da4dcb65b9bf74853c6 100644 --- a/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items.phtml +++ b/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items.phtml @@ -24,6 +24,7 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> + <div class="fieldset-wrapper"> <div class="fieldset-wrapper-title"> <?php $_itemsGridLabel = $this->getForcedShipmentCreate()?'Items to Invoice and Ship':'Items to Invoice'; ?> @@ -63,9 +64,15 @@ </table> </div> </div> + +<?php $orderTotalBar = $this->getChildHtml('order_totalbar'); ?> + +<?php if (!empty($orderTotalBar)): ?> <div class="fieldset-wrapper"> - <?php echo $this->getChildHtml('order_totalbar') ?> + <?php echo $orderTotalBar; ?> </div> +<?php endif; ?> + <div class="clearfix"> <div class="order-comments-history"> <div class="fieldset-wrapper"> @@ -78,6 +85,7 @@ </div> </div> </div> + <div class="order-totals"> <div class="fieldset-wrapper" id="invoice_totals"> <div class="fieldset-wrapper-title"> diff --git a/app/code/Magento/Sales/view/adminhtml/order/view/info.phtml b/app/code/Magento/Sales/view/adminhtml/order/view/info.phtml index 17e539db5d18f9e69a2b5158180f566a450f6a92..68cafe39a1500232199ec6b6e13d2c69530daefc 100644 --- a/app/code/Magento/Sales/view/adminhtml/order/view/info.phtml +++ b/app/code/Magento/Sales/view/adminhtml/order/view/info.phtml @@ -183,4 +183,11 @@ $orderStoreDate = $this->formatDate($_order->getCreatedAtStoreDate(), 'medium', </div> <?php endif; ?> -<?php /* closing div of this opening div are in app\code\Magento\Sales\view\adminhtml\order\invoice\view\form.phtml */?> +<?php +/* + closing div of this opening div are in + app\code\Magento\Sales\view\adminhtml\order\invoice\view\form.phtml + or + app\code\Magento\Sales\view\adminhtml\order\view\tab\info.phtml +*/ +?> \ No newline at end of file diff --git a/app/code/Magento/Sales/view/adminhtml/order/view/tab/info.phtml b/app/code/Magento/Sales/view/adminhtml/order/view/tab/info.phtml index 3cee82a4fee82e7c8e45e27e5d064f687aef1b90..d602315e91b7c3308fc74c9b16872ef48bab9591 100644 --- a/app/code/Magento/Sales/view/adminhtml/order/view/tab/info.phtml +++ b/app/code/Magento/Sales/view/adminhtml/order/view/tab/info.phtml @@ -26,14 +26,18 @@ ?> <?php /** @var $this \Magento\Sales\Block\Adminhtml\Order\View\Tab\Info */ ?> <?php $_order = $this->getOrder() ?> + <div id="order-messages"> - <?php echo $this->getChildHtml('order_messages') ?> - </div> - <?php echo $this->getChildHtml('order_info') ?> - <input type="hidden" name="order_id" value="<?php echo $_order->getId() ?>"/> + <?php echo $this->getChildHtml('order_messages') ?> +</div> + +<?php echo $this->getChildHtml('order_info') ?> +<input type="hidden" name="order_id" value="<?php echo $_order->getId() ?>"/> + <?php if (!$_order->getIsVirtual()): ?> <div class="clearfix"> <?php endif; ?> + <div class="order-payment-method<?php if ($_order->getIsVirtual()): ?> order-payment-method-virtual<?php endif; ?>"> <?php /* Payment Method */ ?> <div class="fieldset-wrapper"> @@ -44,6 +48,11 @@ <div class="order-payment-currency"><?php echo __('The order was placed using %1.', $_order->getOrderCurrencyCode()) ?></div> </div> </div> + +<?php if ($_order->getIsVirtual()): ?> +</div><?php /* opening div is in app\code\Magento\Sales\view\adminhtml\order\view\info.phtml */ ?> +<?php endif; ?> + <?php if (!$_order->getIsVirtual()): ?> <div class="order-shipping-method"> <!--Shipping Method--> @@ -76,16 +85,20 @@ </div> </div> <?php endif; ?> + <?php if (!$_order->getIsVirtual()): ?> </div> <?php endif; ?> - <?php echo $this->getGiftOptionsHtml() ?> - <div class="fieldset-wrapper"> - <div class="fieldset-wrapper-title"> - <span class="title"><?php echo __('Items Ordered') ?></span> - </div> - <?php echo $this->getItemsHtml() ?> + +<?php echo $this->getGiftOptionsHtml() ?> + +<div class="fieldset-wrapper"> + <div class="fieldset-wrapper-title"> + <span class="title"><?php echo __('Items Ordered') ?></span> </div> + <?php echo $this->getItemsHtml() ?> +</div> + <div class="clearfix"> <div class="order-comments-history"> <div class="fieldset-wrapper"> @@ -95,6 +108,7 @@ <fieldset><?php echo $this->getChildHtml('order_history') ?></fieldset> </div> </div> + <div class="order-totals"> <div class="fieldset-wrapper"> <div class="fieldset-wrapper-title"> @@ -104,7 +118,9 @@ </div> </div> </div> + <?php echo $this->getChildHtml('popup_window');?> + <script type="text/javascript"> //<![CDATA[ /** diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote.php index 191d1f16fd2afd7a4a0df666b5c1e87a05c2fdac..7caa6a9e2356e9fb1f810f11bf4aeb2f0f8bfd54 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote.php @@ -332,7 +332,7 @@ class Quote extends \Magento\Backend\App\Action $content = $this->_view->getLayout() ->createBlock('Magento\SalesRule\Block\Adminhtml\Promo\Quote\Edit\Tab\Coupons\Grid') ->getExcelFile($fileName); - return $this->_fileFactory->create($fileName, $content); + return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR); } else { $this->_redirect('sales_rule/*/detail', array('_current' => true)); return; @@ -353,7 +353,7 @@ class Quote extends \Magento\Backend\App\Action $content = $this->_view->getLayout() ->createBlock('Magento\SalesRule\Block\Adminhtml\Promo\Quote\Edit\Tab\Coupons\Grid') ->getCsvFile(); - return $this->_fileFactory->create($fileName, $content); + return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR); } else { $this->_redirect('sales_rule/*/detail', array('_current' => true)); return; diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rate.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate.php index cd9fc0d5055d32ba04d803178a8b194a90375819..74976baf8936d773ba6e92d35fd70bbfb6c7ffef 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rate.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate.php @@ -299,8 +299,8 @@ class Rate extends \Magento\Backend\App\Action public function exportCsvAction() { $this->_view->loadLayout(false); - $content = $this->_view->getLayout()->getChildBlock('adminhtml.tax.rate.grid','grid.export'); - return $this->_fileFactory->create('rates.csv', $content->getCsvFile()); + $content = $this->_view->getLayout()->getChildBlock('adminhtml.tax.rate.grid', 'grid.export'); + return $this->_fileFactory->create('rates.csv', $content->getCsvFile(), \Magento\Filesystem::VAR_DIR); } /** @@ -309,8 +309,8 @@ class Rate extends \Magento\Backend\App\Action public function exportXmlAction() { $this->_view->loadLayout(false); - $content = $this->_view->getLayout()->getChildBlock('adminhtml.tax.rate.grid','grid.export'); - return $this->_fileFactory->create('rates.xml', $content->getExcelFile()); + $content = $this->_view->getLayout()->getChildBlock('adminhtml.tax.rate.grid', 'grid.export'); + return $this->_fileFactory->create('rates.xml', $content->getExcelFile(), \Magento\Filesystem::VAR_DIR); } /** @@ -431,7 +431,7 @@ class Rate extends \Magento\Backend\App\Action $content .= $rate->toString($template) . "\n"; } $this->_view->loadLayout(); - return $this->_fileFactory->create('tax_rates.csv', $content); + return $this->_fileFactory->create('tax_rates.csv', $content, \Magento\Filesystem::VAR_DIR); } protected function _isAllowed() diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme.php index 04d57ed4518e9521607d9bb018a2e3fc1b37e4a3..0df09c9d81267a9bf7db8f9ec9262abc72762ce3 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme.php @@ -296,7 +296,8 @@ class Theme extends \Magento\Backend\App\Action array( 'type' => 'filename', 'value' => $customCssFile->getFullPath() - ) + ), + \Magento\Filesystem::ROOT ); } } catch (\Exception $e) { @@ -331,10 +332,14 @@ class Theme extends \Magento\Backend\App\Action ); } - return $this->_fileFactory->create($fileName, array( - 'type' => 'filename', - 'value' => $themeCss[$fileName]['path'] - )); + return $this->_fileFactory->create( + $fileName, + array( + 'type' => 'filename', + 'value' => $themeCss[$fileName]['path'] + ), + \Magento\Filesystem::ROOT + ); } catch (\Exception $e) { $this->messageManager->addException($e, __('We cannot find file "%1".', $fileName)); $this->getResponse()->setRedirect($this->_redirect->getRefererUrl()); diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files.php index 50aabe0721908f24cfddd6ef0e0937cd829677af..c8999ca2272d59d018d629042ad6425360b5c116 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files.php @@ -147,10 +147,14 @@ class Files extends \Magento\Backend\App\Action /** @var $helper \Magento\Theme\Helper\Storage */ $helper = $this->_objectManager->get('Magento\Theme\Helper\Storage'); try { - return $this->_fileFactory->create($file, array( - 'type' => 'filename', - 'value' => $helper->getThumbnailPath($file) - )); + return $this->_fileFactory->create( + $file, + array( + 'type' => 'filename', + 'value' => $helper->getThumbnailPath($file) + ), + \Magento\Filesystem::MEDIA + ); } catch (\Exception $e) { $this->_objectManager->get('Magento\Logger')->logException($e); $this->_redirect('core/index/notfound'); diff --git a/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml b/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml index 425c9c0a056b1ec37a9d7464f3282951cbf6a826..5f553e70450bb1d5661fb551902442daf6b164ad 100644 --- a/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml +++ b/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml @@ -45,7 +45,7 @@ </block> <block class="Magento\Theme\Block\Html\Head\Script" name="head-load-min-js"> <arguments> - <argument name="file" xsi:type="string">head.load.min.js</argument> + <argument name="file" xsi:type="string">headjs/head.load.min.js</argument> </arguments> </block> <block class="Magento\Theme\Block\Html\Head\Script" name="magento-magento-js"> diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php index 364c94ac5caa2b12f4666ce8da8695cc8e397bf8..a580b1e8681c1410f9e2612ed3e605dc0071db88 100644 --- a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php +++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php @@ -637,8 +637,8 @@ class Dhl $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_POSTFIELDS, $request); $responseBody = curl_exec($ch); curl_close($ch); @@ -1135,8 +1135,8 @@ class Dhl $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_POSTFIELDS, $request); $responseBody = curl_exec($ch); $debugData['result'] = $responseBody; diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php index 58068a67492fe5eba70ede5f6eb95469c78ba572..9209bb6d86fa4a5426ccaba6bf57d4d2db9ec134 100644 --- a/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php +++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php @@ -699,8 +699,8 @@ class Fedex $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_POSTFIELDS, $request); $responseBody = curl_exec($ch); curl_close ($ch); diff --git a/app/code/Magento/User/sql/user_setup/install-1.6.0.0.php b/app/code/Magento/User/sql/user_setup/install-1.6.0.0.php index 80eef8ffd62aea020c8e031eefa133554594edd1..3b0504e8bdf9227d7f6b8b8db3420c02ec479dcb 100644 --- a/app/code/Magento/User/sql/user_setup/install-1.6.0.0.php +++ b/app/code/Magento/User/sql/user_setup/install-1.6.0.0.php @@ -171,7 +171,8 @@ if (!$installer->getConnection()->isTableExists($installer->getTable('admin_user ), 'User Password') ->addColumn('created', \Magento\DB\Ddl\Table::TYPE_TIMESTAMP, null, array( 'nullable' => false, - ), 'User Created Time') + 'default' => \Magento\DB\Ddl\Table::TIMESTAMP_INIT, + ), 'User Created Time') ->addColumn('modified', \Magento\DB\Ddl\Table::TYPE_TIMESTAMP, null, array( ), 'User Modified Time') ->addColumn('logdate', \Magento\DB\Ddl\Table::TYPE_TIMESTAMP, null, array( diff --git a/app/code/Magento/User/view/adminhtml/admin/forgotpassword.phtml b/app/code/Magento/User/view/adminhtml/admin/forgotpassword.phtml index 83e28865b458b34ebd1bbcb82d6fd7ce1a7ea92b..bf1630a5ec8210f3d08c0d37bee861ee4d733422 100644 --- a/app/code/Magento/User/view/adminhtml/admin/forgotpassword.phtml +++ b/app/code/Magento/User/view/adminhtml/admin/forgotpassword.phtml @@ -54,8 +54,8 @@ <script src="<?php echo $this->getViewFileUrl('mage/adminhtml/events.js'); ?>"></script> <script src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js'); ?>"></script> <script src="<?php echo $this->getViewFileUrl('mage/captcha.js') ?>"></script> - <script src="<?php echo $this->getViewFileUrl('lib/modernizr.js') ?>"></script> - <script src="<?php echo $this->getViewFileUrl('js/head.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('modernizr/modernizr.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('headjs/head.min.js') ?>"></script> <body id="page-login" class="page-login page-forgotpassword"> <div class="wrapper"> diff --git a/app/code/Magento/User/view/adminhtml/admin/resetforgottenpassword.phtml b/app/code/Magento/User/view/adminhtml/admin/resetforgottenpassword.phtml index 0ac89ee2e3e9d0c8ce9e763f5a43ed63f7bf8dae..fbc2eb909b07cb4f785085f33e603b3d6e461d28 100644 --- a/app/code/Magento/User/view/adminhtml/admin/resetforgottenpassword.phtml +++ b/app/code/Magento/User/view/adminhtml/admin/resetforgottenpassword.phtml @@ -52,8 +52,8 @@ <script src="<?php echo $this->getViewFileUrl('prototype/prototype.js') ?>"></script> <script src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js') ?>"></script> <script src="<?php echo $this->getViewFileUrl('mage/captcha.js') ?>"></script> - <script src="<?php echo $this->getViewFileUrl('lib/modernizr.js') ?>"></script> - <script src="<?php echo $this->getViewFileUrl('js/head.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('modernizr/modernizr.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('headjs/head.min.js') ?>"></script> <body id="page-login" class="page-login page-resetpass"> <div class="wrapper"> diff --git a/app/code/Magento/Wishlist/Controller/Index.php b/app/code/Magento/Wishlist/Controller/Index.php index 9fa8deae722d88c17219b984a7c210f55d2fe898..29465301b4e7b17714c4943a79d88c28ec037992 100644 --- a/app/code/Magento/Wishlist/Controller/Index.php +++ b/app/code/Magento/Wishlist/Controller/Index.php @@ -256,8 +256,7 @@ class Index $helper = $this->_objectManager->get('Magento\Wishlist\Helper\Data')->calculate(); $message = __('%1 has been added to your wishlist. Click <a href="%2">here</a> to continue shopping.', $this->_objectManager->get('Magento\Escaper')->escapeHtml($product->getName()), $this->_objectManager->get('Magento\Escaper')->escapeUrl($referer)); $this->messageManager->addSuccess($message); - } - catch (\Magento\Core\Exception $e) { + } catch (\Magento\Core\Exception $e) { $this->messageManager->addError( __('An error occurred while adding item to wish list: %1', $e->getMessage()) ); @@ -354,8 +353,11 @@ class Index ->save(); $this->_objectManager->get('Magento\Wishlist\Helper\Data')->calculate(); - $this->_eventManager->dispatch('wishlist_update_item', array( - 'wishlist' => $wishlist, 'product' => $product, 'item' => $wishlist->getItem($id)) + $this->_eventManager->dispatch( + 'wishlist_update_item', + array( + 'wishlist' => $wishlist, 'product' => $product, 'item' => $wishlist->getItem($id) + ) ); $this->_objectManager->get('Magento\Wishlist\Helper\Data')->calculate(); @@ -446,8 +448,7 @@ class Index try { $wishlist->save(); $this->_objectManager->get('Magento\Wishlist\Helper\Data')->calculate(); - } - catch (\Exception $e) { + } catch (\Exception $e) { $this->messageManager->addError(__('Can\'t update wish list')); } } @@ -554,14 +555,14 @@ class Index if ($this->_objectManager->get('Magento\Checkout\Helper\Cart')->getShouldRedirectToCart()) { $redirectUrl = $this->_objectManager->get('Magento\Checkout\Helper\Cart')->getCartUrl(); - } else if ($this->_redirect->getRefererUrl()) { + } elseif ($this->_redirect->getRefererUrl()) { $redirectUrl = $this->_redirect->getRefererUrl(); } $this->_objectManager->get('Magento\Wishlist\Helper\Data')->calculate(); } catch (\Magento\Core\Exception $e) { if ($e->getCode() == \Magento\Wishlist\Model\Item::EXCEPTION_CODE_NOT_SALABLE) { $this->messageManager->addError(__('This product(s) is out of stock.')); - } else if ($e->getCode() == \Magento\Wishlist\Model\Item::EXCEPTION_CODE_HAS_REQUIRED_OPTIONS) { + } elseif ($e->getCode() == \Magento\Wishlist\Model\Item::EXCEPTION_CODE_HAS_REQUIRED_OPTIONS) { $this->messageManager->addNotice($e->getMessage()); $redirectUrl = $this->_url->getUrl('*/*/configure/', array('id' => $item->getId())); } else { @@ -594,7 +595,7 @@ class Index $cart = $this->_objectManager->get('Magento\Checkout\Model\Cart'); $session = $this->_objectManager->get('Magento\Checkout\Model\Session'); - try{ + try { $item = $cart->getQuote()->getItemById($itemId); if (!$item) { throw new \Magento\Core\Exception( @@ -623,7 +624,9 @@ class Index $this->messageManager->addException($e, __('We can\'t move the item to the wish list.')); } - return $this->getResponse()->setRedirect($this->_objectManager->get('Magento\Checkout\Helper\Cart')->getCartUrl()); + return $this->getResponse()->setRedirect( + $this->_objectManager->get('Magento\Checkout\Helper\Cart')->getCartUrl() + ); } /** @@ -704,7 +707,10 @@ class Index ->toHtml(); $message .= $rss_url; } - $wishlistBlock = $this->_view->getLayout()->createBlock('Magento\Wishlist\Block\Share\Email\Items')->toHtml(); + $wishlistBlock = $this->_view + ->getLayout() + ->createBlock('Magento\Wishlist\Block\Share\Email\Items') + ->toHtml(); $emails = array_unique($emails); /* @var $emailModel \Magento\Email\Model\Template */ @@ -715,8 +721,12 @@ class Index try { foreach ($emails as $email) { $emailModel->sendTransactional( - $this->_objectManager->get('Magento\Core\Model\Store\Config')->getConfig('wishlist/email/email_template'), - $this->_objectManager->get('Magento\Core\Model\Store\Config')->getConfig('wishlist/email/email_identity'), + $this->_objectManager + ->get('Magento\Core\Model\Store\Config') + ->getConfig('wishlist/email/email_template'), + $this->_objectManager + ->get('Magento\Core\Model\Store\Config') + ->getConfig('wishlist/email/email_identity'), $email, null, array( @@ -767,7 +777,11 @@ class Index $optionId = null; if (strpos($option->getCode(), \Magento\Catalog\Model\Product\Type\AbstractType::OPTION_PREFIX) === 0) { - $optionId = str_replace(\Magento\Catalog\Model\Product\Type\AbstractType::OPTION_PREFIX, '', $option->getCode()); + $optionId = str_replace( + \Magento\Catalog\Model\Product\Type\AbstractType::OPTION_PREFIX, + '', + $option->getCode() + ); if ((int)$optionId != $optionId) { return $this->_forward('noroute'); } @@ -789,13 +803,17 @@ class Index $secretKey = $this->getRequest()->getParam('key'); if ($secretKey == $info['secret_key']) { - $this->_fileResponseFactory->create($info['title'], array( - 'value' => $filePath, - 'type' => 'filename' - )); + $this->_fileResponseFactory->create( + $info['title'], + array( + 'value' => $filePath, + 'type' => 'filename' + ), + \Magento\Filesystem::ROOT + ); } - } catch(\Exception $e) { + } catch (\Exception $e) { $this->_forward('noroute'); } exit(0); diff --git a/app/design/adminhtml/magento_backend/Magento_Backend/layout/default.xml b/app/design/adminhtml/magento_backend/Magento_Backend/layout/default.xml index 2c6ba794548164c23119fec250183eae82445e83..ddb75229007bd366caee5f8217350ad3f7d6ecfd 100644 --- a/app/design/adminhtml/magento_backend/Magento_Backend/layout/default.xml +++ b/app/design/adminhtml/magento_backend/Magento_Backend/layout/default.xml @@ -50,10 +50,33 @@ <argument name="file" xsi:type="string">mui/components.css</argument> </arguments> </block> - <block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-css"> + <!--<block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-css"> <arguments> <argument name="file" xsi:type="string">css/styles.css</argument> </arguments> + </block>--> + <block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-admin"> + <arguments> + <argument name="file" xsi:type="string">css/admin.css</argument> + </arguments> + </block> + <block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-header"> + <arguments> + <argument name="file" xsi:type="string">css/header.css</argument> + </arguments> + </block> + <block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-pages"> + <arguments> + <argument name="file" xsi:type="string">css/pages.css</argument> + </arguments> + </block> + <block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-ie8"> + <arguments> + <argument name="file" xsi:type="string">css/styles-ie8.css</argument> + <argument name="properties" xsi:type="array"> + <item name="ie_condition" xsi:type="string">lt IE 9</item> + </argument> + </arguments> </block> <block class="Magento\Theme\Block\Html\Head\Css" name="jquery-farbtastic-css-farbtastic-css"> <arguments> @@ -81,12 +104,12 @@ </block> <block class="Magento\Theme\Block\Html\Head\Script" name="lib-modernizr-js"> <arguments> - <argument name="file" xsi:type="string">lib/modernizr.js</argument> + <argument name="file" xsi:type="string">modernizr/modernizr.js</argument> </arguments> </block> <block class="Magento\Theme\Block\Html\Head\Script" name="js-head-js"> <arguments> - <argument name="file" xsi:type="string">js/head.js</argument> + <argument name="file" xsi:type="string">headjs/head.min.js</argument> </arguments> </block> <block class="Magento\Theme\Block\Html\Head\Script" name="magento-dropdown-js"> @@ -109,9 +132,14 @@ <argument name="file" xsi:type="string">js/theme.js</argument> </arguments> </block> + <block class="Magento\Theme\Block\Html\Head\Script" name="js-modernizr-details-js"> + <arguments> + <argument name="file" xsi:type="string">modernizr/modernizr.details.js</argument> + </arguments> + </block> <block class="Magento\Theme\Block\Html\Head\Script" name="js-jquery-details-js"> <arguments> - <argument name="file" xsi:type="string">js/jquery.details.js</argument> + <argument name="file" xsi:type="string">jquery/jquery.details.js</argument> </arguments> </block> </referenceBlock> diff --git a/app/design/adminhtml/magento_backend/css/admin.css b/app/design/adminhtml/magento_backend/css/admin.css new file mode 100644 index 0000000000000000000000000000000000000000..1a9e681520953945522358424367d4c8ec0eff35 --- /dev/null +++ b/app/design/adminhtml/magento_backend/css/admin.css @@ -0,0 +1,6720 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +@font-face { + font-family: 'admin-icons'; + src: url('../fonts/icons/admin-icons.eot'); + src: url('../fonts/icons/admin-icons.eot?#iefix') format('embedded-opentype'), url('../fonts/icons/admin-icons.svg#admin-icons') format('svg'), url('../fonts/icons/admin-icons.woff') format('woff'), url('../fonts/icons/admin-icons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'MUI-Icons'; + src: url('../mui/fonts/MUI-Icons.eot'); + src: url('../mui/fonts/MUI-Icons.eot?#iefix') format('embedded-opentype'), url('../mui/fonts/MUI-Icons.svg#MUI-Icons') format('svg'), url('../mui/fonts/MUI-Icons.woff') format('woff'), url('../mui/fonts/MUI-Icons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} +/* @import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,400,600,700 <http://fonts.googleapis.com/css?family=Open+Sans:400italic%2c400%2c600%2c700>); */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans'), local('OpenSans'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/MTP_ySUJH_bn48VBG8sNSnhCUOGz7vYGh680lGh-uXM.woff) format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woff) format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/xjAJXh38I15wypJXxuGMBobN6UDyHWBl620a-IRfuBk.woff) format('woff'); +} +body, +html { + min-height: 100%; + height: 100%; +} +body { + color: #676056; + font: 400 14px/1.33 'Open Sans', sans-serif; + background: #f2ebde; + position: relative; + height: auto; +} +h1 { + color: #676056; + font: 400 28px/1.2 'Open Sans', sans-serif; +} +h2 { + color: #676056; + font: 400 20px/1.2 'Open Sans', sans-serif; +} +h3 { + color: #676056; + font: 600 16px/1.2 'Open Sans', sans-serif; +} +h4 { + color: #676056; + font: 600 14px/1.2 'Open Sans', sans-serif; +} +h5 { + color: #676056; + font: 600 13px/1.2 'Open Sans', sans-serif; +} +h6 { + color: #676056; + font: 600 12px/1.2 'Open Sans', sans-serif; +} +a { + display: inline; + color: #026294; + text-decoration: none; +} +a:visited, +a:active { + color: #026294; +} +a:focus, +a:hover { + color: #026294; + text-decoration: underline; +} +.DefaultButton, +.PrimaryButton, +input[type=button], +input[type=submit], +input[type=reset], +button, +[class^="action-"], +.popup-window .add-widget, +.PrimaryAddButton, +.PrimarySplitButton > .action-toggle.primary, +input[type=button].primary, +input[type=submit].primary, +input[type=reset].primary, +button.primary, +[class^="action-"].primary, +.popup-window .add-widget.primary, +.PrimarySplitButton.btn-round .action-default.primary, +.sales-order-index .page-actions .add, +.adminhtml-rma-index .page-actions .add, +.adminhtml-catalog-event-index .page-actions .add, +.adminhtml-urlrewrite-index .page-actions .add, +.catalog-search-index .page-actions .add, +.catalog-product-review-index .page-actions .add, +.catalog-rule-promo-catalog-index .page-actions .add, +.sales-rule-promo-quote-index .page-actions .add, +.adminhtml-reminder-index .page-actions .add, +.newsletter-template-index .page-actions .add, +.adminhtml-system-email-template-index .page-actions .add, +.adminhtml-sitemap-index .page-actions .add, +.adminhtml-googleshopping-types-index .page-actions .add, +.customer-index-index .page-actions .add, +.adminhtml-cms-page-index .page-actions .add, +.cms-block-index .page-actions .add, +.adminhtml-banner-index .page-actions .add, +.adminhtml-widget-instance-index .page-actions .add, +.cms-page-index .page-actions .add, +.adminhtml-webapi-user-index .page-actions .add, +.adminhtml-webapi-role-index .page-actions .add, +.adminhtml-system-variable-index .page-actions .add, +.adminhtml-user-index .page-actions .add, +.adminhtml-user-role-index .page-actions .add, +.adminhtml-integration-index .page-actions .add, +.adminhtml-system-design-theme-index .page-actions .add, +.adminhtml-system-design-index .page-actions .add, +.adminhtml-customer-attribute-index .page-actions .add, +.adminhtml-customer-address-attribute-index .page-actions .add, +.rating-index-index .page-actions .add, +.tax-rule-index .page-actions .add, +.tax-rate-index .page-actions .add, +.adminhtml-rma-item-attribute-index .page-actions .add, +.adminhtml-reward-rate-index .page-actions .add, +.customer-group-index .page-actions .add, +.checkout-agreement-index .page-actions .add, +.catalog-product-attribute-index .page-actions .add, +.catalog-product-set-index .page-actions .add, +.catalog-product-new .actions-split > .action-toggle.primary, +.catalog-product-edit .actions-split > .action-toggle.primary, +.catalog-product-index .actions-split > .action-toggle.primary, +.adminhtml-integration-new .actions-split > .action-toggle.primary, +.catalog-product-new .actions-split.btn-round .action-default.primary, +.catalog-product-edit .actions-split.btn-round .action-default.primary, +.catalog-product-index .actions-split.btn-round .action-default.primary, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary { + font: 14px/19px 'Open Sans', sans-serif; + font-weight: 500; + background: #f2ebde; + border: 1px solid #ada89e; + color: #676056; + display: inline-block; + padding: 5px 14px; + text-align: center; + text-decoration: none; + vertical-align: top; + cursor: pointer; + border-radius: 2px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.DefaultButton:hover, +.DefaultButton:focus, +.DefaultButton:active, +.PrimaryButton:hover, +.PrimaryButton:focus, +.PrimaryButton:active, +input[type=button]:hover, +input[type=button]:focus, +input[type=button]:active, +input[type=submit]:hover, +input[type=submit]:focus, +input[type=submit]:active, +input[type=reset]:hover, +input[type=reset]:focus, +input[type=reset]:active, +button:hover, +button:focus, +button:active, +[class^="action-"]:hover, +[class^="action-"]:focus, +[class^="action-"]:active, +.popup-window .add-widget:hover, +.popup-window .add-widget:focus, +.popup-window .add-widget:active, +.PrimaryAddButton:hover, +.PrimaryAddButton:focus, +.PrimaryAddButton:active, +.PrimarySplitButton > .action-toggle.primary:hover, +.PrimarySplitButton > .action-toggle.primary:focus, +.PrimarySplitButton > .action-toggle.primary:active, +input[type=button].primary:hover, +input[type=button].primary:focus, +input[type=button].primary:active, +input[type=submit].primary:hover, +input[type=submit].primary:focus, +input[type=submit].primary:active, +input[type=reset].primary:hover, +input[type=reset].primary:focus, +input[type=reset].primary:active, +button.primary:hover, +button.primary:focus, +button.primary:active, +[class^="action-"].primary:hover, +[class^="action-"].primary:focus, +[class^="action-"].primary:active, +.popup-window .add-widget.primary:hover, +.popup-window .add-widget.primary:focus, +.popup-window .add-widget.primary:active, +.PrimarySplitButton.btn-round .action-default.primary:hover, +.PrimarySplitButton.btn-round .action-default.primary:focus, +.PrimarySplitButton.btn-round .action-default.primary:active, +.sales-order-index .page-actions .add:hover, +.sales-order-index .page-actions .add:focus, +.sales-order-index .page-actions .add:active, +.adminhtml-rma-index .page-actions .add:hover, +.adminhtml-rma-index .page-actions .add:focus, +.adminhtml-rma-index .page-actions .add:active, +.adminhtml-catalog-event-index .page-actions .add:hover, +.adminhtml-catalog-event-index .page-actions .add:focus, +.adminhtml-catalog-event-index .page-actions .add:active, +.adminhtml-urlrewrite-index .page-actions .add:hover, +.adminhtml-urlrewrite-index .page-actions .add:focus, +.adminhtml-urlrewrite-index .page-actions .add:active, +.catalog-search-index .page-actions .add:hover, +.catalog-search-index .page-actions .add:focus, +.catalog-search-index .page-actions .add:active, +.catalog-product-review-index .page-actions .add:hover, +.catalog-product-review-index .page-actions .add:focus, +.catalog-product-review-index .page-actions .add:active, +.catalog-rule-promo-catalog-index .page-actions .add:hover, +.catalog-rule-promo-catalog-index .page-actions .add:focus, +.catalog-rule-promo-catalog-index .page-actions .add:active, +.sales-rule-promo-quote-index .page-actions .add:hover, +.sales-rule-promo-quote-index .page-actions .add:focus, +.sales-rule-promo-quote-index .page-actions .add:active, +.adminhtml-reminder-index .page-actions .add:hover, +.adminhtml-reminder-index .page-actions .add:focus, +.adminhtml-reminder-index .page-actions .add:active, +.newsletter-template-index .page-actions .add:hover, +.newsletter-template-index .page-actions .add:focus, +.newsletter-template-index .page-actions .add:active, +.adminhtml-system-email-template-index .page-actions .add:hover, +.adminhtml-system-email-template-index .page-actions .add:focus, +.adminhtml-system-email-template-index .page-actions .add:active, +.adminhtml-sitemap-index .page-actions .add:hover, +.adminhtml-sitemap-index .page-actions .add:focus, +.adminhtml-sitemap-index .page-actions .add:active, +.adminhtml-googleshopping-types-index .page-actions .add:hover, +.adminhtml-googleshopping-types-index .page-actions .add:focus, +.adminhtml-googleshopping-types-index .page-actions .add:active, +.customer-index-index .page-actions .add:hover, +.customer-index-index .page-actions .add:focus, +.customer-index-index .page-actions .add:active, +.adminhtml-cms-page-index .page-actions .add:hover, +.adminhtml-cms-page-index .page-actions .add:focus, +.adminhtml-cms-page-index .page-actions .add:active, +.cms-block-index .page-actions .add:hover, +.cms-block-index .page-actions .add:focus, +.cms-block-index .page-actions .add:active, +.adminhtml-banner-index .page-actions .add:hover, +.adminhtml-banner-index .page-actions .add:focus, +.adminhtml-banner-index .page-actions .add:active, +.adminhtml-widget-instance-index .page-actions .add:hover, +.adminhtml-widget-instance-index .page-actions .add:focus, +.adminhtml-widget-instance-index .page-actions .add:active, +.cms-page-index .page-actions .add:hover, +.cms-page-index .page-actions .add:focus, +.cms-page-index .page-actions .add:active, +.adminhtml-webapi-user-index .page-actions .add:hover, +.adminhtml-webapi-user-index .page-actions .add:focus, +.adminhtml-webapi-user-index .page-actions .add:active, +.adminhtml-webapi-role-index .page-actions .add:hover, +.adminhtml-webapi-role-index .page-actions .add:focus, +.adminhtml-webapi-role-index .page-actions .add:active, +.adminhtml-system-variable-index .page-actions .add:hover, +.adminhtml-system-variable-index .page-actions .add:focus, +.adminhtml-system-variable-index .page-actions .add:active, +.adminhtml-user-index .page-actions .add:hover, +.adminhtml-user-index .page-actions .add:focus, +.adminhtml-user-index .page-actions .add:active, +.adminhtml-user-role-index .page-actions .add:hover, +.adminhtml-user-role-index .page-actions .add:focus, +.adminhtml-user-role-index .page-actions .add:active, +.adminhtml-integration-index .page-actions .add:hover, +.adminhtml-integration-index .page-actions .add:focus, +.adminhtml-integration-index .page-actions .add:active, +.adminhtml-system-design-theme-index .page-actions .add:hover, +.adminhtml-system-design-theme-index .page-actions .add:focus, +.adminhtml-system-design-theme-index .page-actions .add:active, +.adminhtml-system-design-index .page-actions .add:hover, +.adminhtml-system-design-index .page-actions .add:focus, +.adminhtml-system-design-index .page-actions .add:active, +.adminhtml-customer-attribute-index .page-actions .add:hover, +.adminhtml-customer-attribute-index .page-actions .add:focus, +.adminhtml-customer-attribute-index .page-actions .add:active, +.adminhtml-customer-address-attribute-index .page-actions .add:hover, +.adminhtml-customer-address-attribute-index .page-actions .add:focus, +.adminhtml-customer-address-attribute-index .page-actions .add:active, +.rating-index-index .page-actions .add:hover, +.rating-index-index .page-actions .add:focus, +.rating-index-index .page-actions .add:active, +.tax-rule-index .page-actions .add:hover, +.tax-rule-index .page-actions .add:focus, +.tax-rule-index .page-actions .add:active, +.tax-rate-index .page-actions .add:hover, +.tax-rate-index .page-actions .add:focus, +.tax-rate-index .page-actions .add:active, +.adminhtml-rma-item-attribute-index .page-actions .add:hover, +.adminhtml-rma-item-attribute-index .page-actions .add:focus, +.adminhtml-rma-item-attribute-index .page-actions .add:active, +.adminhtml-reward-rate-index .page-actions .add:hover, +.adminhtml-reward-rate-index .page-actions .add:focus, +.adminhtml-reward-rate-index .page-actions .add:active, +.customer-group-index .page-actions .add:hover, +.customer-group-index .page-actions .add:focus, +.customer-group-index .page-actions .add:active, +.checkout-agreement-index .page-actions .add:hover, +.checkout-agreement-index .page-actions .add:focus, +.checkout-agreement-index .page-actions .add:active, +.catalog-product-attribute-index .page-actions .add:hover, +.catalog-product-attribute-index .page-actions .add:focus, +.catalog-product-attribute-index .page-actions .add:active, +.catalog-product-set-index .page-actions .add:hover, +.catalog-product-set-index .page-actions .add:focus, +.catalog-product-set-index .page-actions .add:active, +.catalog-product-new .actions-split > .action-toggle.primary:hover, +.catalog-product-new .actions-split > .action-toggle.primary:focus, +.catalog-product-new .actions-split > .action-toggle.primary:active, +.catalog-product-edit .actions-split > .action-toggle.primary:hover, +.catalog-product-edit .actions-split > .action-toggle.primary:focus, +.catalog-product-edit .actions-split > .action-toggle.primary:active, +.catalog-product-index .actions-split > .action-toggle.primary:hover, +.catalog-product-index .actions-split > .action-toggle.primary:focus, +.catalog-product-index .actions-split > .action-toggle.primary:active, +.adminhtml-integration-new .actions-split > .action-toggle.primary:hover, +.adminhtml-integration-new .actions-split > .action-toggle.primary:focus, +.adminhtml-integration-new .actions-split > .action-toggle.primary:active, +.catalog-product-new .actions-split.btn-round .action-default.primary:hover, +.catalog-product-new .actions-split.btn-round .action-default.primary:focus, +.catalog-product-new .actions-split.btn-round .action-default.primary:active, +.catalog-product-edit .actions-split.btn-round .action-default.primary:hover, +.catalog-product-edit .actions-split.btn-round .action-default.primary:focus, +.catalog-product-edit .actions-split.btn-round .action-default.primary:active, +.catalog-product-index .actions-split.btn-round .action-default.primary:hover, +.catalog-product-index .actions-split.btn-round .action-default.primary:focus, +.catalog-product-index .actions-split.btn-round .action-default.primary:active, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:hover, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:focus, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:active { + text-decoration: none; + background: #cac3b4; + color: #676056; +} +.DefaultButton:active, +.PrimaryButton:active, +input[type=button]:active, +input[type=submit]:active, +input[type=reset]:active, +button:active, +[class^="action-"]:active, +.popup-window .add-widget:active, +.PrimaryAddButton:active, +.PrimarySplitButton > .action-toggle.primary:active, +input[type=button].primary:active, +input[type=submit].primary:active, +input[type=reset].primary:active, +button.primary:active, +[class^="action-"].primary:active, +.popup-window .add-widget.primary:active, +.PrimarySplitButton.btn-round .action-default.primary:active, +.sales-order-index .page-actions .add:active, +.adminhtml-rma-index .page-actions .add:active, +.adminhtml-catalog-event-index .page-actions .add:active, +.adminhtml-urlrewrite-index .page-actions .add:active, +.catalog-search-index .page-actions .add:active, +.catalog-product-review-index .page-actions .add:active, +.catalog-rule-promo-catalog-index .page-actions .add:active, +.sales-rule-promo-quote-index .page-actions .add:active, +.adminhtml-reminder-index .page-actions .add:active, +.newsletter-template-index .page-actions .add:active, +.adminhtml-system-email-template-index .page-actions .add:active, +.adminhtml-sitemap-index .page-actions .add:active, +.adminhtml-googleshopping-types-index .page-actions .add:active, +.customer-index-index .page-actions .add:active, +.adminhtml-cms-page-index .page-actions .add:active, +.cms-block-index .page-actions .add:active, +.adminhtml-banner-index .page-actions .add:active, +.adminhtml-widget-instance-index .page-actions .add:active, +.cms-page-index .page-actions .add:active, +.adminhtml-webapi-user-index .page-actions .add:active, +.adminhtml-webapi-role-index .page-actions .add:active, +.adminhtml-system-variable-index .page-actions .add:active, +.adminhtml-user-index .page-actions .add:active, +.adminhtml-user-role-index .page-actions .add:active, +.adminhtml-integration-index .page-actions .add:active, +.adminhtml-system-design-theme-index .page-actions .add:active, +.adminhtml-system-design-index .page-actions .add:active, +.adminhtml-customer-attribute-index .page-actions .add:active, +.adminhtml-customer-address-attribute-index .page-actions .add:active, +.rating-index-index .page-actions .add:active, +.tax-rule-index .page-actions .add:active, +.tax-rate-index .page-actions .add:active, +.adminhtml-rma-item-attribute-index .page-actions .add:active, +.adminhtml-reward-rate-index .page-actions .add:active, +.customer-group-index .page-actions .add:active, +.checkout-agreement-index .page-actions .add:active, +.catalog-product-attribute-index .page-actions .add:active, +.catalog-product-set-index .page-actions .add:active, +.catalog-product-new .actions-split > .action-toggle.primary:active, +.catalog-product-edit .actions-split > .action-toggle.primary:active, +.catalog-product-index .actions-split > .action-toggle.primary:active, +.adminhtml-integration-new .actions-split > .action-toggle.primary:active, +.catalog-product-new .actions-split.btn-round .action-default.primary:active, +.catalog-product-edit .actions-split.btn-round .action-default.primary:active, +.catalog-product-index .actions-split.btn-round .action-default.primary:active, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:active { + border: 1px solid #989287; +} +.DefaultButton:visited, +.PrimaryButton:visited, +input[type=button]:visited, +input[type=submit]:visited, +input[type=reset]:visited, +button:visited, +[class^="action-"]:visited, +.popup-window .add-widget:visited, +.PrimaryAddButton:visited, +.PrimarySplitButton > .action-toggle.primary:visited, +input[type=button].primary:visited, +input[type=submit].primary:visited, +input[type=reset].primary:visited, +button.primary:visited, +[class^="action-"].primary:visited, +.popup-window .add-widget.primary:visited, +.PrimarySplitButton.btn-round .action-default.primary:visited, +.sales-order-index .page-actions .add:visited, +.adminhtml-rma-index .page-actions .add:visited, +.adminhtml-catalog-event-index .page-actions .add:visited, +.adminhtml-urlrewrite-index .page-actions .add:visited, +.catalog-search-index .page-actions .add:visited, +.catalog-product-review-index .page-actions .add:visited, +.catalog-rule-promo-catalog-index .page-actions .add:visited, +.sales-rule-promo-quote-index .page-actions .add:visited, +.adminhtml-reminder-index .page-actions .add:visited, +.newsletter-template-index .page-actions .add:visited, +.adminhtml-system-email-template-index .page-actions .add:visited, +.adminhtml-sitemap-index .page-actions .add:visited, +.adminhtml-googleshopping-types-index .page-actions .add:visited, +.customer-index-index .page-actions .add:visited, +.adminhtml-cms-page-index .page-actions .add:visited, +.cms-block-index .page-actions .add:visited, +.adminhtml-banner-index .page-actions .add:visited, +.adminhtml-widget-instance-index .page-actions .add:visited, +.cms-page-index .page-actions .add:visited, +.adminhtml-webapi-user-index .page-actions .add:visited, +.adminhtml-webapi-role-index .page-actions .add:visited, +.adminhtml-system-variable-index .page-actions .add:visited, +.adminhtml-user-index .page-actions .add:visited, +.adminhtml-user-role-index .page-actions .add:visited, +.adminhtml-integration-index .page-actions .add:visited, +.adminhtml-system-design-theme-index .page-actions .add:visited, +.adminhtml-system-design-index .page-actions .add:visited, +.adminhtml-customer-attribute-index .page-actions .add:visited, +.adminhtml-customer-address-attribute-index .page-actions .add:visited, +.rating-index-index .page-actions .add:visited, +.tax-rule-index .page-actions .add:visited, +.tax-rate-index .page-actions .add:visited, +.adminhtml-rma-item-attribute-index .page-actions .add:visited, +.adminhtml-reward-rate-index .page-actions .add:visited, +.customer-group-index .page-actions .add:visited, +.checkout-agreement-index .page-actions .add:visited, +.catalog-product-attribute-index .page-actions .add:visited, +.catalog-product-set-index .page-actions .add:visited, +.catalog-product-new .actions-split > .action-toggle.primary:visited, +.catalog-product-edit .actions-split > .action-toggle.primary:visited, +.catalog-product-index .actions-split > .action-toggle.primary:visited, +.adminhtml-integration-new .actions-split > .action-toggle.primary:visited, +.catalog-product-new .actions-split.btn-round .action-default.primary:visited, +.catalog-product-edit .actions-split.btn-round .action-default.primary:visited, +.catalog-product-index .actions-split.btn-round .action-default.primary:visited, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:visited { + color: #676056; +} +.DefaultButton[disabled], +.DefaultButton.disabled, +.PrimaryButton[disabled], +.PrimaryButton.disabled, +input[type=button][disabled], +input[type=button].disabled, +input[type=submit][disabled], +input[type=submit].disabled, +input[type=reset][disabled], +input[type=reset].disabled, +button[disabled], +button.disabled, +[class^="action-"][disabled], +[class^="action-"].disabled, +.popup-window .add-widget[disabled], +.popup-window .add-widget.disabled, +.PrimaryAddButton[disabled], +.PrimaryAddButton.disabled, +.PrimarySplitButton > .action-toggle.primary[disabled], +.PrimarySplitButton > .action-toggle.primary.disabled, +input[type=button].primary[disabled], +input[type=button].primary.disabled, +input[type=submit].primary[disabled], +input[type=submit].primary.disabled, +input[type=reset].primary[disabled], +input[type=reset].primary.disabled, +button.primary[disabled], +button.primary.disabled, +[class^="action-"].primary[disabled], +[class^="action-"].primary.disabled, +.popup-window .add-widget.primary[disabled], +.popup-window .add-widget.primary.disabled, +.PrimarySplitButton.btn-round .action-default.primary[disabled], +.PrimarySplitButton.btn-round .action-default.primary.disabled, +.sales-order-index .page-actions .add[disabled], +.sales-order-index .page-actions .add.disabled, +.adminhtml-rma-index .page-actions .add[disabled], +.adminhtml-rma-index .page-actions .add.disabled, +.adminhtml-catalog-event-index .page-actions .add[disabled], +.adminhtml-catalog-event-index .page-actions .add.disabled, +.adminhtml-urlrewrite-index .page-actions .add[disabled], +.adminhtml-urlrewrite-index .page-actions .add.disabled, +.catalog-search-index .page-actions .add[disabled], +.catalog-search-index .page-actions .add.disabled, +.catalog-product-review-index .page-actions .add[disabled], +.catalog-product-review-index .page-actions .add.disabled, +.catalog-rule-promo-catalog-index .page-actions .add[disabled], +.catalog-rule-promo-catalog-index .page-actions .add.disabled, +.sales-rule-promo-quote-index .page-actions .add[disabled], +.sales-rule-promo-quote-index .page-actions .add.disabled, +.adminhtml-reminder-index .page-actions .add[disabled], +.adminhtml-reminder-index .page-actions .add.disabled, +.newsletter-template-index .page-actions .add[disabled], +.newsletter-template-index .page-actions .add.disabled, +.adminhtml-system-email-template-index .page-actions .add[disabled], +.adminhtml-system-email-template-index .page-actions .add.disabled, +.adminhtml-sitemap-index .page-actions .add[disabled], +.adminhtml-sitemap-index .page-actions .add.disabled, +.adminhtml-googleshopping-types-index .page-actions .add[disabled], +.adminhtml-googleshopping-types-index .page-actions .add.disabled, +.customer-index-index .page-actions .add[disabled], +.customer-index-index .page-actions .add.disabled, +.adminhtml-cms-page-index .page-actions .add[disabled], +.adminhtml-cms-page-index .page-actions .add.disabled, +.cms-block-index .page-actions .add[disabled], +.cms-block-index .page-actions .add.disabled, +.adminhtml-banner-index .page-actions .add[disabled], +.adminhtml-banner-index .page-actions .add.disabled, +.adminhtml-widget-instance-index .page-actions .add[disabled], +.adminhtml-widget-instance-index .page-actions .add.disabled, +.cms-page-index .page-actions .add[disabled], +.cms-page-index .page-actions .add.disabled, +.adminhtml-webapi-user-index .page-actions .add[disabled], +.adminhtml-webapi-user-index .page-actions .add.disabled, +.adminhtml-webapi-role-index .page-actions .add[disabled], +.adminhtml-webapi-role-index .page-actions .add.disabled, +.adminhtml-system-variable-index .page-actions .add[disabled], +.adminhtml-system-variable-index .page-actions .add.disabled, +.adminhtml-user-index .page-actions .add[disabled], +.adminhtml-user-index .page-actions .add.disabled, +.adminhtml-user-role-index .page-actions .add[disabled], +.adminhtml-user-role-index .page-actions .add.disabled, +.adminhtml-integration-index .page-actions .add[disabled], +.adminhtml-integration-index .page-actions .add.disabled, +.adminhtml-system-design-theme-index .page-actions .add[disabled], +.adminhtml-system-design-theme-index .page-actions .add.disabled, +.adminhtml-system-design-index .page-actions .add[disabled], +.adminhtml-system-design-index .page-actions .add.disabled, +.adminhtml-customer-attribute-index .page-actions .add[disabled], +.adminhtml-customer-attribute-index .page-actions .add.disabled, +.adminhtml-customer-address-attribute-index .page-actions .add[disabled], +.adminhtml-customer-address-attribute-index .page-actions .add.disabled, +.rating-index-index .page-actions .add[disabled], +.rating-index-index .page-actions .add.disabled, +.tax-rule-index .page-actions .add[disabled], +.tax-rule-index .page-actions .add.disabled, +.tax-rate-index .page-actions .add[disabled], +.tax-rate-index .page-actions .add.disabled, +.adminhtml-rma-item-attribute-index .page-actions .add[disabled], +.adminhtml-rma-item-attribute-index .page-actions .add.disabled, +.adminhtml-reward-rate-index .page-actions .add[disabled], +.adminhtml-reward-rate-index .page-actions .add.disabled, +.customer-group-index .page-actions .add[disabled], +.customer-group-index .page-actions .add.disabled, +.checkout-agreement-index .page-actions .add[disabled], +.checkout-agreement-index .page-actions .add.disabled, +.catalog-product-attribute-index .page-actions .add[disabled], +.catalog-product-attribute-index .page-actions .add.disabled, +.catalog-product-set-index .page-actions .add[disabled], +.catalog-product-set-index .page-actions .add.disabled, +.catalog-product-new .actions-split > .action-toggle.primary[disabled], +.catalog-product-new .actions-split > .action-toggle.primary.disabled, +.catalog-product-edit .actions-split > .action-toggle.primary[disabled], +.catalog-product-edit .actions-split > .action-toggle.primary.disabled, +.catalog-product-index .actions-split > .action-toggle.primary[disabled], +.catalog-product-index .actions-split > .action-toggle.primary.disabled, +.adminhtml-integration-new .actions-split > .action-toggle.primary[disabled], +.adminhtml-integration-new .actions-split > .action-toggle.primary.disabled, +.catalog-product-new .actions-split.btn-round .action-default.primary[disabled], +.catalog-product-new .actions-split.btn-round .action-default.primary.disabled, +.catalog-product-edit .actions-split.btn-round .action-default.primary[disabled], +.catalog-product-edit .actions-split.btn-round .action-default.primary.disabled, +.catalog-product-index .actions-split.btn-round .action-default.primary[disabled], +.catalog-product-index .actions-split.btn-round .action-default.primary.disabled, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary[disabled], +.adminhtml-integration-new .actions-split.btn-round .action-default.primary.disabled { + cursor: not-allowed; + opacity: 0.5; + filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50); +} +.DefaultButton[disabled]:hover, +.DefaultButton.disabled:hover, +.DefaultButton[disabled]:active, +.DefaultButton.disabled:active, +.PrimaryButton[disabled]:hover, +.PrimaryButton.disabled:hover, +.PrimaryButton[disabled]:active, +.PrimaryButton.disabled:active, +input[type=button][disabled]:hover, +input[type=button].disabled:hover, +input[type=button][disabled]:active, +input[type=button].disabled:active, +input[type=submit][disabled]:hover, +input[type=submit].disabled:hover, +input[type=submit][disabled]:active, +input[type=submit].disabled:active, +input[type=reset][disabled]:hover, +input[type=reset].disabled:hover, +input[type=reset][disabled]:active, +input[type=reset].disabled:active, +button[disabled]:hover, +button.disabled:hover, +button[disabled]:active, +button.disabled:active, +[class^="action-"][disabled]:hover, +[class^="action-"].disabled:hover, +[class^="action-"][disabled]:active, +[class^="action-"].disabled:active, +.popup-window .add-widget[disabled]:hover, +.popup-window .add-widget.disabled:hover, +.popup-window .add-widget[disabled]:active, +.popup-window .add-widget.disabled:active, +.PrimaryAddButton[disabled]:hover, +.PrimaryAddButton.disabled:hover, +.PrimaryAddButton[disabled]:active, +.PrimaryAddButton.disabled:active, +.PrimarySplitButton > .action-toggle.primary[disabled]:hover, +.PrimarySplitButton > .action-toggle.primary.disabled:hover, +.PrimarySplitButton > .action-toggle.primary[disabled]:active, +.PrimarySplitButton > .action-toggle.primary.disabled:active, +input[type=button].primary[disabled]:hover, +input[type=button].primary.disabled:hover, +input[type=button].primary[disabled]:active, +input[type=button].primary.disabled:active, +input[type=submit].primary[disabled]:hover, +input[type=submit].primary.disabled:hover, +input[type=submit].primary[disabled]:active, +input[type=submit].primary.disabled:active, +input[type=reset].primary[disabled]:hover, +input[type=reset].primary.disabled:hover, +input[type=reset].primary[disabled]:active, +input[type=reset].primary.disabled:active, +button.primary[disabled]:hover, +button.primary.disabled:hover, +button.primary[disabled]:active, +button.primary.disabled:active, +[class^="action-"].primary[disabled]:hover, +[class^="action-"].primary.disabled:hover, +[class^="action-"].primary[disabled]:active, +[class^="action-"].primary.disabled:active, +.popup-window .add-widget.primary[disabled]:hover, +.popup-window .add-widget.primary.disabled:hover, +.popup-window .add-widget.primary[disabled]:active, +.popup-window .add-widget.primary.disabled:active, +.PrimarySplitButton.btn-round .action-default.primary[disabled]:hover, +.PrimarySplitButton.btn-round .action-default.primary.disabled:hover, +.PrimarySplitButton.btn-round .action-default.primary[disabled]:active, +.PrimarySplitButton.btn-round .action-default.primary.disabled:active, +.sales-order-index .page-actions .add[disabled]:hover, +.sales-order-index .page-actions .add.disabled:hover, +.sales-order-index .page-actions .add[disabled]:active, +.sales-order-index .page-actions .add.disabled:active, +.adminhtml-rma-index .page-actions .add[disabled]:hover, +.adminhtml-rma-index .page-actions .add.disabled:hover, +.adminhtml-rma-index .page-actions .add[disabled]:active, +.adminhtml-rma-index .page-actions .add.disabled:active, +.adminhtml-catalog-event-index .page-actions .add[disabled]:hover, +.adminhtml-catalog-event-index .page-actions .add.disabled:hover, +.adminhtml-catalog-event-index .page-actions .add[disabled]:active, +.adminhtml-catalog-event-index .page-actions .add.disabled:active, +.adminhtml-urlrewrite-index .page-actions .add[disabled]:hover, +.adminhtml-urlrewrite-index .page-actions .add.disabled:hover, +.adminhtml-urlrewrite-index .page-actions .add[disabled]:active, +.adminhtml-urlrewrite-index .page-actions .add.disabled:active, +.catalog-search-index .page-actions .add[disabled]:hover, +.catalog-search-index .page-actions .add.disabled:hover, +.catalog-search-index .page-actions .add[disabled]:active, +.catalog-search-index .page-actions .add.disabled:active, +.catalog-product-review-index .page-actions .add[disabled]:hover, +.catalog-product-review-index .page-actions .add.disabled:hover, +.catalog-product-review-index .page-actions .add[disabled]:active, +.catalog-product-review-index .page-actions .add.disabled:active, +.catalog-rule-promo-catalog-index .page-actions .add[disabled]:hover, +.catalog-rule-promo-catalog-index .page-actions .add.disabled:hover, +.catalog-rule-promo-catalog-index .page-actions .add[disabled]:active, +.catalog-rule-promo-catalog-index .page-actions .add.disabled:active, +.sales-rule-promo-quote-index .page-actions .add[disabled]:hover, +.sales-rule-promo-quote-index .page-actions .add.disabled:hover, +.sales-rule-promo-quote-index .page-actions .add[disabled]:active, +.sales-rule-promo-quote-index .page-actions .add.disabled:active, +.adminhtml-reminder-index .page-actions .add[disabled]:hover, +.adminhtml-reminder-index .page-actions .add.disabled:hover, +.adminhtml-reminder-index .page-actions .add[disabled]:active, +.adminhtml-reminder-index .page-actions .add.disabled:active, +.newsletter-template-index .page-actions .add[disabled]:hover, +.newsletter-template-index .page-actions .add.disabled:hover, +.newsletter-template-index .page-actions .add[disabled]:active, +.newsletter-template-index .page-actions .add.disabled:active, +.adminhtml-system-email-template-index .page-actions .add[disabled]:hover, +.adminhtml-system-email-template-index .page-actions .add.disabled:hover, +.adminhtml-system-email-template-index .page-actions .add[disabled]:active, +.adminhtml-system-email-template-index .page-actions .add.disabled:active, +.adminhtml-sitemap-index .page-actions .add[disabled]:hover, +.adminhtml-sitemap-index .page-actions .add.disabled:hover, +.adminhtml-sitemap-index .page-actions .add[disabled]:active, +.adminhtml-sitemap-index .page-actions .add.disabled:active, +.adminhtml-googleshopping-types-index .page-actions .add[disabled]:hover, +.adminhtml-googleshopping-types-index .page-actions .add.disabled:hover, +.adminhtml-googleshopping-types-index .page-actions .add[disabled]:active, +.adminhtml-googleshopping-types-index .page-actions .add.disabled:active, +.customer-index-index .page-actions .add[disabled]:hover, +.customer-index-index .page-actions .add.disabled:hover, +.customer-index-index .page-actions .add[disabled]:active, +.customer-index-index .page-actions .add.disabled:active, +.adminhtml-cms-page-index .page-actions .add[disabled]:hover, +.adminhtml-cms-page-index .page-actions .add.disabled:hover, +.adminhtml-cms-page-index .page-actions .add[disabled]:active, +.adminhtml-cms-page-index .page-actions .add.disabled:active, +.cms-block-index .page-actions .add[disabled]:hover, +.cms-block-index .page-actions .add.disabled:hover, +.cms-block-index .page-actions .add[disabled]:active, +.cms-block-index .page-actions .add.disabled:active, +.adminhtml-banner-index .page-actions .add[disabled]:hover, +.adminhtml-banner-index .page-actions .add.disabled:hover, +.adminhtml-banner-index .page-actions .add[disabled]:active, +.adminhtml-banner-index .page-actions .add.disabled:active, +.adminhtml-widget-instance-index .page-actions .add[disabled]:hover, +.adminhtml-widget-instance-index .page-actions .add.disabled:hover, +.adminhtml-widget-instance-index .page-actions .add[disabled]:active, +.adminhtml-widget-instance-index .page-actions .add.disabled:active, +.cms-page-index .page-actions .add[disabled]:hover, +.cms-page-index .page-actions .add.disabled:hover, +.cms-page-index .page-actions .add[disabled]:active, +.cms-page-index .page-actions .add.disabled:active, +.adminhtml-webapi-user-index .page-actions .add[disabled]:hover, +.adminhtml-webapi-user-index .page-actions .add.disabled:hover, +.adminhtml-webapi-user-index .page-actions .add[disabled]:active, +.adminhtml-webapi-user-index .page-actions .add.disabled:active, +.adminhtml-webapi-role-index .page-actions .add[disabled]:hover, +.adminhtml-webapi-role-index .page-actions .add.disabled:hover, +.adminhtml-webapi-role-index .page-actions .add[disabled]:active, +.adminhtml-webapi-role-index .page-actions .add.disabled:active, +.adminhtml-system-variable-index .page-actions .add[disabled]:hover, +.adminhtml-system-variable-index .page-actions .add.disabled:hover, +.adminhtml-system-variable-index .page-actions .add[disabled]:active, +.adminhtml-system-variable-index .page-actions .add.disabled:active, +.adminhtml-user-index .page-actions .add[disabled]:hover, +.adminhtml-user-index .page-actions .add.disabled:hover, +.adminhtml-user-index .page-actions .add[disabled]:active, +.adminhtml-user-index .page-actions .add.disabled:active, +.adminhtml-user-role-index .page-actions .add[disabled]:hover, +.adminhtml-user-role-index .page-actions .add.disabled:hover, +.adminhtml-user-role-index .page-actions .add[disabled]:active, +.adminhtml-user-role-index .page-actions .add.disabled:active, +.adminhtml-integration-index .page-actions .add[disabled]:hover, +.adminhtml-integration-index .page-actions .add.disabled:hover, +.adminhtml-integration-index .page-actions .add[disabled]:active, +.adminhtml-integration-index .page-actions .add.disabled:active, +.adminhtml-system-design-theme-index .page-actions .add[disabled]:hover, +.adminhtml-system-design-theme-index .page-actions .add.disabled:hover, +.adminhtml-system-design-theme-index .page-actions .add[disabled]:active, +.adminhtml-system-design-theme-index .page-actions .add.disabled:active, +.adminhtml-system-design-index .page-actions .add[disabled]:hover, +.adminhtml-system-design-index .page-actions .add.disabled:hover, +.adminhtml-system-design-index .page-actions .add[disabled]:active, +.adminhtml-system-design-index .page-actions .add.disabled:active, +.adminhtml-customer-attribute-index .page-actions .add[disabled]:hover, +.adminhtml-customer-attribute-index .page-actions .add.disabled:hover, +.adminhtml-customer-attribute-index .page-actions .add[disabled]:active, +.adminhtml-customer-attribute-index .page-actions .add.disabled:active, +.adminhtml-customer-address-attribute-index .page-actions .add[disabled]:hover, +.adminhtml-customer-address-attribute-index .page-actions .add.disabled:hover, +.adminhtml-customer-address-attribute-index .page-actions .add[disabled]:active, +.adminhtml-customer-address-attribute-index .page-actions .add.disabled:active, +.rating-index-index .page-actions .add[disabled]:hover, +.rating-index-index .page-actions .add.disabled:hover, +.rating-index-index .page-actions .add[disabled]:active, +.rating-index-index .page-actions .add.disabled:active, +.tax-rule-index .page-actions .add[disabled]:hover, +.tax-rule-index .page-actions .add.disabled:hover, +.tax-rule-index .page-actions .add[disabled]:active, +.tax-rule-index .page-actions .add.disabled:active, +.tax-rate-index .page-actions .add[disabled]:hover, +.tax-rate-index .page-actions .add.disabled:hover, +.tax-rate-index .page-actions .add[disabled]:active, +.tax-rate-index .page-actions .add.disabled:active, +.adminhtml-rma-item-attribute-index .page-actions .add[disabled]:hover, +.adminhtml-rma-item-attribute-index .page-actions .add.disabled:hover, +.adminhtml-rma-item-attribute-index .page-actions .add[disabled]:active, +.adminhtml-rma-item-attribute-index .page-actions .add.disabled:active, +.adminhtml-reward-rate-index .page-actions .add[disabled]:hover, +.adminhtml-reward-rate-index .page-actions .add.disabled:hover, +.adminhtml-reward-rate-index .page-actions .add[disabled]:active, +.adminhtml-reward-rate-index .page-actions .add.disabled:active, +.customer-group-index .page-actions .add[disabled]:hover, +.customer-group-index .page-actions .add.disabled:hover, +.customer-group-index .page-actions .add[disabled]:active, +.customer-group-index .page-actions .add.disabled:active, +.checkout-agreement-index .page-actions .add[disabled]:hover, +.checkout-agreement-index .page-actions .add.disabled:hover, +.checkout-agreement-index .page-actions .add[disabled]:active, +.checkout-agreement-index .page-actions .add.disabled:active, +.catalog-product-attribute-index .page-actions .add[disabled]:hover, +.catalog-product-attribute-index .page-actions .add.disabled:hover, +.catalog-product-attribute-index .page-actions .add[disabled]:active, +.catalog-product-attribute-index .page-actions .add.disabled:active, +.catalog-product-set-index .page-actions .add[disabled]:hover, +.catalog-product-set-index .page-actions .add.disabled:hover, +.catalog-product-set-index .page-actions .add[disabled]:active, +.catalog-product-set-index .page-actions .add.disabled:active, +.catalog-product-new .actions-split > .action-toggle.primary[disabled]:hover, +.catalog-product-new .actions-split > .action-toggle.primary.disabled:hover, +.catalog-product-new .actions-split > .action-toggle.primary[disabled]:active, +.catalog-product-new .actions-split > .action-toggle.primary.disabled:active, +.catalog-product-edit .actions-split > .action-toggle.primary[disabled]:hover, +.catalog-product-edit .actions-split > .action-toggle.primary.disabled:hover, +.catalog-product-edit .actions-split > .action-toggle.primary[disabled]:active, +.catalog-product-edit .actions-split > .action-toggle.primary.disabled:active, +.catalog-product-index .actions-split > .action-toggle.primary[disabled]:hover, +.catalog-product-index .actions-split > .action-toggle.primary.disabled:hover, +.catalog-product-index .actions-split > .action-toggle.primary[disabled]:active, +.catalog-product-index .actions-split > .action-toggle.primary.disabled:active, +.adminhtml-integration-new .actions-split > .action-toggle.primary[disabled]:hover, +.adminhtml-integration-new .actions-split > .action-toggle.primary.disabled:hover, +.adminhtml-integration-new .actions-split > .action-toggle.primary[disabled]:active, +.adminhtml-integration-new .actions-split > .action-toggle.primary.disabled:active, +.catalog-product-new .actions-split.btn-round .action-default.primary[disabled]:hover, +.catalog-product-new .actions-split.btn-round .action-default.primary.disabled:hover, +.catalog-product-new .actions-split.btn-round .action-default.primary[disabled]:active, +.catalog-product-new .actions-split.btn-round .action-default.primary.disabled:active, +.catalog-product-edit .actions-split.btn-round .action-default.primary[disabled]:hover, +.catalog-product-edit .actions-split.btn-round .action-default.primary.disabled:hover, +.catalog-product-edit .actions-split.btn-round .action-default.primary[disabled]:active, +.catalog-product-edit .actions-split.btn-round .action-default.primary.disabled:active, +.catalog-product-index .actions-split.btn-round .action-default.primary[disabled]:hover, +.catalog-product-index .actions-split.btn-round .action-default.primary.disabled:hover, +.catalog-product-index .actions-split.btn-round .action-default.primary[disabled]:active, +.catalog-product-index .actions-split.btn-round .action-default.primary.disabled:active, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary[disabled]:hover, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary.disabled:hover, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary[disabled]:active, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary.disabled:active { + color: #676056; + background: #f2ebde; + border: 1px solid #ada89e; +} +.PrimaryButton, +.PrimaryAddButton, +.PrimarySplitButton > .action-toggle.primary, +input[type=button].primary, +input[type=submit].primary, +input[type=reset].primary, +button.primary, +[class^="action-"].primary, +.popup-window .add-widget.primary, +.PrimarySplitButton.btn-round .action-default.primary, +.sales-order-index .page-actions .add, +.adminhtml-rma-index .page-actions .add, +.adminhtml-catalog-event-index .page-actions .add, +.adminhtml-urlrewrite-index .page-actions .add, +.catalog-search-index .page-actions .add, +.catalog-product-review-index .page-actions .add, +.catalog-rule-promo-catalog-index .page-actions .add, +.sales-rule-promo-quote-index .page-actions .add, +.adminhtml-reminder-index .page-actions .add, +.newsletter-template-index .page-actions .add, +.adminhtml-system-email-template-index .page-actions .add, +.adminhtml-sitemap-index .page-actions .add, +.adminhtml-googleshopping-types-index .page-actions .add, +.customer-index-index .page-actions .add, +.adminhtml-cms-page-index .page-actions .add, +.cms-block-index .page-actions .add, +.adminhtml-banner-index .page-actions .add, +.adminhtml-widget-instance-index .page-actions .add, +.cms-page-index .page-actions .add, +.adminhtml-webapi-user-index .page-actions .add, +.adminhtml-webapi-role-index .page-actions .add, +.adminhtml-system-variable-index .page-actions .add, +.adminhtml-user-index .page-actions .add, +.adminhtml-user-role-index .page-actions .add, +.adminhtml-integration-index .page-actions .add, +.adminhtml-system-design-theme-index .page-actions .add, +.adminhtml-system-design-index .page-actions .add, +.adminhtml-customer-attribute-index .page-actions .add, +.adminhtml-customer-address-attribute-index .page-actions .add, +.rating-index-index .page-actions .add, +.tax-rule-index .page-actions .add, +.tax-rate-index .page-actions .add, +.adminhtml-rma-item-attribute-index .page-actions .add, +.adminhtml-reward-rate-index .page-actions .add, +.customer-group-index .page-actions .add, +.checkout-agreement-index .page-actions .add, +.catalog-product-attribute-index .page-actions .add, +.catalog-product-set-index .page-actions .add, +.catalog-product-new .actions-split > .action-toggle.primary, +.catalog-product-edit .actions-split > .action-toggle.primary, +.catalog-product-index .actions-split > .action-toggle.primary, +.adminhtml-integration-new .actions-split > .action-toggle.primary, +.catalog-product-new .actions-split.btn-round .action-default.primary, +.catalog-product-edit .actions-split.btn-round .action-default.primary, +.catalog-product-index .actions-split.btn-round .action-default.primary, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary, +.PrimaryAddButton, +.PrimarySplitButton > .action-toggle.primary, +input[type=button].primary, +input[type=submit].primary, +input[type=reset].primary, +button.primary, +[class^="action-"].primary, +.popup-window .add-widget.primary, +.PrimarySplitButton.btn-round .action-default.primary, +.sales-order-index .page-actions .add, +.adminhtml-rma-index .page-actions .add, +.adminhtml-catalog-event-index .page-actions .add, +.adminhtml-urlrewrite-index .page-actions .add, +.catalog-search-index .page-actions .add, +.catalog-product-review-index .page-actions .add, +.catalog-rule-promo-catalog-index .page-actions .add, +.sales-rule-promo-quote-index .page-actions .add, +.adminhtml-reminder-index .page-actions .add, +.newsletter-template-index .page-actions .add, +.adminhtml-system-email-template-index .page-actions .add, +.adminhtml-sitemap-index .page-actions .add, +.adminhtml-googleshopping-types-index .page-actions .add, +.customer-index-index .page-actions .add, +.adminhtml-cms-page-index .page-actions .add, +.cms-block-index .page-actions .add, +.adminhtml-banner-index .page-actions .add, +.adminhtml-widget-instance-index .page-actions .add, +.cms-page-index .page-actions .add, +.adminhtml-webapi-user-index .page-actions .add, +.adminhtml-webapi-role-index .page-actions .add, +.adminhtml-system-variable-index .page-actions .add, +.adminhtml-user-index .page-actions .add, +.adminhtml-user-role-index .page-actions .add, +.adminhtml-integration-index .page-actions .add, +.adminhtml-system-design-theme-index .page-actions .add, +.adminhtml-system-design-index .page-actions .add, +.adminhtml-customer-attribute-index .page-actions .add, +.adminhtml-customer-address-attribute-index .page-actions .add, +.rating-index-index .page-actions .add, +.tax-rule-index .page-actions .add, +.tax-rate-index .page-actions .add, +.adminhtml-rma-item-attribute-index .page-actions .add, +.adminhtml-reward-rate-index .page-actions .add, +.customer-group-index .page-actions .add, +.checkout-agreement-index .page-actions .add, +.catalog-product-attribute-index .page-actions .add, +.catalog-product-set-index .page-actions .add, +.catalog-product-new .actions-split > .action-toggle.primary, +.catalog-product-edit .actions-split > .action-toggle.primary, +.catalog-product-index .actions-split > .action-toggle.primary, +.adminhtml-integration-new .actions-split > .action-toggle.primary, +.catalog-product-new .actions-split.btn-round .action-default.primary, +.catalog-product-edit .actions-split.btn-round .action-default.primary, +.catalog-product-index .actions-split.btn-round .action-default.primary, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary { + color: #fff; + background: #007dbd; + border: 1px solid #0574ad; +} +.PrimaryButton:focus, +.PrimaryButton:hover, +.PrimaryAddButton:focus, +.PrimaryAddButton:hover, +.PrimarySplitButton > .action-toggle.primary:focus, +.PrimarySplitButton > .action-toggle.primary:hover, +input[type=button].primary:focus, +input[type=button].primary:hover, +input[type=submit].primary:focus, +input[type=submit].primary:hover, +input[type=reset].primary:focus, +input[type=reset].primary:hover, +button.primary:focus, +button.primary:hover, +[class^="action-"].primary:focus, +[class^="action-"].primary:hover, +.popup-window .add-widget.primary:focus, +.popup-window .add-widget.primary:hover, +.PrimarySplitButton.btn-round .action-default.primary:focus, +.PrimarySplitButton.btn-round .action-default.primary:hover, +.sales-order-index .page-actions .add:focus, +.sales-order-index .page-actions .add:hover, +.adminhtml-rma-index .page-actions .add:focus, +.adminhtml-rma-index .page-actions .add:hover, +.adminhtml-catalog-event-index .page-actions .add:focus, +.adminhtml-catalog-event-index .page-actions .add:hover, +.adminhtml-urlrewrite-index .page-actions .add:focus, +.adminhtml-urlrewrite-index .page-actions .add:hover, +.catalog-search-index .page-actions .add:focus, +.catalog-search-index .page-actions .add:hover, +.catalog-product-review-index .page-actions .add:focus, +.catalog-product-review-index .page-actions .add:hover, +.catalog-rule-promo-catalog-index .page-actions .add:focus, +.catalog-rule-promo-catalog-index .page-actions .add:hover, +.sales-rule-promo-quote-index .page-actions .add:focus, +.sales-rule-promo-quote-index .page-actions .add:hover, +.adminhtml-reminder-index .page-actions .add:focus, +.adminhtml-reminder-index .page-actions .add:hover, +.newsletter-template-index .page-actions .add:focus, +.newsletter-template-index .page-actions .add:hover, +.adminhtml-system-email-template-index .page-actions .add:focus, +.adminhtml-system-email-template-index .page-actions .add:hover, +.adminhtml-sitemap-index .page-actions .add:focus, +.adminhtml-sitemap-index .page-actions .add:hover, +.adminhtml-googleshopping-types-index .page-actions .add:focus, +.adminhtml-googleshopping-types-index .page-actions .add:hover, +.customer-index-index .page-actions .add:focus, +.customer-index-index .page-actions .add:hover, +.adminhtml-cms-page-index .page-actions .add:focus, +.adminhtml-cms-page-index .page-actions .add:hover, +.cms-block-index .page-actions .add:focus, +.cms-block-index .page-actions .add:hover, +.adminhtml-banner-index .page-actions .add:focus, +.adminhtml-banner-index .page-actions .add:hover, +.adminhtml-widget-instance-index .page-actions .add:focus, +.adminhtml-widget-instance-index .page-actions .add:hover, +.cms-page-index .page-actions .add:focus, +.cms-page-index .page-actions .add:hover, +.adminhtml-webapi-user-index .page-actions .add:focus, +.adminhtml-webapi-user-index .page-actions .add:hover, +.adminhtml-webapi-role-index .page-actions .add:focus, +.adminhtml-webapi-role-index .page-actions .add:hover, +.adminhtml-system-variable-index .page-actions .add:focus, +.adminhtml-system-variable-index .page-actions .add:hover, +.adminhtml-user-index .page-actions .add:focus, +.adminhtml-user-index .page-actions .add:hover, +.adminhtml-user-role-index .page-actions .add:focus, +.adminhtml-user-role-index .page-actions .add:hover, +.adminhtml-integration-index .page-actions .add:focus, +.adminhtml-integration-index .page-actions .add:hover, +.adminhtml-system-design-theme-index .page-actions .add:focus, +.adminhtml-system-design-theme-index .page-actions .add:hover, +.adminhtml-system-design-index .page-actions .add:focus, +.adminhtml-system-design-index .page-actions .add:hover, +.adminhtml-customer-attribute-index .page-actions .add:focus, +.adminhtml-customer-attribute-index .page-actions .add:hover, +.adminhtml-customer-address-attribute-index .page-actions .add:focus, +.adminhtml-customer-address-attribute-index .page-actions .add:hover, +.rating-index-index .page-actions .add:focus, +.rating-index-index .page-actions .add:hover, +.tax-rule-index .page-actions .add:focus, +.tax-rule-index .page-actions .add:hover, +.tax-rate-index .page-actions .add:focus, +.tax-rate-index .page-actions .add:hover, +.adminhtml-rma-item-attribute-index .page-actions .add:focus, +.adminhtml-rma-item-attribute-index .page-actions .add:hover, +.adminhtml-reward-rate-index .page-actions .add:focus, +.adminhtml-reward-rate-index .page-actions .add:hover, +.customer-group-index .page-actions .add:focus, +.customer-group-index .page-actions .add:hover, +.checkout-agreement-index .page-actions .add:focus, +.checkout-agreement-index .page-actions .add:hover, +.catalog-product-attribute-index .page-actions .add:focus, +.catalog-product-attribute-index .page-actions .add:hover, +.catalog-product-set-index .page-actions .add:focus, +.catalog-product-set-index .page-actions .add:hover, +.catalog-product-new .actions-split > .action-toggle.primary:focus, +.catalog-product-new .actions-split > .action-toggle.primary:hover, +.catalog-product-edit .actions-split > .action-toggle.primary:focus, +.catalog-product-edit .actions-split > .action-toggle.primary:hover, +.catalog-product-index .actions-split > .action-toggle.primary:focus, +.catalog-product-index .actions-split > .action-toggle.primary:hover, +.adminhtml-integration-new .actions-split > .action-toggle.primary:focus, +.adminhtml-integration-new .actions-split > .action-toggle.primary:hover, +.catalog-product-new .actions-split.btn-round .action-default.primary:focus, +.catalog-product-new .actions-split.btn-round .action-default.primary:hover, +.catalog-product-edit .actions-split.btn-round .action-default.primary:focus, +.catalog-product-edit .actions-split.btn-round .action-default.primary:hover, +.catalog-product-index .actions-split.btn-round .action-default.primary:focus, +.catalog-product-index .actions-split.btn-round .action-default.primary:hover, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:focus, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:hover { + color: #fff; + background: #026294; + border: 1px solid #026294; +} +.PrimaryButton:active, +.PrimaryAddButton:active, +.PrimarySplitButton > .action-toggle.primary:active, +input[type=button].primary:active, +input[type=submit].primary:active, +input[type=reset].primary:active, +button.primary:active, +[class^="action-"].primary:active, +.popup-window .add-widget.primary:active, +.PrimarySplitButton.btn-round .action-default.primary:active, +.sales-order-index .page-actions .add:active, +.adminhtml-rma-index .page-actions .add:active, +.adminhtml-catalog-event-index .page-actions .add:active, +.adminhtml-urlrewrite-index .page-actions .add:active, +.catalog-search-index .page-actions .add:active, +.catalog-product-review-index .page-actions .add:active, +.catalog-rule-promo-catalog-index .page-actions .add:active, +.sales-rule-promo-quote-index .page-actions .add:active, +.adminhtml-reminder-index .page-actions .add:active, +.newsletter-template-index .page-actions .add:active, +.adminhtml-system-email-template-index .page-actions .add:active, +.adminhtml-sitemap-index .page-actions .add:active, +.adminhtml-googleshopping-types-index .page-actions .add:active, +.customer-index-index .page-actions .add:active, +.adminhtml-cms-page-index .page-actions .add:active, +.cms-block-index .page-actions .add:active, +.adminhtml-banner-index .page-actions .add:active, +.adminhtml-widget-instance-index .page-actions .add:active, +.cms-page-index .page-actions .add:active, +.adminhtml-webapi-user-index .page-actions .add:active, +.adminhtml-webapi-role-index .page-actions .add:active, +.adminhtml-system-variable-index .page-actions .add:active, +.adminhtml-user-index .page-actions .add:active, +.adminhtml-user-role-index .page-actions .add:active, +.adminhtml-integration-index .page-actions .add:active, +.adminhtml-system-design-theme-index .page-actions .add:active, +.adminhtml-system-design-index .page-actions .add:active, +.adminhtml-customer-attribute-index .page-actions .add:active, +.adminhtml-customer-address-attribute-index .page-actions .add:active, +.rating-index-index .page-actions .add:active, +.tax-rule-index .page-actions .add:active, +.tax-rate-index .page-actions .add:active, +.adminhtml-rma-item-attribute-index .page-actions .add:active, +.adminhtml-reward-rate-index .page-actions .add:active, +.customer-group-index .page-actions .add:active, +.checkout-agreement-index .page-actions .add:active, +.catalog-product-attribute-index .page-actions .add:active, +.catalog-product-set-index .page-actions .add:active, +.catalog-product-new .actions-split > .action-toggle.primary:active, +.catalog-product-edit .actions-split > .action-toggle.primary:active, +.catalog-product-index .actions-split > .action-toggle.primary:active, +.adminhtml-integration-new .actions-split > .action-toggle.primary:active, +.catalog-product-new .actions-split.btn-round .action-default.primary:active, +.catalog-product-edit .actions-split.btn-round .action-default.primary:active, +.catalog-product-index .actions-split.btn-round .action-default.primary:active, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:active { + color: #fff; + background: #026294; + border: 1px solid #004c74; +} +.PrimaryButton:visited, +.PrimaryAddButton:visited, +.PrimarySplitButton > .action-toggle.primary:visited, +input[type=button].primary:visited, +input[type=submit].primary:visited, +input[type=reset].primary:visited, +button.primary:visited, +[class^="action-"].primary:visited, +.popup-window .add-widget.primary:visited, +.PrimarySplitButton.btn-round .action-default.primary:visited, +.sales-order-index .page-actions .add:visited, +.adminhtml-rma-index .page-actions .add:visited, +.adminhtml-catalog-event-index .page-actions .add:visited, +.adminhtml-urlrewrite-index .page-actions .add:visited, +.catalog-search-index .page-actions .add:visited, +.catalog-product-review-index .page-actions .add:visited, +.catalog-rule-promo-catalog-index .page-actions .add:visited, +.sales-rule-promo-quote-index .page-actions .add:visited, +.adminhtml-reminder-index .page-actions .add:visited, +.newsletter-template-index .page-actions .add:visited, +.adminhtml-system-email-template-index .page-actions .add:visited, +.adminhtml-sitemap-index .page-actions .add:visited, +.adminhtml-googleshopping-types-index .page-actions .add:visited, +.customer-index-index .page-actions .add:visited, +.adminhtml-cms-page-index .page-actions .add:visited, +.cms-block-index .page-actions .add:visited, +.adminhtml-banner-index .page-actions .add:visited, +.adminhtml-widget-instance-index .page-actions .add:visited, +.cms-page-index .page-actions .add:visited, +.adminhtml-webapi-user-index .page-actions .add:visited, +.adminhtml-webapi-role-index .page-actions .add:visited, +.adminhtml-system-variable-index .page-actions .add:visited, +.adminhtml-user-index .page-actions .add:visited, +.adminhtml-user-role-index .page-actions .add:visited, +.adminhtml-integration-index .page-actions .add:visited, +.adminhtml-system-design-theme-index .page-actions .add:visited, +.adminhtml-system-design-index .page-actions .add:visited, +.adminhtml-customer-attribute-index .page-actions .add:visited, +.adminhtml-customer-address-attribute-index .page-actions .add:visited, +.rating-index-index .page-actions .add:visited, +.tax-rule-index .page-actions .add:visited, +.tax-rate-index .page-actions .add:visited, +.adminhtml-rma-item-attribute-index .page-actions .add:visited, +.adminhtml-reward-rate-index .page-actions .add:visited, +.customer-group-index .page-actions .add:visited, +.checkout-agreement-index .page-actions .add:visited, +.catalog-product-attribute-index .page-actions .add:visited, +.catalog-product-set-index .page-actions .add:visited, +.catalog-product-new .actions-split > .action-toggle.primary:visited, +.catalog-product-edit .actions-split > .action-toggle.primary:visited, +.catalog-product-index .actions-split > .action-toggle.primary:visited, +.adminhtml-integration-new .actions-split > .action-toggle.primary:visited, +.catalog-product-new .actions-split.btn-round .action-default.primary:visited, +.catalog-product-edit .actions-split.btn-round .action-default.primary:visited, +.catalog-product-index .actions-split.btn-round .action-default.primary:visited, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:visited { + color: #fff; +} +.PrimaryButton[disabled]:hover, +.PrimaryButton.disabled:hover, +.PrimaryButton[disabled]:active, +.PrimaryButton.disabled:active, +.PrimaryAddButton[disabled]:hover, +.PrimaryAddButton.disabled:hover, +.PrimaryAddButton[disabled]:active, +.PrimaryAddButton.disabled:active, +.PrimarySplitButton > .action-toggle.primary[disabled]:hover, +.PrimarySplitButton > .action-toggle.primary.disabled:hover, +.PrimarySplitButton > .action-toggle.primary[disabled]:active, +.PrimarySplitButton > .action-toggle.primary.disabled:active, +input[type=button].primary[disabled]:hover, +input[type=button].primary.disabled:hover, +input[type=button].primary[disabled]:active, +input[type=button].primary.disabled:active, +input[type=submit].primary[disabled]:hover, +input[type=submit].primary.disabled:hover, +input[type=submit].primary[disabled]:active, +input[type=submit].primary.disabled:active, +input[type=reset].primary[disabled]:hover, +input[type=reset].primary.disabled:hover, +input[type=reset].primary[disabled]:active, +input[type=reset].primary.disabled:active, +button.primary[disabled]:hover, +button.primary.disabled:hover, +button.primary[disabled]:active, +button.primary.disabled:active, +[class^="action-"].primary[disabled]:hover, +[class^="action-"].primary.disabled:hover, +[class^="action-"].primary[disabled]:active, +[class^="action-"].primary.disabled:active, +.popup-window .add-widget.primary[disabled]:hover, +.popup-window .add-widget.primary.disabled:hover, +.popup-window .add-widget.primary[disabled]:active, +.popup-window .add-widget.primary.disabled:active, +.PrimarySplitButton.btn-round .action-default.primary[disabled]:hover, +.PrimarySplitButton.btn-round .action-default.primary.disabled:hover, +.PrimarySplitButton.btn-round .action-default.primary[disabled]:active, +.PrimarySplitButton.btn-round .action-default.primary.disabled:active, +.sales-order-index .page-actions .add[disabled]:hover, +.sales-order-index .page-actions .add.disabled:hover, +.sales-order-index .page-actions .add[disabled]:active, +.sales-order-index .page-actions .add.disabled:active, +.adminhtml-rma-index .page-actions .add[disabled]:hover, +.adminhtml-rma-index .page-actions .add.disabled:hover, +.adminhtml-rma-index .page-actions .add[disabled]:active, +.adminhtml-rma-index .page-actions .add.disabled:active, +.adminhtml-catalog-event-index .page-actions .add[disabled]:hover, +.adminhtml-catalog-event-index .page-actions .add.disabled:hover, +.adminhtml-catalog-event-index .page-actions .add[disabled]:active, +.adminhtml-catalog-event-index .page-actions .add.disabled:active, +.adminhtml-urlrewrite-index .page-actions .add[disabled]:hover, +.adminhtml-urlrewrite-index .page-actions .add.disabled:hover, +.adminhtml-urlrewrite-index .page-actions .add[disabled]:active, +.adminhtml-urlrewrite-index .page-actions .add.disabled:active, +.catalog-search-index .page-actions .add[disabled]:hover, +.catalog-search-index .page-actions .add.disabled:hover, +.catalog-search-index .page-actions .add[disabled]:active, +.catalog-search-index .page-actions .add.disabled:active, +.catalog-product-review-index .page-actions .add[disabled]:hover, +.catalog-product-review-index .page-actions .add.disabled:hover, +.catalog-product-review-index .page-actions .add[disabled]:active, +.catalog-product-review-index .page-actions .add.disabled:active, +.catalog-rule-promo-catalog-index .page-actions .add[disabled]:hover, +.catalog-rule-promo-catalog-index .page-actions .add.disabled:hover, +.catalog-rule-promo-catalog-index .page-actions .add[disabled]:active, +.catalog-rule-promo-catalog-index .page-actions .add.disabled:active, +.sales-rule-promo-quote-index .page-actions .add[disabled]:hover, +.sales-rule-promo-quote-index .page-actions .add.disabled:hover, +.sales-rule-promo-quote-index .page-actions .add[disabled]:active, +.sales-rule-promo-quote-index .page-actions .add.disabled:active, +.adminhtml-reminder-index .page-actions .add[disabled]:hover, +.adminhtml-reminder-index .page-actions .add.disabled:hover, +.adminhtml-reminder-index .page-actions .add[disabled]:active, +.adminhtml-reminder-index .page-actions .add.disabled:active, +.newsletter-template-index .page-actions .add[disabled]:hover, +.newsletter-template-index .page-actions .add.disabled:hover, +.newsletter-template-index .page-actions .add[disabled]:active, +.newsletter-template-index .page-actions .add.disabled:active, +.adminhtml-system-email-template-index .page-actions .add[disabled]:hover, +.adminhtml-system-email-template-index .page-actions .add.disabled:hover, +.adminhtml-system-email-template-index .page-actions .add[disabled]:active, +.adminhtml-system-email-template-index .page-actions .add.disabled:active, +.adminhtml-sitemap-index .page-actions .add[disabled]:hover, +.adminhtml-sitemap-index .page-actions .add.disabled:hover, +.adminhtml-sitemap-index .page-actions .add[disabled]:active, +.adminhtml-sitemap-index .page-actions .add.disabled:active, +.adminhtml-googleshopping-types-index .page-actions .add[disabled]:hover, +.adminhtml-googleshopping-types-index .page-actions .add.disabled:hover, +.adminhtml-googleshopping-types-index .page-actions .add[disabled]:active, +.adminhtml-googleshopping-types-index .page-actions .add.disabled:active, +.customer-index-index .page-actions .add[disabled]:hover, +.customer-index-index .page-actions .add.disabled:hover, +.customer-index-index .page-actions .add[disabled]:active, +.customer-index-index .page-actions .add.disabled:active, +.adminhtml-cms-page-index .page-actions .add[disabled]:hover, +.adminhtml-cms-page-index .page-actions .add.disabled:hover, +.adminhtml-cms-page-index .page-actions .add[disabled]:active, +.adminhtml-cms-page-index .page-actions .add.disabled:active, +.cms-block-index .page-actions .add[disabled]:hover, +.cms-block-index .page-actions .add.disabled:hover, +.cms-block-index .page-actions .add[disabled]:active, +.cms-block-index .page-actions .add.disabled:active, +.adminhtml-banner-index .page-actions .add[disabled]:hover, +.adminhtml-banner-index .page-actions .add.disabled:hover, +.adminhtml-banner-index .page-actions .add[disabled]:active, +.adminhtml-banner-index .page-actions .add.disabled:active, +.adminhtml-widget-instance-index .page-actions .add[disabled]:hover, +.adminhtml-widget-instance-index .page-actions .add.disabled:hover, +.adminhtml-widget-instance-index .page-actions .add[disabled]:active, +.adminhtml-widget-instance-index .page-actions .add.disabled:active, +.cms-page-index .page-actions .add[disabled]:hover, +.cms-page-index .page-actions .add.disabled:hover, +.cms-page-index .page-actions .add[disabled]:active, +.cms-page-index .page-actions .add.disabled:active, +.adminhtml-webapi-user-index .page-actions .add[disabled]:hover, +.adminhtml-webapi-user-index .page-actions .add.disabled:hover, +.adminhtml-webapi-user-index .page-actions .add[disabled]:active, +.adminhtml-webapi-user-index .page-actions .add.disabled:active, +.adminhtml-webapi-role-index .page-actions .add[disabled]:hover, +.adminhtml-webapi-role-index .page-actions .add.disabled:hover, +.adminhtml-webapi-role-index .page-actions .add[disabled]:active, +.adminhtml-webapi-role-index .page-actions .add.disabled:active, +.adminhtml-system-variable-index .page-actions .add[disabled]:hover, +.adminhtml-system-variable-index .page-actions .add.disabled:hover, +.adminhtml-system-variable-index .page-actions .add[disabled]:active, +.adminhtml-system-variable-index .page-actions .add.disabled:active, +.adminhtml-user-index .page-actions .add[disabled]:hover, +.adminhtml-user-index .page-actions .add.disabled:hover, +.adminhtml-user-index .page-actions .add[disabled]:active, +.adminhtml-user-index .page-actions .add.disabled:active, +.adminhtml-user-role-index .page-actions .add[disabled]:hover, +.adminhtml-user-role-index .page-actions .add.disabled:hover, +.adminhtml-user-role-index .page-actions .add[disabled]:active, +.adminhtml-user-role-index .page-actions .add.disabled:active, +.adminhtml-integration-index .page-actions .add[disabled]:hover, +.adminhtml-integration-index .page-actions .add.disabled:hover, +.adminhtml-integration-index .page-actions .add[disabled]:active, +.adminhtml-integration-index .page-actions .add.disabled:active, +.adminhtml-system-design-theme-index .page-actions .add[disabled]:hover, +.adminhtml-system-design-theme-index .page-actions .add.disabled:hover, +.adminhtml-system-design-theme-index .page-actions .add[disabled]:active, +.adminhtml-system-design-theme-index .page-actions .add.disabled:active, +.adminhtml-system-design-index .page-actions .add[disabled]:hover, +.adminhtml-system-design-index .page-actions .add.disabled:hover, +.adminhtml-system-design-index .page-actions .add[disabled]:active, +.adminhtml-system-design-index .page-actions .add.disabled:active, +.adminhtml-customer-attribute-index .page-actions .add[disabled]:hover, +.adminhtml-customer-attribute-index .page-actions .add.disabled:hover, +.adminhtml-customer-attribute-index .page-actions .add[disabled]:active, +.adminhtml-customer-attribute-index .page-actions .add.disabled:active, +.adminhtml-customer-address-attribute-index .page-actions .add[disabled]:hover, +.adminhtml-customer-address-attribute-index .page-actions .add.disabled:hover, +.adminhtml-customer-address-attribute-index .page-actions .add[disabled]:active, +.adminhtml-customer-address-attribute-index .page-actions .add.disabled:active, +.rating-index-index .page-actions .add[disabled]:hover, +.rating-index-index .page-actions .add.disabled:hover, +.rating-index-index .page-actions .add[disabled]:active, +.rating-index-index .page-actions .add.disabled:active, +.tax-rule-index .page-actions .add[disabled]:hover, +.tax-rule-index .page-actions .add.disabled:hover, +.tax-rule-index .page-actions .add[disabled]:active, +.tax-rule-index .page-actions .add.disabled:active, +.tax-rate-index .page-actions .add[disabled]:hover, +.tax-rate-index .page-actions .add.disabled:hover, +.tax-rate-index .page-actions .add[disabled]:active, +.tax-rate-index .page-actions .add.disabled:active, +.adminhtml-rma-item-attribute-index .page-actions .add[disabled]:hover, +.adminhtml-rma-item-attribute-index .page-actions .add.disabled:hover, +.adminhtml-rma-item-attribute-index .page-actions .add[disabled]:active, +.adminhtml-rma-item-attribute-index .page-actions .add.disabled:active, +.adminhtml-reward-rate-index .page-actions .add[disabled]:hover, +.adminhtml-reward-rate-index .page-actions .add.disabled:hover, +.adminhtml-reward-rate-index .page-actions .add[disabled]:active, +.adminhtml-reward-rate-index .page-actions .add.disabled:active, +.customer-group-index .page-actions .add[disabled]:hover, +.customer-group-index .page-actions .add.disabled:hover, +.customer-group-index .page-actions .add[disabled]:active, +.customer-group-index .page-actions .add.disabled:active, +.checkout-agreement-index .page-actions .add[disabled]:hover, +.checkout-agreement-index .page-actions .add.disabled:hover, +.checkout-agreement-index .page-actions .add[disabled]:active, +.checkout-agreement-index .page-actions .add.disabled:active, +.catalog-product-attribute-index .page-actions .add[disabled]:hover, +.catalog-product-attribute-index .page-actions .add.disabled:hover, +.catalog-product-attribute-index .page-actions .add[disabled]:active, +.catalog-product-attribute-index .page-actions .add.disabled:active, +.catalog-product-set-index .page-actions .add[disabled]:hover, +.catalog-product-set-index .page-actions .add.disabled:hover, +.catalog-product-set-index .page-actions .add[disabled]:active, +.catalog-product-set-index .page-actions .add.disabled:active, +.catalog-product-new .actions-split > .action-toggle.primary[disabled]:hover, +.catalog-product-new .actions-split > .action-toggle.primary.disabled:hover, +.catalog-product-new .actions-split > .action-toggle.primary[disabled]:active, +.catalog-product-new .actions-split > .action-toggle.primary.disabled:active, +.catalog-product-edit .actions-split > .action-toggle.primary[disabled]:hover, +.catalog-product-edit .actions-split > .action-toggle.primary.disabled:hover, +.catalog-product-edit .actions-split > .action-toggle.primary[disabled]:active, +.catalog-product-edit .actions-split > .action-toggle.primary.disabled:active, +.catalog-product-index .actions-split > .action-toggle.primary[disabled]:hover, +.catalog-product-index .actions-split > .action-toggle.primary.disabled:hover, +.catalog-product-index .actions-split > .action-toggle.primary[disabled]:active, +.catalog-product-index .actions-split > .action-toggle.primary.disabled:active, +.adminhtml-integration-new .actions-split > .action-toggle.primary[disabled]:hover, +.adminhtml-integration-new .actions-split > .action-toggle.primary.disabled:hover, +.adminhtml-integration-new .actions-split > .action-toggle.primary[disabled]:active, +.adminhtml-integration-new .actions-split > .action-toggle.primary.disabled:active, +.catalog-product-new .actions-split.btn-round .action-default.primary[disabled]:hover, +.catalog-product-new .actions-split.btn-round .action-default.primary.disabled:hover, +.catalog-product-new .actions-split.btn-round .action-default.primary[disabled]:active, +.catalog-product-new .actions-split.btn-round .action-default.primary.disabled:active, +.catalog-product-edit .actions-split.btn-round .action-default.primary[disabled]:hover, +.catalog-product-edit .actions-split.btn-round .action-default.primary.disabled:hover, +.catalog-product-edit .actions-split.btn-round .action-default.primary[disabled]:active, +.catalog-product-edit .actions-split.btn-round .action-default.primary.disabled:active, +.catalog-product-index .actions-split.btn-round .action-default.primary[disabled]:hover, +.catalog-product-index .actions-split.btn-round .action-default.primary.disabled:hover, +.catalog-product-index .actions-split.btn-round .action-default.primary[disabled]:active, +.catalog-product-index .actions-split.btn-round .action-default.primary.disabled:active, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary[disabled]:hover, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary.disabled:hover, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary[disabled]:active, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary.disabled:active { + color: #fff; + background: #007dbd; + border: 1px solid #0574ad; +} +.PrimaryAddButton, +.PrimarySplitButton.btn-round .action-default.primary, +.sales-order-index .page-actions .add, +.adminhtml-rma-index .page-actions .add, +.adminhtml-catalog-event-index .page-actions .add, +.adminhtml-urlrewrite-index .page-actions .add, +.catalog-search-index .page-actions .add, +.catalog-product-review-index .page-actions .add, +.catalog-rule-promo-catalog-index .page-actions .add, +.sales-rule-promo-quote-index .page-actions .add, +.adminhtml-reminder-index .page-actions .add, +.newsletter-template-index .page-actions .add, +.adminhtml-system-email-template-index .page-actions .add, +.adminhtml-sitemap-index .page-actions .add, +.adminhtml-googleshopping-types-index .page-actions .add, +.customer-index-index .page-actions .add, +.adminhtml-cms-page-index .page-actions .add, +.cms-block-index .page-actions .add, +.adminhtml-banner-index .page-actions .add, +.adminhtml-widget-instance-index .page-actions .add, +.cms-page-index .page-actions .add, +.adminhtml-webapi-user-index .page-actions .add, +.adminhtml-webapi-role-index .page-actions .add, +.adminhtml-system-variable-index .page-actions .add, +.adminhtml-user-index .page-actions .add, +.adminhtml-user-role-index .page-actions .add, +.adminhtml-integration-index .page-actions .add, +.adminhtml-system-design-theme-index .page-actions .add, +.adminhtml-system-design-index .page-actions .add, +.adminhtml-customer-attribute-index .page-actions .add, +.adminhtml-customer-address-attribute-index .page-actions .add, +.rating-index-index .page-actions .add, +.tax-rule-index .page-actions .add, +.tax-rate-index .page-actions .add, +.adminhtml-rma-item-attribute-index .page-actions .add, +.adminhtml-reward-rate-index .page-actions .add, +.customer-group-index .page-actions .add, +.checkout-agreement-index .page-actions .add, +.catalog-product-attribute-index .page-actions .add, +.catalog-product-set-index .page-actions .add, +.catalog-product-new .actions-split.btn-round .action-default.primary, +.catalog-product-edit .actions-split.btn-round .action-default.primary, +.catalog-product-index .actions-split.btn-round .action-default.primary, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary, +.PrimarySplitButton.btn-round .action-default.primary, +.sales-order-index .page-actions .add, +.adminhtml-rma-index .page-actions .add, +.adminhtml-catalog-event-index .page-actions .add, +.adminhtml-urlrewrite-index .page-actions .add, +.catalog-search-index .page-actions .add, +.catalog-product-review-index .page-actions .add, +.catalog-rule-promo-catalog-index .page-actions .add, +.sales-rule-promo-quote-index .page-actions .add, +.adminhtml-reminder-index .page-actions .add, +.newsletter-template-index .page-actions .add, +.adminhtml-system-email-template-index .page-actions .add, +.adminhtml-sitemap-index .page-actions .add, +.adminhtml-googleshopping-types-index .page-actions .add, +.customer-index-index .page-actions .add, +.adminhtml-cms-page-index .page-actions .add, +.cms-block-index .page-actions .add, +.adminhtml-banner-index .page-actions .add, +.adminhtml-widget-instance-index .page-actions .add, +.cms-page-index .page-actions .add, +.adminhtml-webapi-user-index .page-actions .add, +.adminhtml-webapi-role-index .page-actions .add, +.adminhtml-system-variable-index .page-actions .add, +.adminhtml-user-index .page-actions .add, +.adminhtml-user-role-index .page-actions .add, +.adminhtml-integration-index .page-actions .add, +.adminhtml-system-design-theme-index .page-actions .add, +.adminhtml-system-design-index .page-actions .add, +.adminhtml-customer-attribute-index .page-actions .add, +.adminhtml-customer-address-attribute-index .page-actions .add, +.rating-index-index .page-actions .add, +.tax-rule-index .page-actions .add, +.tax-rate-index .page-actions .add, +.adminhtml-rma-item-attribute-index .page-actions .add, +.adminhtml-reward-rate-index .page-actions .add, +.customer-group-index .page-actions .add, +.checkout-agreement-index .page-actions .add, +.catalog-product-attribute-index .page-actions .add, +.catalog-product-set-index .page-actions .add, +.catalog-product-new .actions-split.btn-round .action-default.primary, +.catalog-product-edit .actions-split.btn-round .action-default.primary, +.catalog-product-index .actions-split.btn-round .action-default.primary, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary { + width: 36px; + height: 31px; + overflow: hidden; + position: relative; + z-index: 1; + padding: 0; +} +.PrimaryAddButton:focus, +.PrimarySplitButton.btn-round .action-default.primary:focus, +.sales-order-index .page-actions .add:focus, +.adminhtml-rma-index .page-actions .add:focus, +.adminhtml-catalog-event-index .page-actions .add:focus, +.adminhtml-urlrewrite-index .page-actions .add:focus, +.catalog-search-index .page-actions .add:focus, +.catalog-product-review-index .page-actions .add:focus, +.catalog-rule-promo-catalog-index .page-actions .add:focus, +.sales-rule-promo-quote-index .page-actions .add:focus, +.adminhtml-reminder-index .page-actions .add:focus, +.newsletter-template-index .page-actions .add:focus, +.adminhtml-system-email-template-index .page-actions .add:focus, +.adminhtml-sitemap-index .page-actions .add:focus, +.adminhtml-googleshopping-types-index .page-actions .add:focus, +.customer-index-index .page-actions .add:focus, +.adminhtml-cms-page-index .page-actions .add:focus, +.cms-block-index .page-actions .add:focus, +.adminhtml-banner-index .page-actions .add:focus, +.adminhtml-widget-instance-index .page-actions .add:focus, +.cms-page-index .page-actions .add:focus, +.adminhtml-webapi-user-index .page-actions .add:focus, +.adminhtml-webapi-role-index .page-actions .add:focus, +.adminhtml-system-variable-index .page-actions .add:focus, +.adminhtml-user-index .page-actions .add:focus, +.adminhtml-user-role-index .page-actions .add:focus, +.adminhtml-integration-index .page-actions .add:focus, +.adminhtml-system-design-theme-index .page-actions .add:focus, +.adminhtml-system-design-index .page-actions .add:focus, +.adminhtml-customer-attribute-index .page-actions .add:focus, +.adminhtml-customer-address-attribute-index .page-actions .add:focus, +.rating-index-index .page-actions .add:focus, +.tax-rule-index .page-actions .add:focus, +.tax-rate-index .page-actions .add:focus, +.adminhtml-rma-item-attribute-index .page-actions .add:focus, +.adminhtml-reward-rate-index .page-actions .add:focus, +.customer-group-index .page-actions .add:focus, +.checkout-agreement-index .page-actions .add:focus, +.catalog-product-attribute-index .page-actions .add:focus, +.catalog-product-set-index .page-actions .add:focus, +.catalog-product-new .actions-split.btn-round .action-default.primary:focus, +.catalog-product-edit .actions-split.btn-round .action-default.primary:focus, +.catalog-product-index .actions-split.btn-round .action-default.primary:focus, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:focus { + outline: none; +} +.PrimaryAddButton > span, +.PrimarySplitButton.btn-round .action-default.primary > span, +.sales-order-index .page-actions .add > span, +.adminhtml-rma-index .page-actions .add > span, +.adminhtml-catalog-event-index .page-actions .add > span, +.adminhtml-urlrewrite-index .page-actions .add > span, +.catalog-search-index .page-actions .add > span, +.catalog-product-review-index .page-actions .add > span, +.catalog-rule-promo-catalog-index .page-actions .add > span, +.sales-rule-promo-quote-index .page-actions .add > span, +.adminhtml-reminder-index .page-actions .add > span, +.newsletter-template-index .page-actions .add > span, +.adminhtml-system-email-template-index .page-actions .add > span, +.adminhtml-sitemap-index .page-actions .add > span, +.adminhtml-googleshopping-types-index .page-actions .add > span, +.customer-index-index .page-actions .add > span, +.adminhtml-cms-page-index .page-actions .add > span, +.cms-block-index .page-actions .add > span, +.adminhtml-banner-index .page-actions .add > span, +.adminhtml-widget-instance-index .page-actions .add > span, +.cms-page-index .page-actions .add > span, +.adminhtml-webapi-user-index .page-actions .add > span, +.adminhtml-webapi-role-index .page-actions .add > span, +.adminhtml-system-variable-index .page-actions .add > span, +.adminhtml-user-index .page-actions .add > span, +.adminhtml-user-role-index .page-actions .add > span, +.adminhtml-integration-index .page-actions .add > span, +.adminhtml-system-design-theme-index .page-actions .add > span, +.adminhtml-system-design-index .page-actions .add > span, +.adminhtml-customer-attribute-index .page-actions .add > span, +.adminhtml-customer-address-attribute-index .page-actions .add > span, +.rating-index-index .page-actions .add > span, +.tax-rule-index .page-actions .add > span, +.tax-rate-index .page-actions .add > span, +.adminhtml-rma-item-attribute-index .page-actions .add > span, +.adminhtml-reward-rate-index .page-actions .add > span, +.customer-group-index .page-actions .add > span, +.checkout-agreement-index .page-actions .add > span, +.catalog-product-attribute-index .page-actions .add > span, +.catalog-product-set-index .page-actions .add > span, +.catalog-product-new .actions-split.btn-round .action-default.primary > span, +.catalog-product-edit .actions-split.btn-round .action-default.primary > span, +.catalog-product-index .actions-split.btn-round .action-default.primary > span, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary > span { + text-indent: -999em; + display: block; + width: 34px; + height: 29px; +} +.PrimaryAddButton > span:before, +.PrimarySplitButton.btn-round .action-default.primary > span:before, +.sales-order-index .page-actions .add > span:before, +.adminhtml-rma-index .page-actions .add > span:before, +.adminhtml-catalog-event-index .page-actions .add > span:before, +.adminhtml-urlrewrite-index .page-actions .add > span:before, +.catalog-search-index .page-actions .add > span:before, +.catalog-product-review-index .page-actions .add > span:before, +.catalog-rule-promo-catalog-index .page-actions .add > span:before, +.sales-rule-promo-quote-index .page-actions .add > span:before, +.adminhtml-reminder-index .page-actions .add > span:before, +.newsletter-template-index .page-actions .add > span:before, +.adminhtml-system-email-template-index .page-actions .add > span:before, +.adminhtml-sitemap-index .page-actions .add > span:before, +.adminhtml-googleshopping-types-index .page-actions .add > span:before, +.customer-index-index .page-actions .add > span:before, +.adminhtml-cms-page-index .page-actions .add > span:before, +.cms-block-index .page-actions .add > span:before, +.adminhtml-banner-index .page-actions .add > span:before, +.adminhtml-widget-instance-index .page-actions .add > span:before, +.cms-page-index .page-actions .add > span:before, +.adminhtml-webapi-user-index .page-actions .add > span:before, +.adminhtml-webapi-role-index .page-actions .add > span:before, +.adminhtml-system-variable-index .page-actions .add > span:before, +.adminhtml-user-index .page-actions .add > span:before, +.adminhtml-user-role-index .page-actions .add > span:before, +.adminhtml-integration-index .page-actions .add > span:before, +.adminhtml-system-design-theme-index .page-actions .add > span:before, +.adminhtml-system-design-index .page-actions .add > span:before, +.adminhtml-customer-attribute-index .page-actions .add > span:before, +.adminhtml-customer-address-attribute-index .page-actions .add > span:before, +.rating-index-index .page-actions .add > span:before, +.tax-rule-index .page-actions .add > span:before, +.tax-rate-index .page-actions .add > span:before, +.adminhtml-rma-item-attribute-index .page-actions .add > span:before, +.adminhtml-reward-rate-index .page-actions .add > span:before, +.customer-group-index .page-actions .add > span:before, +.checkout-agreement-index .page-actions .add > span:before, +.catalog-product-attribute-index .page-actions .add > span:before, +.catalog-product-set-index .page-actions .add > span:before, +.catalog-product-new .actions-split.btn-round .action-default.primary > span:before, +.catalog-product-edit .actions-split.btn-round .action-default.primary > span:before, +.catalog-product-index .actions-split.btn-round .action-default.primary > span:before, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary > span:before { + text-indent: 0; + font-family: 'MUI-Icons'; + font-weight: normal; + font-size: 22px; + content: '\e02d'; + color: #fff; + position: absolute; + width: 34px; + height: 29px; + line-height: 29px; + text-align: center; + vertical-align: middle; + top: 0; + left: 0; + overflow: hidden; +} +.eq-ie9 .PrimaryAddButton > span:before, +.eq-ie9 .PrimarySplitButton.btn-round .action-default.primary > span:before, +.eq-ie9 .sales-order-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-rma-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-catalog-event-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-urlrewrite-index .page-actions .add > span:before, +.eq-ie9 .catalog-search-index .page-actions .add > span:before, +.eq-ie9 .catalog-product-review-index .page-actions .add > span:before, +.eq-ie9 .catalog-rule-promo-catalog-index .page-actions .add > span:before, +.eq-ie9 .sales-rule-promo-quote-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-reminder-index .page-actions .add > span:before, +.eq-ie9 .newsletter-template-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-system-email-template-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-sitemap-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-googleshopping-types-index .page-actions .add > span:before, +.eq-ie9 .customer-index-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-cms-page-index .page-actions .add > span:before, +.eq-ie9 .cms-block-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-banner-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-widget-instance-index .page-actions .add > span:before, +.eq-ie9 .cms-page-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-webapi-user-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-webapi-role-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-system-variable-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-user-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-user-role-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-integration-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-system-design-theme-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-system-design-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-customer-attribute-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-customer-address-attribute-index .page-actions .add > span:before, +.eq-ie9 .rating-index-index .page-actions .add > span:before, +.eq-ie9 .tax-rule-index .page-actions .add > span:before, +.eq-ie9 .tax-rate-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-rma-item-attribute-index .page-actions .add > span:before, +.eq-ie9 .adminhtml-reward-rate-index .page-actions .add > span:before, +.eq-ie9 .customer-group-index .page-actions .add > span:before, +.eq-ie9 .checkout-agreement-index .page-actions .add > span:before, +.eq-ie9 .catalog-product-attribute-index .page-actions .add > span:before, +.eq-ie9 .catalog-product-set-index .page-actions .add > span:before, +.eq-ie9 .catalog-product-new .actions-split.btn-round .action-default.primary > span:before, +.eq-ie9 .catalog-product-edit .actions-split.btn-round .action-default.primary > span:before, +.eq-ie9 .catalog-product-index .actions-split.btn-round .action-default.primary > span:before, +.eq-ie9 .adminhtml-integration-new .actions-split.btn-round .action-default.primary > span:before { + line-height: 31px; +} +.PrimarySplitButton.btn-round .action-default.primary, +.catalog-product-new .actions-split.btn-round .action-default.primary, +.catalog-product-edit .actions-split.btn-round .action-default.primary, +.catalog-product-index .actions-split.btn-round .action-default.primary, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary, +.catalog-product-new .actions-split.btn-round .action-default.primary, +.catalog-product-edit .actions-split.btn-round .action-default.primary, +.catalog-product-index .actions-split.btn-round .action-default.primary, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary { + border-radius: 2px 0 0 2px; +} +.PrimarySplitButton.btn-round .action-default.primary:focus, +.catalog-product-new .actions-split.btn-round .action-default.primary:focus, +.catalog-product-edit .actions-split.btn-round .action-default.primary:focus, +.catalog-product-index .actions-split.btn-round .action-default.primary:focus, +.adminhtml-integration-new .actions-split.btn-round .action-default.primary:focus { + outline: none; +} +.PrimarySplitButton > .action-default.primary, +.catalog-product-new .actions-split > .action-default.primary, +.catalog-product-edit .actions-split > .action-default.primary, +.catalog-product-index .actions-split > .action-default.primary, +.adminhtml-integration-new .actions-split > .action-default.primary { + border-radius: 2px 0 0 2px; +} +.PrimarySplitButton > .action-default.primary:focus, +.catalog-product-new .actions-split > .action-default.primary:focus, +.catalog-product-edit .actions-split > .action-default.primary:focus, +.catalog-product-index .actions-split > .action-default.primary:focus, +.adminhtml-integration-new .actions-split > .action-default.primary:focus { + outline: none; +} +.PrimarySplitButton > .action-toggle.primary, +.catalog-product-new .actions-split > .action-toggle.primary, +.catalog-product-edit .actions-split > .action-toggle.primary, +.catalog-product-index .actions-split > .action-toggle.primary, +.adminhtml-integration-new .actions-split > .action-toggle.primary, +.catalog-product-new .actions-split > .action-toggle.primary, +.catalog-product-edit .actions-split > .action-toggle.primary, +.catalog-product-index .actions-split > .action-toggle.primary, +.adminhtml-integration-new .actions-split > .action-toggle.primary { + overflow: hidden; + z-index: 1; + padding: 0; + border-radius: 0 2px 2px 0; + font-size: 15px; + width: 30px; + height: 31px; + line-height: 30px; + margin-left: -1px; + position: relative; + z-index: 2; + filter: none; +} +.PrimarySplitButton > .action-toggle.primary:focus, +.catalog-product-new .actions-split > .action-toggle.primary:focus, +.catalog-product-edit .actions-split > .action-toggle.primary:focus, +.catalog-product-index .actions-split > .action-toggle.primary:focus, +.adminhtml-integration-new .actions-split > .action-toggle.primary:focus { + outline: none; +} +.PrimarySplitButton > .action-toggle.primary:before, +.catalog-product-new .actions-split > .action-toggle.primary:before, +.catalog-product-edit .actions-split > .action-toggle.primary:before, +.catalog-product-index .actions-split > .action-toggle.primary:before, +.adminhtml-integration-new .actions-split > .action-toggle.primary:before { + text-align: center; +} +.PrimarySplitButton .dropdown-menu, +.catalog-product-new .actions-split .dropdown-menu, +.catalog-product-edit .actions-split .dropdown-menu, +.catalog-product-index .actions-split .dropdown-menu, +.adminhtml-integration-new .actions-split .dropdown-menu { + left: 0; + right: auto; + z-index: 1; +} +.PrimarySplitButton .dropdown-menu > li > .item, +.catalog-product-new .actions-split .dropdown-menu > li > .item, +.catalog-product-edit .actions-split .dropdown-menu > li > .item, +.catalog-product-index .actions-split .dropdown-menu > li > .item, +.adminhtml-integration-new .actions-split .dropdown-menu > li > .item { + padding: 9px 10px 10px; +} +.PrimarySplitButton.active > .action-toggle.primary, +.PrimarySplitButton.active > .action-toggle.primary:hover, +.catalog-product-new .actions-split.active > .action-toggle.primary, +.catalog-product-new .actions-split.active > .action-toggle.primary:hover, +.catalog-product-edit .actions-split.active > .action-toggle.primary, +.catalog-product-edit .actions-split.active > .action-toggle.primary:hover, +.catalog-product-index .actions-split.active > .action-toggle.primary, +.catalog-product-index .actions-split.active > .action-toggle.primary:hover, +.adminhtml-integration-new .actions-split.active > .action-toggle.primary, +.adminhtml-integration-new .actions-split.active > .action-toggle.primary:hover { + background: #026294; + border: 1px solid #004c74; +} +.dont-use-this-class-big-size { + font-size: 18px; + line-height: 24px; + padding: 8px 19px; +} +/* + Reset 'button view' for actions +-------------------------------------- */ +.customer-current-activity .action-refresh, +.pager .action-next, +.pager .action-previous, +.pager .action-next:hover, +.pager .action-previous:hover, +.pager .action-next.disabled:focus, +.pager .action-previous.disabled:focus, +.pager .action-next.disabled:active, +.pager .action-previous.disabled:active, +.data-table .action-.delete, +.data-table .action-.delete:hover, +.data-table .action-.delete:active, +.data-table .action-.delete.active, +.data-table .action-delete, +.data-table .action-delete:hover, +.data-table .action-delete:active, +.data-table .action-delete.active, +.data-table .action-locked, +.data-table .action-locked:hover, +.data-table .action-locked:active, +.data-table .action-locked.active, +.data-table .action-locked[disabled], +#product-variations-matrix .action-choose, +#product-variations-matrix .action-choose:hover, +#product-variations-matrix .action-choose:active, +#product-variations-matrix .action-choose.active, +#product-variations-matrix .action-choose[disabled], +.action-manage-images, +.action-manage-images:hover, +.action-manage-images:active, +.action-manage-images.active, +.action-manage-images[disabled], +.image-panel .action-close, +.image-panel .action-close:hover, +.image-panel .action-close:active, +.image-panel .action-close.active, +.image-panel .action-close[disabled], +.image-panel-controls .action-remove, +.image-panel-controls .action-remove:hover, +.image-panel-controls .action-remove:active, +.image-panel-controls .action-remove.active, +.image-panel-controls .action-remove[disabled], +.vde-image-sizing .action-connect, +.vde-image-sizing .action-connect:hover, +.vde-image-sizing .action-connect:active, +.vde-image-sizing .action-connect.active, +.vde-image-sizing .action-connect[disabled], +.suggest-expandable .action-show-all, +.suggest-expandable .action-show-all:hover, +.suggest-expandable .action-show-all:active, +.suggest-expandable .action-show-all.active, +.suggest-expandable .action-show-all[disabled], +.custom-file > .action-add, +.custom-file > .action-add:hover, +.custom-file > .action-add:active, +.custom-file > .action-add.active, +.custom-file > .action-add[disabled], +.vde-tools-header .action-close, +.vde-tools-header .action-close:hover, +.vde-tools-header .action-close:active, +.vde-tools-header .action-close.active, +.image .action-delete, +.image .action-delete:hover, +.image .action-delete:active, +.image .action-delete.active, +.fieldset-wrapper-title .actions .action-delete, +.fieldset-wrapper-title .actions .action-delete:hover, +.fieldset-wrapper-title .actions .action-delete:active, +.fieldset-wrapper-title .actions .action-delete.active, +.address-list-item-actions .action-delete, +.address-list-item-actions .action-delete:hover, +.address-list-item-actions .action-delete:active, +.address-list-item-actions .action-delete.active, +.notification .action-close, +.notification .action-close:hover, +.notification .action-close:active, +.notification .action-close.active, +.page-login .action-forgotpassword, +.page-login .action-forgotpassword:hover, +.page-login .action-forgotpassword:active, +.page-login .action-forgotpassword.active, +.page-login .action-back, +.page-login .action-back:hover, +.page-login .action-back:active, +.page-login .action-back.active, +.attribute-popup .page-actions #reset, +.attribute-popup .page-actions #reset:hover, +.attribute-popup .page-actions #reset:active, +.attribute-popup .page-actions #reset.active, +.attribute-popup .page-actions #reset[disabled] { + border: none; + border-radius: 0; + background: none; + margin: 0; + padding: 0; + box-shadow: none; + text-shadow: none; + filter: none; +} +.attribute-popup .messages { + margin: 0 15px; +} +.data-table .action-.delete[disabled], +.data-table .action-delete[disabled], +.data-table .action-locked[disabled], +#product-variations-matrix .action-choose[disabled], +.image-panel .action-close[disabled], +.image-panel-controls .action-remove[disabled], +.suggest-expandable .action-show-all[disabled], +#store-view-window [class^='action-close'], +#store-view-window [class^='action-close']:hover, +#store-view-window [class^='action-close']:active, +#store-view-window [class^='action-close'].active, +#store-view-window [class^='action-close'][disabled], +.custom-file > .action-add[disabled], +.image .action-delete, +.image .action-delete:hover, +.image .action-delete:active, +.image .action-delete.active, +.fieldset-wrapper-title .actions .action-delete, +.fieldset-wrapper-title .actions .action-delete:hover, +.fieldset-wrapper-title .actions .action-delete:active, +.fieldset-wrapper-title .actions .action-delete.active, +.address-list-item-actions .action-delete, +.address-list-item-actions .action-delete:hover, +.address-list-item-actions .action-delete:active, +.address-list-item-actions .action-delete.active, +.notification .action-close, +.notification .action-close:hover, +.notification .action-close:active, +.notification .action-close.active { + border: none; + border-radius: 0; + background: none; + margin: 0; + padding: 0; + box-shadow: none; + text-shadow: none; + filter: none; +} +.fade.critical-notification { + display: block; +} +.fade.critical-notification .popup { + top: 200px; +} +.data-table .action-.delete[disabled], +.data-table .action-delete[disabled], +.data-table .action-locked[disabled], +#product-variations-matrix .action-choose[disabled], +.image-panel .action-close[disabled], +.image-panel-controls .action-remove[disabled], +.suggest-expandable .action-show-all[disabled], +#store-view-window [class^='action-close'], +#store-view-window [class^='action-close']:hover, +#store-view-window [class^='action-close']:active, +#store-view-window [class^='action-close'].active, +#store-view-window [class^='action-close'][disabled], +.custom-file > .action-add[disabled], +.vde-tools-header .action-close[disabled], +.vde-image-sizing .action-reset, +.vde-image-sizing .action-reset:hover, +.vde-image-sizing .action-reset:active, +.vde-image-sizing .action-reset.active, +.vde-image-sizing .action-reset[disabled], +.image .action-delete[disabled], +.fieldset-wrapper-title .actions .action-delete[disabled], +.address-list-item-actions .action-delete[disabled], +[class^=" catalog-product-"] .page-actions .action-back, +[class^=" catalog-product-"] .page-actions .action-back:hover, +[class^=" catalog-product-"] .page-actions .action-back:active, +[class^=" catalog-product-"] .page-actions .action-back.active, +[class^=" catalog-product-"] .page-actions .action-back[disabled], +[class^=" newsletter-"] .page-actions .action-back, +[class^=" newsletter-"] .page-actions .action-back:hover, +[class^=" newsletter-"] .page-actions .action-back:active, +[class^=" newsletter-"] .page-actions .action-back.active, +[class^=" newsletter-"] .page-actions .action-back[disabled], +.notifications [class^="action-"], +.notifications [class^="action-"]:hover, +.notifications [class^="action-"]:active, +.notifications [class^="action-"].active, +.notifications [class^="action-"][disabled], +.notification .action-close, +.notification .action-close:hover, +.notification .action-close:active, +.notification .action-close.active, +.notification .action-close[disabled], +.sales-order-create-index .page-actions-inner .cancel, +.sales-order-create-index .page-actions-inner .cancel:hover, +.sales-order-create-index .page-actions-inner .cancel:active, +.sales-order-create-index .page-actions-inner .cancel.active, +.sales-order-create-index .page-actions-inner .cancel[disabled] { + border: 0; + border-radius: 0; + background: none; + margin: 0; + padding: 0; + box-shadow: none; + text-shadow: none; + filter: none; +} +.vde-image-sizing .action-connect, +.vde-image-sizing .action-connect:hover, +.vde-image-sizing .action-connect:active, +.vde-image-sizing .action-connect.active, +.vde-image-sizing .action-connect[disabled], +.vde-tab-data .action-download, +.vde-tab-data .action-download:hover, +.vde-tab-data .action-download:active, +.vde-tab-data .action-download.active, +.vde-tab-data .action-download[disabled], +.vde-tab-data .action-delete, +.vde-tab-data .action-delete:hover, +.vde-tab-data .action-delete:active, +.vde-tab-data .action-delete.active, +.vde-tab-data .action-delete[disabled], +.vde-tab-data .action-edit, +.vde-tab-data .action-edit:hover, +.vde-tab-data .action-edit:active, +.vde-tab-data .action-edit.active, +.vde-tab-data .action-edit[disabled] { + border: none; + border-radius: 0; + background: none; + margin: 0; + padding: 0; + box-shadow: none; + text-shadow: none; +} +/* + Actions as links +-------------------------------------- */ +.notification-entry-dialog .action-cancel, +.attribute-popup .page-actions #reset { + background: none; + border: none; + color: #6d665e; + font-weight: normal; + font-size: 12px; + cursor: pointer; + text-decoration: underline; +} +.notification-entry-dialog .action-cancel:hover, +.attribute-popup .page-actions #reset:hover { + color: #000; + border-bottom-color: #000; + filter: none; +} +/* + Fileupload button +-------------------------------------- */ +.action-upload { + position: relative; +} +.action-upload > input[type="file"] { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + opacity: 0; + font-size: 10em; +} +/* + Dropdown menu +-------------------------------------- */ +.dropdown-menu, +.ui-autocomplete { + position: absolute; + display: none; + list-style: none; + min-width: 100px; + margin: 3px 0 0 0; + padding: 0; + right: 0; + top: 100%; + border: 1px solid #cac2b5; + border-radius: 3px; + background: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + z-index: 990; +} +.dropdown-menu > li, +.ui-autocomplete > li { + padding: 5px; + border-bottom: 1px solid #e5e5e5; +} +.dropdown-menu > li.selected, +.ui-autocomplete > li.selected { + background: #eef8fc; +} +.dropdown-menu > li:hover, +.ui-autocomplete > li:hover { + background: #eef8fc; +} +.dropdown-menu > li:last-child, +.ui-autocomplete > li:last-child { + border-bottom: none; +} +.dropdown-menu > li > .item, +.ui-autocomplete > li > .item { + cursor: pointer; +} +.dropdown-menu-top { + margin: 0 0 3px 0; + top: auto; + bottom: 100%; +} +.ui-autocomplete { + right: auto; +} +.ui-autocomplete > li { + padding: 0; +} +.ui-autocomplete > li > a { + display: block; + padding: 5px; +} +.ui-autocomplete > li > a.level-0 { + padding-left: 5px !important; +} +.ui-autocomplete .ui-state-focus { + background: #f5f5f5; +} +/* + Suggest +-------------------------------------- */ +.mage-suggest { + position: relative; + display: inline-block; + vertical-align: top; + width: 100%; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.mage-suggest:after { + position: absolute; + top: 0; + 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'; + /* search icon */ + + font-size: 20px; + color: #b2b2b2; +} +.mage-suggest input[type="search"], +.mage-suggest input.search { + width: 100%; + border: none; + background: none; + padding-right: 30px; +} +.mage-suggest-dropdown { + position: absolute; + left: 0; + right: 0; + top: 100%; + margin: 3px -1px 0 -1px; + border: 1px solid #cac2b5; + border-radius: 3px; + 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; +} +.field-category_ids .mage-suggest-dropdown, +.field-new_category_parent .mage-suggest-dropdown { + max-height: 200px; + overflow: auto; +} +.mage-suggest-dropdown li a { + display: block; +} +.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 li a.ui-state-focus { + background: #f5f5f5; +} +.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: #000000; + background: #F1FFEB; +} +.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 .actions-split .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 .actions-split .action-toggle span { + display: inline; +} +.suggest-expandable .actions-split .action-toggle:before { + display: inline-block; + float: right; + margin-left: 4px; + font-size: 13px; + color: #b2b0ad; +} +.suggest-expandable .actions-split .action-toggle:hover:before { + color: #7e7e7e; +} +.suggest-expandable .dropdown-menu { + margin: 1px 0 0; + left: 0; + right: auto; + width: 221px; +} +.suggest-expandable .mage-suggest { + border: none; +} +.suggest-expandable .mage-suggest:after { + top: 6px; + right: 6px; +} +.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 #ccc; + width: 211px; + 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 { + border-radius: 3px 3px 0 0; +} +.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, +.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; +} +.page-actions .suggest-expandable { + max-width: 500px; + float: left; + margin-top: 1px; +} +.page-actions.fixed #product-template-suggest-container { + display: none; +} +/* + Actions Split +-------------------------------------- */ +.actions-split { + text-align: left; + position: relative; + display: inline-block; +} +.actions-split > [class^='action-'] { + float: left; + border-radius: 0; +} +.actions-split > .action-default { + border-radius: 5px 0 0 5px; +} +.actions-split > .action-toggle { + border-left: 1px solid #c5c0b9; + border-radius: 0 5px 5px 0; + margin-left: -1px; + padding: 4px 7px; +} +.actions-split > .action-toggle > span { + display: none; +} +.actions-split > .action-toggle:before { + display: block; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02c'; + /* arrow down */ + + font-size: 11px; +} +.actions-split > .action-toggle.active:before { + content: '\e029'; + /* arrow up */ + +} +.actions-split > .action-toggle.primary { + border-left: 1px solid #e1721d; +} +.actions-split > .action-toggle.primary:hover { + background: #e2701a; + margin-left: -1px; +} +.actions-split.active .dropdown-menu { + display: block; + white-space: nowrap; +} +.actions-split.active .dropdown-menu > li { + padding: 0; +} +.actions-split .dropdown-menu > li > .item { + display: block; + padding: 6px 10px 5px; + color: #333; + text-decoration: none; +} +/* Variations Image Uploader */ +.actions-image-uploader > img { + float: left; + border: solid #b7b2a7; + border-width: 1px 0 1px 1px; + width: 32px; + height: 31px; +} +.actions-image-uploader .action-toggle, +.actions-image-uploader .action-toggle:hover, +.actions-image-uploader .action-toggle:active, +.actions-image-uploader .action-toggle:focus, +.actions-image-uploader .action-toggle[disabled] { + position: relative; + height: 33px; + padding-left: 2px; + padding-right: 2px; + background: #fff; + filter: none; + color: #888; +} +.actions-image-uploader.active .action-toggle { + border-radius: 0 5px 0 0; +} +.actions-image-uploader.active .action-toggle:after { + position: absolute; + left: 0; + right: 0; + bottom: -1px; + height: 1px; + background: #fff; + z-index: 991; + content: ''; +} +.actions-image-uploader .dropdown-menu { + margin-top: -1px; + border-radius: 3px 0 3px 3px; +} +/* + Action delete icon +-------------------------------------- */ +/* TODO: replase ".action-.delete" to ".action-delete" after buttons refactoring */ +.data-table .action-.delete span, +.data-table .action-delete span, +.data-table .action-locked span, +.image .action-delete span, +.fieldset-wrapper-title .actions .action-delete span, +.address-list-item-actions .action-delete span { + display: none; +} +.data-table .action-.delete:before, +.data-table .action-delete:before, +.image .action-delete:before, +.fieldset-wrapper-title .actions .action-delete:before, +.address-list-item-actions .action-delete:before { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + font-size: 18px; + -webkit-font-smoothing: antialiased; + content: '\e07f'; + /* delete icon */ + + color: #b7b3ad; +} +/* + Locked action icon +-------------------------------------- */ +.data-table .action-locked:before { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + font-size: 20px; + -webkit-font-smoothing: antialiased; + content: '\e03e'; + /* lock icon */ + + color: #b7b3ad; +} +.data-table .action-.delete:hover:before, +.data-table .action-delete:hover:before, +.data-table .action-locked:hover:before, +.image .action-delete:hover:before, +.fieldset-wrapper-title .actions .action-delete:hover:before, +.address-list-item-actions .action-delete:hover:before { + color: #7e7e7e; +} +.data-table input.action-.delete[type="button"], +.data-table input.action-.delete[type="submit"], +.data-table input.action-.delete[type="reset"], +.data-table button.action-.delete, +.data-table input.action-.delete[type="button"]:visited, +.data-table input.action-.delete[type="submit"]:visited, +.data-table input.action-.delete[type="reset"]:visited, +.data-table button.action-.delete:visited, +.data-table input.action-.delete[type="button"]:hover, +.data-table input.action-.delete[type="submit"]:hover, +.data-table input.action-.delete[type="reset"]:hover, +.data-table button.action-.delete:hover, +.data-table input.action-.delete[type="button"]:active, +.data-table input.action-.delete[type="submit"]:active, +.data-table input.action-.delete[type="reset"]:active, +.data-table button.action-.delete:active { + background: transparent; + padding: 3px 7px 0; +} +.data-table input.action-.delete[type=button]:hover:before, +.data-table input.action-.delete[type=submit]:hover:before, +.data-table input.action-.delete[type=reset]:hover:before, +.data-table button.action-.delete:hover:before, +.data-table input.action-.delete[type=button]:focus:before, +.data-table input.action-.delete[type=submit]:focus:before, +.data-table input.action-.delete[type=reset]:focus:before, +.data-table button.action-.delete:focus:before { + background: transparent; + color: #a5a29d; +} +/* + Forms +-------------------------------------- */ +fieldset { + border: 1px solid #ccc; + padding: 20px; +} +legend { + padding: 0 10px; + margin: 0 -10px; +} +fieldset legend + br { + display: none; +} +label { + display: inline-block; +} +label > input[type="radio"], +label > input[type="checkbox"] { + margin: -3px 3px 0 0; + vertical-align: middle; +} +input[type=text], +input[type=password], +input[type=datetime], +input[type=datetime-local], +input[type=date], +input[type=month], +input[type=time], +input[type=week], +input[type=number], +input[type=range], +input[type=email], +input[type=url], +input[type=search], +input.search, +input[type=tel], +input[type=color], +textarea, +.input-text { + display: inline-block; + padding: 4px; + margin: 0; + background-color: #fff; + height: 28px; + color: #676056; + font-size: 14px; + font-weight: 400; + border: 1px solid #ccc; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 4px; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +textarea, +.input-text { + height: auto; +} +textarea { + resize: vertical; +} +select { + height: 28px; + padding: 4px 4px 5px; + margin: 0 0 8px; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} +select[multiple], +select[size] { + height: auto; +} +input[type=text]:focus, +input[type=password]:focus, +input[type=datetime]:focus, +input[type=datetime-local]:focus, +input[type=date]:focus, +input[type=month]:focus, +input[type=time]:focus, +input[type=week]:focus, +input[type=number]:focus, +input[type=range]:focus, +input[type=email]:focus, +input[type=url]:focus, +input[type=search]:focus, +input.search:focus, +input[type=tel]:focus, +input[type=color]:focus, +textarea:focus, +select:focus { + outline: 0; + border-color: #75b9f0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} +input[type="radio"], +input[type="checkbox"] { + margin: 3px 0; + line-height: normal; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #fff; + border-color: #eee; + box-shadow: none; + color: #999; +} +select[disabled].multiselect > option[selected] { + color: #fff; + background: #6d6d6d; +} +textarea:-moz-placeholder, +input:-moz-placeholder { + color: #999 !important; + font-style: italic; +} +option.placeholder { + color: #999 !important; + font-style: italic !important; +} +:-ms-input-placeholder { + color: #999 !important; + font-style: italic; +} +::-webkit-input-placeholder { + color: #999 !important; +} +:-moz-placeholder { + color: #999 !important; +} +.form-inline .control { + width: 100%; +} +.form-inline .label { + width: 20%; + padding-top: 6px; +} +.form-inline .label ~ .control { + width: 60%; +} +.form-inline .no-label .control { + margin-left: 20%; + width: 60%; +} +fieldset.field [class^='fields-group-'] .field .control { + width: auto; + margin: 0 0 0 20px; +} +.form-inline .field-service { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + float: left; + width: 20%; + padding: 7px 0 0 15px; + color: #999; + font-size: 12px; + letter-spacing: 0.05em; +} +.form-inline .field-service[value-scope]:before { + content: attr(value-scope) !important; + white-space: nowrap; + display: block; + margin-bottom: 5px; +} +.form-inline .field-service .checkbox { + margin: 0; + vertical-align: middle; +} +.control > input { + width: 100%; +} +.control > input[type="button"] { + width: auto; +} +.control > input.hasDatepicker { + width: 130px; +} +.control > input[type="radio"], +.control > input[type="checkbox"], +.control > input[type="file"] { + width: auto; +} +.control > table { + width: 100%; +} +.multi-input { + margin: 0 0 20px; +} +.multi-input > input { + width: 100%; +} +.control .input-file { + margin-top: 4px; +} +/* TODO: remove styles for images when images will be replaced by font icons */ +.control .hasDatepicker + img { + margin: -3px 0 0 5px; + vertical-align: middle; +} +.nobr { + white-space: nowrap; +} +/* + Form Validation +-------------------------------------- */ +label.mage-error { + display: block; + color: red; + text-align: left; + clear: both; + margin: 3px 0 0 0; +} +textarea.mage-error, +select.mage-error, +input.mage-error { + border-color: #fa7973 !important; + box-shadow: 0 0 8px rgba(250, 121, 115, 0.6) !important; +} +input.mage-error ~ .addafter { + border-color: #fa7973 !important; + box-shadow: 0 0 8px rgba(250, 121, 115, 0.6) !important; +} +/* + Forms for Store Scope +-------------------------------------- */ +.form-inline .field-store_id .label + .control, +.form-inline .field-store_ids .label + .control, +.form-inline .field-website_ids .label + .control, +.form-inline .field-website_id .label + .control, +.form-inline .field-select_stores .label + .control, +.form-inline .field-stores .label + .control { + width: auto; +} +/* + Forms styles +-------------------------------------- */ +.page-content-inner { + position: relative; + background: #f5f2ed; + border: 1px solid #b7b2a6; + border-radius: 5px; + padding: 20px; +} +.fieldset-wrapper, +.fieldset { + background: #fff; + border: 1px solid #eae6e0; + border-radius: 5px; + margin: 0 0 8px; + padding: 5px 18px 18px; + position: relative; +} +.fieldset-wrapper > .fieldset-wrapper-title, +.fieldset > .legend { + position: static; + float: left; + width: 100%; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0; + border-bottom: 1px solid #ededed; + margin: 0 0 18px; +} +.fieldset-wrapper > .fieldset-wrapper-title { + float: none; +} +.fieldset-wrapper > .fieldset-wrapper-title .title, +.fieldset > .legend span { + color: #676056; + font-size: 20px; + font-weight: 400; + padding: 7px 0 10px; + display: inline-block; +} +/* Collapsable fieldset-wrapper */ +.collapsable-wrapper { + padding-bottom: 2px; +} +.collapsable-wrapper.opened { + padding-bottom: 18px; +} +.collapsable-wrapper > .fieldset-wrapper-title { + border-bottom: none; + margin-bottom: 0; +} +.collapsable-wrapper.opened > .fieldset-wrapper-title { + border-bottom: 1px solid #ededed; + margin-bottom: 18px; +} +.collapsable-wrapper .fieldset-wrapper-title > .title { + position: relative; + padding-left: 22px; + cursor: pointer; + float: left; +} +.collapsable-wrapper .fieldset-wrapper-title > .title:before { + position: absolute; + left: 0; + top: 7px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02a'; + /* arrow right icon */ + + color: #b2b0ad; +} +.collapsable-wrapper.opened > .fieldset-wrapper-title > .title:before { + content: '\e02c'; + /* arrow down icon */ + +} +.collapsable-wrapper .fieldset-wrapper-title > .title:hover:before { + color: #7e7e7e; +} +/* Fieldset styles in another fieldset */ +.fieldset .fieldset-wrapper, +.fieldset-wrapper .fieldset-wrapper { + border-color: #cccbca; + padding: 0; +} +.fieldset .fieldset-wrapper .fieldset-wrapper-title, +.fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title { + background: #f4f2ef; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y0ZjJlZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlZWViZTYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #f4f2ef 0%, #eeebe6 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f4f2ef), color-stop(100%, #eeebe6)); + background: -webkit-linear-gradient(top, #f4f2ef 0%, #eeebe6 100%); + background: -o-linear-gradient(top, #f4f2ef 0%, #eeebe6 100%); + background: -ms-linear-gradient(top, #f4f2ef 0%, #eeebe6 100%); + background: linear-gradient(to bottom, #f4f2ef 0%, #eeebe6 100%); + padding: 0 18px; + border-radius: 5px; +} +.fieldset .fieldset-wrapper.opened .fieldset-wrapper-title, +.fieldset-wrapper .fieldset-wrapper.opened .fieldset-wrapper-title { + border-radius: 5px 5px 0 0; + border-bottom: 1px solid #cccbca; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + min-height: 39px; +} +.fieldset .fieldset-wrapper .fieldset-wrapper-title .actions, +.fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title .actions { + padding: 10px 2px 0 0; +} +.fieldset .fieldset-wrapper .fieldset-wrapper-title .title, +.fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title .title { + padding-top: 9px; + padding-bottom: 8px; + color: #555; + font: normal 16px/1.333 Arial, Verdana, sans-serif; +} +.fieldset .fieldset-wrapper .fieldset-wrapper-title .title:before, +.fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title .title:before { + top: 9px; +} +.fieldset-wrapper-content .fieldset > .title { + margin-top: 0; + padding-left: 22px; +} +.fieldset-wrapper .draggable-handle, +.fieldset .draggable-handle { + width: 8px; + height: 14px; + line-height: 14px; + background: url(Magento_Backend::images/draggable-handle-vertical.gif) no-repeat 0 0; + cursor: ns-resize; + color: #b2b0ad; +} +.fieldset-wrapper-title > .draggable-handle { + position: absolute; + left: 10px; + top: 12px; +} +.fieldset .fieldset-wrapper .fieldset-wrapper-content, +.fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-content { + padding: 0 10px; +} +/* Sortable fieldsets */ +.ui-sortable .entry-edit .fieldset-wrapper-title, +#product_options_container_top .fieldset-wrapper-title { + padding-left: 30px; +} +.fieldset-wrapper-title > .actions, +.fieldset .legend > .actions { + float: right; + padding-top: 8px; +} +.fieldset > .legend + br { + display: block; + height: 0; + overflow: hidden; + clear: left; +} +.fieldset-wrapper .fieldset, +.fieldset .fieldset { + background: transparent; + padding: 9px 0; + border: none; + border-radius: 0; + margin: 0 0 29px; +} +.fieldset .comment { + margin: 0 0 29px 10px; +} +.fieldset .field { + margin: 0 0 29px; +} +.with-note .note, +.field .note { + color: #676056; + font-size: 12px; + font-weight: 400; +} +.fieldset .field .options-list { + list-style: none; + margin: 0; + padding: 0; +} +.fieldset .field .options-list input[type="checkbox"], +.fieldset .field .options-list input[type="radio"] { + margin-right: 5px; +} +[class^="fields-group-"] .field { + margin-bottom: 0; +} +.fieldset-wrapper .fieldset:last-child, +.fieldset .fieldset:last-child, +.fieldset .field:last-child { + margin-bottom: 0; +} +.fieldset .label { + color: #676056; + font-size: 13px; + font-weight: 600; +} +.fieldset .control .label { + color: #676056; + font-size: 14px; + font-weight: 400; +} +.field.required > .label:after { + color: #e22626; + font-size: 13px; + font-weight: 400; +} +.with-addon .textarea { + margin: 0 0 6px; +} +.fieldset .control .textarea, +.fieldset .control .addon .textarea { + border-radius: 4px; + width: 100%; +} +.fieldset > .field > input[type="checkbox"] { + margin-top: 12px; +} +.fieldset-alt { + position: relative; + display: table-row; + border: 0; + padding: 0; + margin-bottom: 20px; + width: 100%; +} +.fieldset-alt > .field { + display: table-cell; + vertical-align: top; + padding-right: 4%; +} +.fieldset-alt > .field.no-display { + display: none; +} +.fieldset-alt .field > .label { + display: block; + width: 100%; + clear: both; + text-align: left; + margin: 0 0 10px; +} +.fieldset-alt .label + .control { + width: 100%; +} +.fieldset-alt .field-option-title { + width: 50%; +} +.fieldset .tooltip .help { + margin: 7px 0 0 15px; +} +.fieldset-alt .field-option-store-view { + width: 20%; +} +.fieldset-alt .field-option-input-type { + width: 20%; +} +.fieldset-alt .field-option-input-type select { + width: 100%; +} +.fieldset-alt .field-option-req { + width: 105px; + white-space: nowrap; +} +.fieldset-alt .field-option-req .control { + position: relative; + top: 32px; +} +.fieldset-alt .field-option-position, +.fieldset-alt .field-option-position .control { + width: 60px; +} +/* "Use default" checkbox */ +.use-default-control { + display: none; +} +.use-default-label { + cursor: pointer; + text-decoration: underline; + font-size: 11px; + color: #a29c94; +} +.use-default-label:hover { + color: #7e7e7e; +} +/* + Custom Multiselect +-------------------------------------- */ +.multiselect-alt { + margin: 0; + padding: 0; + list-style: none; + border: 1px solid #ccc; + border-radius: 5px; + color: #333; +} +.multiselect-alt .item { + position: relative; + border-top: 1px solid #fff; + cursor: pointer; +} +.multiselect-alt .item:first-child { + border-top: 0; +} +.multiselect-alt .item.selected { + background: #d7ebf5; +} +.multiselect-alt .item.selected:hover { + background: #afdef2; +} +.multiselect-alt label { + display: block; + cursor: pointer; + padding: 6px 25px 5px; +} +.multiselect-alt .item.selected label:before { + position: absolute; + left: 8px; + top: 1px; + bottom: 0; + width: 10px; + line-height: 28px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e01e'; + /* checked icon */ + + text-align: center; + color: #7ba4b1; + font-size: 9px; + text-shadow: 0 -1px 1px #60727b; +} +.multiselect-alt input[type="checkbox"] { + width: 0; + height: 0; + opacity: 0; + margin: 0; + padding: 0; +} +/* + Form item with table +-------------------------------------- */ +.with-table .label { + float: none; + text-align: left; + width: 100%; +} +.with-table .control { + clear: left; + float: none; + width: 100%; +} +/* + Form currency label +-------------------------------------- */ +.addon input { + border-width: 1px 0 1px 1px; +} +.addon input:focus ~ .addafter { + border-color: #75b9f0; + box-shadow: 0 0 8px rgba(82, 168, 236, 0.6); +} +.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 strong { + margin-top: 0; +} +.addon .addafter { + background: none; + color: #a6a6a6; + border-width: 1px 1px 1px 0; + border-radius: 4px 4px 0 0; + padding: 0; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075) inset; +} +.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.type-price .addon, +.field-price .addon, +.field-special_price .addon, +.field-msrp .addon { + direction: rtl; +} +.field.type-price .addon > *, +.field-price .addon > *, +.field-special_price .addon > *, +.field-msrp .addon > * { + direction: ltr; +} +.field.type-price .addon .addafter, +.field-price .addon .addafter, +.field-special_price .addon .addafter, +.field-msrp .addon .addafter { + border-width: 1px 0 1px 1px; + border-radius: 4px 0 0 4px; +} +.field.type-price .addon input:first-child, +.field-price .addon input:first-child, +.field-special_price .addon input:first-child, +.field-msrp .addon input:first-child { + border-radius: 0 4px 4px 0; +} +.field.type-price input, +.field-price input, +.field-special_price input, +.field-msrp input { + border-width: 1px 1px 1px 0; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075) inset; +} +.field.type-price input:focus, +.field-price input:focus, +.field-special_price input:focus, +.field-msrp input:focus { + box-shadow: 0 0 8px rgba(82, 168, 236, 0.6); +} +.field.type-price input:focus ~ label.addafter, +.field-price input:focus ~ label.addafter, +.field-special_price input:focus ~ label.addafter, +.field-msrp input:focus ~ label.addafter { + box-shadow: 0 0 8px rgba(82, 168, 236, 0.6); +} +.field.type-price input ~ label.addafter strong, +.field-price input ~ label.addafter strong, +.field-special_price input ~ label.addafter strong, +.field-msrp input ~ label.addafter strong { + margin-left: 2px; + margin-right: -2px; +} +/* + Calendar +-------------------------------------- */ +.ui-datepicker { + z-index: 998 !important; +} +.ui-datepicker .ui-datepicker-calendar td { + padding: 0; +} +.ui-datepicker .ui-datepicker-calendar th { + background: #efefef; + border: 1px solid #cfcfcf; + padding: 4px; + color: #676056; + font-weight: bold; +} +.ui-datepicker-calendar tbody tr td, +.ui-datepicker-calendar tbody tr:nth-child(2n+1) td { + background: #fff; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + margin-top: -1px; +} +/* + Details element +-------------------------------------- */ +summary { + cursor: pointer; + display: inline-block; +} +.no-details details > * { + display: none; +} +.no-details details > summary:before { + float: left; + width: 20px; + content: 'â–º '; +} +.no-details details.open > summary:before { + content: 'â–¼ '; +} +.no-details details summary { + display: block; +} +/* + Blockquotes +-------------------------------------- */ +blockquote { + border-left: 2px solid #ccc; + padding-left: 5px; +} +blockquote small:before { + content: '\2014 \00A0'; +} +/* + Addresses +-------------------------------------- */ +address { + font-style: normal; +} +/* + Tables +-------------------------------------- */ +table > caption { + margin-bottom: 5px; +} +table tfoot, +table th { + background: #e6e6e6; +} +table tfoot, +table thead { + background: #666158; + color: #cac3b4; +} +table thead.active { + /*background:#F37B21;*/ + +} +table th { + text-align: left; + background: transparent; + font-weight: normal; +} +table th, +table td { + border: 1px solid #C0BBAF; + padding: 6px 10px 7px; +} +table tbody tr td { + background: #F5F2ED; + color: #676056; + padding-top: 12px; +} +table tbody tr:not(:last-child) td { + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; +} +table .dropdown-menu li { + padding: 7px 15px; + line-height: 14px; + cursor: pointer; +} +table tbody tr td:first-child input[type="checkbox"] { + margin: 0; +} +table tbody tr:nth-child(odd) td, +table tbody tr:nth-child(odd) th { + background-color: #E6E3DE; +} +table tbody tr.selected td, +table tbody tr.selected th { + border: 1px solid #C0BBAF; +} +table tbody tr.selected td, +table tbody tr.selected th, +table tbody tr:hover td, +table tbody tr:hover th, +table tbody tr:nth-child(odd):hover td, +table tbody tr:nth-child(odd):hover th { + background-color: #fff; +} +/* + X-tree styles +-------------------------------------- */ +.x-tree-node .leaf .x-tree-node-icon { + background-image: url(../images/fam_leaf.png); +} +.x-tree-node .system-leaf .x-tree-node-icon { + background-image: url(../images/fam_application_form_delete.png); +} +.x-tree-node-ct { + overflow: hidden; +} +/* + Styles for "js" tooltip with positionings +-------------------------------------- */ +.tipsy { + padding: 11px; +} +.tipsy-inner { + padding: 12px 15px; + max-width: 185px; + background: #faf8f6; + border: 1px solid #dcd8ce; + box-shadow: 0 2px 5px rgba(49, 48, 43, 0.4); +} +.tipsy-inner .error { + width: 158px; +} +.tipsy-inner .error h5 { + color: #be0a0a; + font-size: 16px; + font-weight: 500; + margin: 0 0 6px 0; +} +.tipsy-inner .error p { + color: #676056; + line-height: 1.5; + margin: 0; +} +.tipsy-e .tipsy-arrow { + top: 50%; + left: 1px; + margin-top: -10px; + border-top: 10px solid transparent; + border-right: 10px solid #dcd8ce; + border-bottom: 10px solid transparent; + border-left: none; +} +.tipsy-w .tipsy-arrow { + top: 50%; + right: 0; + margin-top: -10px; + border-top: 10px solid transparent; + border-right: none; + border-bottom: 10px solid transparent; + border-left: 10px solid #dcd8ce; +} +.tipsy-n .tipsy-arrow, +.tipsy-ne .tipsy-arrow, +.tipsy-nw .tipsy-arrow { + bottom: 1px; + border-top: 10px solid #dcd8ce; + border-right: 10px solid transparent; + border-bottom: none; + border-left: 10px solid transparent; +} +.tipsy-ne .tipsy-arrow { + left: 16px; +} +.tipsy-nw .tipsy-arrow { + right: 16px; +} +.tipsy-s .tipsy-arrow, +.tipsy-se .tipsy-arrow, +.tipsy-sw .tipsy-arrow { + top: 1px; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-bottom: 10px solid #dcd8ce; + border-top: none; +} +.tipsy-se .tipsy-arrow { + left: 16px; +} +.tipsy-sw .tipsy-arrow { + right: 16px; +} +.tipsy-arrow:after, +.tipsy-arrow:before { + position: absolute; + width: 0; + height: 0; + content: ''; +} +.tipsy-e .tipsy-arrow:after { + top: -5px; + left: 2px; + margin-top: -4px; + border-top: 9px solid transparent; + border-right: 9px solid #faf8f6; + border-bottom: 9px solid transparent; +} +.tipsy-e .tipsy-arrow:before { + top: -8px; + margin-top: 0; + border-top: 10px solid transparent; + border-right: 10px solid rgba(49, 48, 43, 0.1); + border-bottom: 10px solid transparent; +} +.tipsy-w .tipsy-arrow:after { + top: -5px; + left: -12px; + margin-top: -4px; + border-top: 9px solid transparent; + border-right: none; + border-bottom: 9px solid transparent; + border-left: 9px solid #faf8f6; +} +.tipsy-w .tipsy-arrow:before { + top: -8px; + left: -10px; + margin-top: 0; + border-top: 10px solid transparent; + border-right: none; + border-bottom: 10px solid transparent; + border-left: 10px solid rgba(49, 48, 43, 0.1); +} +.tipsy-n .tipsy-arrow:after, +.tipsy-ne .tipsy-arrow:after, +.tipsy-nw .tipsy-arrow:after { + margin-top: -4px; + left: -9px; + top: -7px; + border-top: 9px solid #faf8f6; + border-right: 9px solid transparent; + border-left: 9px solid transparent; +} +.tipsy-n .tipsy-arrow:before, +.tipsy-ne .tipsy-arrow:before, +.tipsy-nw .tipsy-arrow:before { + left: -10px; + top: -8px; + margin-top: 0; + border-top: 10px solid rgba(49, 48, 43, 0.1); + border-right: 10px solid transparent; + border-left: 10px solid transparent; +} +.tipsy-s .tipsy-arrow:after, +.tipsy-sw .tipsy-arrow:after, +.tipsy-se .tipsy-arrow:after { + left: -9px; + top: 6px; + margin-top: -4px; + border-top: none; + border-right: 9px solid transparent; + border-bottom: 9px solid #faf8f6; + border-left: 9px solid transparent; +} +.tipsy-inner dl { + margin: 0; +} +.tipsy-inner dt { + margin: 0 0 4px; + font-size: 16px; + font-weight: 400; + color: #f47b20; +} +.tipsy-inner dd { + margin: 0; + color: #676056; + font-size: 12px; + line-height: 18px; + font-family: Arial, Helvetica, sans-serif; +} +/* + Popups +-------------------------------------- */ +.fade .popup { + padding: 0; + border: 5px solid #969288; + border-radius: 8px; +} +.wrapper-popup { + padding: 0 10px; +} +.fade .popup .popup-inner { + padding: 20px; + border-radius: 3px; +} +.fade .popup .popup-title { + margin: 0 0 10px; +} +.popup-loading { + position: fixed; + z-index: 1003; + width: 200px; + background: rgba(255, 255, 255, 0.8); + left: 50%; + top: 40%; + margin-left: -100px; + color: #d85909; + border-color: #d85909; + font-size: 14px; + font-weight: bold; + text-align: center; + padding: 100px 0 10px; +} +.popup-loading:after { + position: absolute; + left: 50%; + top: 40%; + background-image: url(../mui/images/ajax-loader-big.gif); + width: 64px; + height: 64px; + margin: -32px 0 0 -32px; + content: ''; + z-index: 2; +} +/* Loading mask */ +.loading-old, +.loading-mask { + background: rgba(255, 255, 255, 0.4); + z-index: 999; +} +.loading-old, +.loading-mask { + position: fixed; + left: 0; + top: 0; + right: 0; + bottom: 0; +} +.loading-old .loader, +.loading-mask .loader { + position: absolute; + margin: auto; + left: 0; + top: 0; + right: 0; + bottom: 0; + width: 160px; + height: 160px; + color: #5e5b56; + font-size: 14px; + font-weight: bold; + text-align: center; + background: #e5e2dd url(../mui/images/ajax-loader-big.gif) no-repeat 50% 30%; + border-radius: 5px; + opacity: .95; +} +.loading-mask img { + display: none; +} +.loading-old p, +.loading-mask p { + margin-top: 118px; +} +/* Backup popup */ +/* TODO: remove after backups page js refactoring */ +.backup-dialog { + margin-top: inherit !important; +} +/* + Global Navigation +-------------------------------------- */ +.navigation { + position: relative; + border-bottom: 1px solid #aaa69c; + background: #726c62; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzcyNmM2MiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2NTYwNTciIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #726c62 0%, #656057 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #726c62), color-stop(100%, #656057)); + background: -webkit-linear-gradient(top, #726c62 0%, #656057 100%); + background: -o-linear-gradient(top, #726c62 0%, #656057 100%); + background: -ms-linear-gradient(top, #726c62 0%, #656057 100%); + background: linear-gradient(to bottom, #726c62 0%, #656057 100%); + padding: 0 20px; +} +.navigation:before { + position: absolute; + left: 0; + top: 0; + right: 0; + height: 5px; + box-shadow: 0 2px 4px #46433d inset; + content: ''; + z-index: 991; +} +.navigation:after { + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 1px; + background: #4e483f; + content: ''; + z-index: 1; +} +.navigation .level-0.reverse > .submenu { + right: 1px; +} +.navigation > ul { + position: relative; + min-width: 960px; + max-width: 1300px; + margin: 0 auto; + text-align: right; + z-index: 900; +} +.navigation .level-0 > .submenu { + display: none; + position: absolute; + top: 100%; + padding: 19px 10px; +} +.navigation .level-0 > .submenu a { + display: block; + color: #007dbd; + font-size: 13px; + font-weight: 400; + line-height: 1.385; + padding: 5px 20px 4px; + text-decoration: none; + -webkit-transition: color 0.15s ease-out; + -moz-transition: color 0.15s ease-out; +} +.navigation .level-0 > .submenu a:focus, +.navigation .level-0 > .submenu a:hover { + text-decoration: underline; +} +.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: 600; + line-height: 1; + margin: 7px 0 6px; + padding: 0 20px; +} +.navigation .level-0 > .submenu a[href="#"]:focus, +.navigation .level-0 > .submenu a[href="#"]:hover { + text-decoration: none; +} +.navigation .level-0 { + display: inline-block; + float: left; + text-align: left; + -webkit-transition: display 0.15s ease-out; + -moz-transition: display 0.15s ease-out; +} +.navigation .level-0 > a { + background: none; + position: relative; + display: inline-block; + padding: 37px 21px 11px; + color: #f2ebde; + font-size: 13px; + font-weight: 400; + text-shadow: 0 1px 3px #222; + text-transform: uppercase; + text-decoration: none; + -webkit-transition: background 0.15s ease-out; + -moz-transition: background 0.15s ease-out; +} +.navigation .level-0.active > a { + background: #625d54; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iIzYyNWQ1NCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM1NjUyNDkiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #625d54 1%, #565249 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #625d54), color-stop(100%, #565249)); + background: -webkit-linear-gradient(top, #625d54 1%, #565249 100%); + background: -o-linear-gradient(top, #625d54 1%, #565249 100%); + background: -ms-linear-gradient(top, #625d54 1%, #565249 100%); + background: linear-gradient(to bottom, #625d54 1%, #565249 100%); +} +.navigation .level-0.hover.recent > a { + background: #fff; + color: #676056; + font-size: 13px; + font-weight: 400; + text-shadow: 0 1px 3px #c1bfbb; +} +.navigation .level-0 > a:focus { + outline: none; +} +.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 > a:before { + position: absolute; + left: 0; + right: 0; + top: 12px; + text-align: center; + height: 20px; + content: ''; + font-family: 'admin-icons'; + font-size: 18px; + speak: none; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + text-shadow: none; +} +.navigation .level-0.item-dashboard > a:before, +.navigation .level-0.item-hub > a:before { + content: '\e007'; + font-size: 17px; +} +.navigation .level-0.item-sales > a:before, +.navigation .level-0.item-sales-and-orders > a:before { + content: '\e008'; +} +.navigation .level-0.item-catalog > a:before { + content: '\e00b'; +} +.navigation .level-0.item-customer > a:before, +.navigation .level-0.item-customers > a:before { + content: '\e009'; + font-size: 24px; + top: 10px; +} +.navigation .level-0.item-promo > a:before, +.navigation .level-0.item-marketing > a:before { + content: '\e00a'; + font-size: 17px; + top: 13px; +} +.navigation .level-0.item-cms > a:before, +.navigation .level-0.item-content > a:before { + content: '\e006'; + font-size: 16px; +} +.navigation .level-0.item-report > a:before, +.navigation .level-0.item-reports > a:before { + content: '\e00c'; + font-size: 16px; + top: 13px; +} +.navigation .level-0.item-newsletter > a:before { + font-family: 'MUI-Icons'; + content: '\e03c'; + font-size: 22px; + top: 9px; +} +.navigation .level-0 > .submenu { + background: #fff; + box-shadow: 0 3px 3px rgba(49, 48, 43, 0.5); + border-radius: 0 0 5px 5px; +} +.no-boxshadow .navigation .level-0 > .submenu { + border: 1px solid #cbc1b4; + border-width: 0 1px 1px; + margin-left: -1px; +} +.navigation .level-0 > .submenu li { + max-width: 200px; +} +.navigation .level-0 > .submenu > ul { + white-space: nowrap; +} +.navigation .level-0 > .submenu .column { + display: inline-block; + vertical-align: top; +} +.navigation .level-0 .submenu .level-1 { + white-space: normal; +} +.navigation .level-0.parent .submenu .level-1.parent { + margin: 17px 0; +} +.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; +} +/* + Admin and Store Settings +-------------------------------------- */ +.navigation .level-0.item-system, +.navigation .level-0.item-stores { + float: none; + margin: 21px 0 0; +} +.navigation .level-0.item-system > .submenu, +.navigation .level-0.item-stores > .submenu { + left: auto; + right: 1px; +} +.navigation .level-0.item-system.hover:after, +.navigation .level-0.item-stores.hover:after { + color: #c2b59c; +} +.navigation .level-0.item-system > a, +.navigation .level-0.item-stores > a { + position: relative; + padding: 0; +} +.navigation .level-0.item-system:hover > a, +.navigation .level-0.item-system.hover > a, +.navigation .level-0.item-stores:hover > a, +.navigation .level-0.item-stores.hover > a { + background: transparent; +} +.no-js .navigation .level-0.item-system:hover > a:before, +.navigation .level-0.item-system:hover > a:before, +.navigation .level-0.item-system.hover > a:before, +.no-js .navigation .level-0.item-stores:hover > a:before, +.navigation .level-0.item-stores:hover > a:before, +.navigation .level-0.item-stores.hover > a:before { + display: none; + position: absolute; + top: 1.4em; + left: auto; + right: -19px; + height: 20px; + width: 20px; + content: ''; + border: 10px solid #fff; + border-width: 0 0 10px 10px; + border-radius: 0 0 0 20px; + z-index: 2; +} +.navigation .level-0.item-system > a:after, +.navigation .level-0.item-stores > a:after { + display: none; + position: absolute; + top: 2em; + left: -20px; + margin-top: -1px; + width: 20px; + height: 20px; + content: ''; + border: 10px solid #fff; + border-width: 0 10px 10px 0; + border-radius: 0 0 20px; + z-index: 1; +} +.no-js .navigation .level-0.item-system:hover > a:after, +.navigation .level-0.item-system.hover > a:after, +.no-js .navigation .level-0.item-system:hover > a:before, +.navigation .level-0.item-system.hover > a:before, +.no-js .navigation .level-0.item-stores:hover > a:after, +.navigation .level-0.item-stores.hover > a:after, +.no-js .navigation .level-0.item-stores:hover > a:before, +.navigation .level-0.item-stores.hover > a:before { + display: block; +} +.no-js .navigation .level-0.last:hover > a:before, +.navigation .level-0.last.hover > a:before { + display: none; +} +.navigation .level-0.item-system > a span, +.navigation .level-0.item-stores > a span { + display: block; + position: relative; + padding: 4px 20px 5px 10px; + border: 1px solid #4c483f; + border-left: 0; + font: 12px/1.333 "Helvetica", Arial, serif; + text-transform: none; + text-shadow: none; + background: #58534a; + color: #f2ebde; + height: 1.333em; +} +.navigation .level-0.item-system:hover > a span, +.navigation .level-0.item-stores:hover > a span { + background: #31302B; +} +.navigation .level-0.item-system:hover > a span:after, +.navigation .level-0.item-stores:hover > a span:after { + color: #58534a; +} +.no-js .navigation .level-0.item-system:hover > a span, +.navigation .level-0.item-system.hover > a span, +.no-js .navigation .level-0.item-stores:hover > a span, +.navigation .level-0.item-stores.hover > a span { + background: #fff; + color: #676056; + text-shadow: none; + border-bottom: 0; + border-right: 0; + padding-right: 21px; + padding-bottom: 2em; + margin-bottom: -2em; +} +.no-js .navigation .level-0.last:hover > a span, +.navigation .level-0.last.hover > a span { + background: #fff; + color: #676056; + text-shadow: none; + border-bottom: 0; + border-right: 0; + padding-right: 21px; + padding-bottom: 2em; + margin-bottom: -2em; +} +.no-js .navigation .level-0.last:hover > a span, +.navigation .level-0.last.hover > a span { + border-right: 1px solid; + padding-right: 20px; +} +.navigation .level-0.item-system > a span:after, +.navigation .level-0.item-stores > a span:after { + position: absolute; + top: 7px; + right: 7px; + width: 10px; + height: 10px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: "\e02c"; + font-size: 8px; + text-align: center; + color: #31302b; + z-index: 2; +} +.navigation .level-0.item-stores > a span:before { + position: absolute; + left: -22px; + top: -1px; + bottom: -1px; + height: 1.333em; + padding: 0 0 9px; + width: 21px; + border: 1px solid #4c483f; + border-right: 0; + border-radius: 5px 0 0 5px; + font-family: 'MUI-Icons'; + font-style: normal; + font-size: 12px; + line-height: 2; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e07e'; + text-align: center; + color: #31302b; +} +.navigation .level-0.last > a, +.navigation .level-0.last > a span { + border-radius: 0 5px 5px 0; +} +.no-js .navigation .level-0.last:hover > a span, +.navigation .level-0.last.hover > a span, +.navigation .level-0.last > a:focus span { + border-radius: 0; +} +/* + Login page +-------------------------------------- */ +.page-login { + height: 100%; +} +.page-login .wrapper { + min-height: 100%; + padding: 0; +} +.page-login .wrapper-inner { + overflow: auto; + padding-bottom: 140px; +} +.page-login .footer { + clear: both; + height: 140px; + margin-top: -140px; + position: relative; +} +.page-login .footer-content { + max-width: none; + min-width: 0; +} +.page-login .footer-copyright { + text-align: right; +} +.page-login .form-login { + width: 280px; + margin: 160px auto 60px; + padding: 30px 25px; + border: 1px solid #e3ded5; + border-radius: 5px; + background: #f7f2ec; +} +.page-login .fieldset { + background: transparent; + border: 0; + border-radius: 0; + margin: 0; + padding: 0; +} +.page-login .fieldset > .legend { + border-bottom: 0; + margin-bottom: 15px; +} +.page-login .fieldset > .legend span { + font-size: 32px; + line-height: 32px; + padding: 0; + color: #8a847c; + display: inline; +} +.page-login .fieldset .field { + margin: 0 0 13px; +} +.page-login .form-inline .label { + width: auto; + padding: 0; + margin-bottom: 13px; +} +.page-login .field-username label, +.page-login .field-password label, +.page-login .field-confirmation label { + display: none; +} +.page-login .form-inline .label + .control { + width: auto; + float: none; +} +.page-login .header { + margin-bottom: 30px; + background: transparent; + padding: 0; + z-index: auto; + position: static; +} +.page-login .header .logo { + display: block; + width: 262px; + height: 64px; + text-indent: -999em; + background: url(Magento_Backend::images/logo-magento.png) no-repeat; +} +.page-login .form-actions { + padding: 0; + margin: 0; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.page-login .actions, +.page-login .links { + display: inline-block; + vertical-align: middle; +} +.page-login input[type=text], +.page-login input[type=password] { + border-color: #cac3b4; + font-size: 18px; + padding: 12px 12px 14px; + height: auto; +} +.page-login :-ms-input-placeholder { + color: #bebab1 !important; +} +.page-login ::-webkit-input-placeholder { + color: #bebab1 !important; +} +.page-login :-moz-placeholder { + color: #bebab1 !important; +} +.page-login .action-login, +.page-login .action-retrieve { + font-size: 22px; + padding: 14px 22px 16px; +} +.page-login .action-retrieve, +.page-login .action-reset { + font-size: 18px; + padding: 10px 17px 10px; +} +.page-login .action-forgotpassword, +.page-login .action-back { + font-size: 12px; + color: #1c8bb8; + text-decoration: underline; + position: absolute; + left: 0; + bottom: -70px; +} +.page-login .action-forgotpassword:hover, +.page-login .action-back:hover { + text-decoration: none; +} +/* + Page title +-------------------------------------- */ +.page-title { + position: relative; + margin: 20px 0; +} +.page-content > .page-title { + max-width: 1300px; + min-width: 960px; + margin-left: auto; + margin-right: auto; +} +.page-title-inner > .title { + color: #676056; + font-size: 28px; + font-weight: 400; + display: inline-block; + margin: 0; + width: 100%; + word-wrap: break-word; +} +.page-title-inner .title > h3 { + margin: 0; +} +.page-title-inner .actions { + float: right; +} +.page-title-inner .actions form { + display: inline-block; +} +/* + Messages (Global) +-------------------------------------- */ +.message { + margin: 0; + padding: 10px 26px 10px 32px; + background: #f9f5ec; + border: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + color: #676056; + text-shadow: none; + border-bottom: 1px solid #c7c2b6; +} +.wrapper > .message { + padding: 0 20px; +} +.page-content > #messages { + max-width: 1300px; + min-width: 960px; + margin: 0 auto; +} +.message:before, +.message-system .message-inner:before { + position: absolute; + left: 8px; + top: 50%; + margin-top: -8px; + background: none; + text-shadow: none; + width: auto; + height: auto; + border: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 16px; + content: '\e006'; + /* notification icon */ + + color: #6e685e; +} +.messages-inbox { + float: right; +} +.messages-inbox .critical { + color: red; +} +/* System Messages */ +.message-system { + padding: 0; +} +.message-system:before { + display: none; +} +.message-system .message-inner { + position: relative; + min-width: 960px; + max-width: 1300px; + margin: 0 auto; +} +.message-system .message-inner:before { + margin-top: -10px; +} +.message-system .message-content { + padding: 10px 26px 10px 32px; +} +/* + No-javaScript-Enabled message +-------------------------------------- */ +.message-noscript { + background: #ff9; + padding: 0; + border: 0; + box-shadow: 0 1px 2px #46433d; + z-index: 994; +} +.message-noscript .message-content { + margin: 0 auto; + max-width: 1300px; + min-width: 960px; + padding: 3px 0; + position: relative; + text-align: center; +} +.message-noscript:before { + content: ''; +} +.message-noscript .message-content:before { + position: relative; + background: none; + text-shadow: none; + width: auto; + height: auto; + vertical-align: middle; + border: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 32px; + content: '\e006'; + /* notification icon */ + + color: #6e685e; +} +.message-demo-mode { + background: #d75f07; + border: 0; + color: #fff; + text-align: center; + padding: 5px 0; + box-shadow: 0 1px 2px #46433d; + z-index: 993; +} +.message-demo-mode:before { + content: ''; +} +.message-demo-mode .message-content { + margin: 0 auto; + max-width: 1300px; + min-width: 960px; + position: relative; + text-align: center; +} +.message-demo-mode .message-content:before { + position: relative; + background: none; + text-shadow: none; + width: auto; + height: auto; + vertical-align: middle; + border: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 16px; + content: '\e006'; + /* notification icon */ + +} +/* + Information message +-------------------------------------- */ +.message-info { + background: #fffbf0; + border: 1px solid #d87e34; + margin-bottom: 20px; +} +.message-info:before { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e046'; + /* icon-info */ + + color: #d87e34; +} +/* + Error message +-------------------------------------- */ +.message-error { + color: #963535; + background: #f3dcd8; + border: 1px solid #963535; + margin-bottom: 20px; +} +.message-error:before { + content: '\e069'; + color: #963535; +} +/* + Store Switcher +-------------------------------------- */ +.store-switcher-alt { + position: relative; + display: inline-block; +} +.store-switcher-alt .dropdown-menu { + white-space: nowrap; + margin-top: 2px; +} +.store-switcher-alt.active .dropdown-menu { + display: block; +} +.store-switcher-alt .dropdown-menu ul { + margin: 0; + padding: 0; + list-style: none; +} +.store-switcher-alt strong { + display: block; + font-size: 14px; + font-weight: 500; + line-height: 1.333; + color: #a6a098; + padding: 5px 10px; +} +.store-switcher-alt .store-selected { + font-size: 12px; + font-weight: 400; + line-height: 1.333; + color: #676056; + cursor: pointer; +} +.store-switcher-alt .store-selected:after { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02c'; + /* arrow down icon */ + + color: #b3b0ad; + margin: 0 0 0 3px; + vertical-align: text-top; +} +.store-switcher-alt .store-switcher-website, +.store-switcher-alt .store-switcher-store { + padding: 0; +} +.store-switcher-alt .store-switcher-website:hover, +.store-switcher-alt .store-switcher-store:hover { + background: none; +} +.store-switcher-website { + margin: 5px 0 0; +} +.store-switcher-website > strong { + padding-left: 13px; +} +.store-switcher-store { + margin: 1px 0 0; +} +.store-switcher-store > strong { + padding-left: 20px; +} +.store-switcher-alt .store-switcher-store > ul { + margin-top: 1px; +} +.store-switcher-alt .store-switcher-store-view { + padding: 0; +} +.store-switcher-store-view:first-child { + border-top: 1px solid #e5e5e5; +} +.store-switcher-store-view > a { + display: block; + padding: 5px 15px 5px 24px; + color: #333; + font-size: 13px; + text-decoration: none; +} +.store-switcher-alt .store-switcher-all, +.store-switcher-alt .manage-stores { + padding: 0; +} +.store-switcher-alt .store-switcher-all > a, +.store-switcher-alt .manage-stores > a { + display: block; + padding: 8px 15px; + color: #676056; + text-decoration: none; + font-size: 12px; +} +/* + Page Structure +-------------------------------------- */ +.wrapper { + padding: 0 0 60px; + min-width: 1000px; +} +.page-content { + margin: 0 auto; + padding: 0 20px; +} +.page-title.complex .title { + float: left; + width: 70%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.page-title.complex .store-switcher-alt { + float: right; + margin: 12px 0 0; +} +.side-col { + position: relative; + width: 20%; +} +.main-col { + position: relative; + width: 80%; + padding: 0 20px 20px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} +.col-left { + float: left; +} +.col-right { + float: right; +} +.col-1-layout .main-col { + width: auto; +} +.col-2-left-layout .main-col, +.col-2-right-layout .side-col { + float: right; +} +.col-2-right-layout .main-col, +.col-2-left-layout .side-col { + float: left; +} +.col-2-left-layout, +.col-1-layout { + position: relative; + background: #f5f2ed; + border: 1px solid #d5d0ca; + border-radius: 5px; + min-width: 960px; + max-width: 1300px; + margin: 0 auto; +} +.col-1-layout { + padding: 20px; + min-width: 920px; + max-width: 1260px; +} +.col-2-left-layout:before { + position: absolute; + display: block; + left: 20%; + top: 0; + bottom: 0; + width: 6px; + margin-left: -7px; + content: ''; + background: -moz-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.06) 100%); + /* FF3.6+ */ + + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, rgba(0, 0, 0, 0.06))); + /* Chrome,Safari4+ */ + + background: -webkit-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.06) 100%); + /* Chrome10+,Safari5.1+ */ + + background: -o-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.06) 100%); + /* Opera 11.10+ */ + + background: -ms-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.06) 100%); + /* IE10+ */ + + background: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.06) 100%); + /* W3C */ + + z-index: 2; +} +/* Sidebar and main column vertical separator */ +.main-col:after, +.side-col:after { + position: absolute; + top: 0; + bottom: 0; + width: 1px; + background: #ded9d3; + content: ''; +} +.col-2-left-layout .side-col:after { + right: 0; +} +.col-2-right-layout .side-col:after { + left: 0; +} +.col-2-right-layout .main-col:after { + right: -1px; +} +.col-2-left-layout .main-col:after { + left: -1px; +} +.col-2-left-layout .main-col, +.col-2-right-layout .main-col { + min-width: 730px; +} +/* Sidebar title and store view switcher*/ +/* TODO: temporary styles */ +.side-col h3 { + padding: 0 17px; + margin-top: 16px; +} +.field-store-switcher { + padding: 0 0 20px; + margin: 0; +} +.side-col .ui-tabs h3 { + margin-bottom: 5px; + color: #524c44; + text-shadow: 0 1px 0 #fff; +} +.side-col > .store-switcher { + padding-top: 6px; +} +.field-store-switcher, +.field-store-switcher > .label + .control { + display: inline-block; +} +.field-store-switcher > .tooltip + div > a { + color: #007dbd; + font-size: 12px; + font-weight: 400; +} +.field-store-switcher > .tooltip + div > a:focus, +.field-store-switcher > .tooltip + div > a:hover { + text-decoration: underline; +} +.field-store-switcher > .label { + margin: 0; +} +.side-col > .field-store-switcher { + padding: 19px 18px 0; +} +.side-col > .field-store-switcher > .label { + margin: 0 0 6px; + display: block; +} +.dashboard-container .field-store-switcher { + padding: 20px 0; +} +.toolbar .field-store-switcher { + padding: 0; + margin-right: 20px; +} +/* + Universal Sidebar Tabs +-------------------------------------- */ +.side-col .ui-tabs .ui-accordion-header { + position: relative; + margin: 10px 0 0; + padding: 5px 20px; + cursor: pointer; + color: #524c44; + text-shadow: 0 1px 0 #fff; +} +.side-col .ui-tabs .ui-accordion-header:focus { + outline: none; +} +.side-col .ui-accordion-header:before { + position: absolute; + left: 4px; + top: 7px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02a'; + /* arrow right icon */ + + font-size: 14px; + color: #ada79e; +} +.side-col .ui-accordion-header:hover:before { + color: #777; +} +.side-col .ui-accordion-header-active:before { + content: '\e02c'; + /* arrow down icon */ + +} +.side-col .tabs { + margin: 0 0 30px; + padding: 0; + list-style: none; + font-weight: 500; +} +.side-col > .ui-tabs > .tabs:first-child > li:first-child > a { + border-top-left-radius: 5px; +} +.side-col .tabs > li { + border-bottom: 1px solid #e5e1db; +} +.side-col .tabs > li:first-child { + border-top: 1px solid #e5e1db; +} +.side-col .tabs > li a { + position: relative; + display: block; + padding: 8px 18px; + text-decoration: none; + color: #676056; + -webkit-transition: background 0.3s ease-in-out; + -moz-transition: background 0.3s ease-in-out; + transition: background 0.3s ease-in-out; +} +.side-col .tabs > li a:active, +.side-col .tabs > li a:focus { + outline: none; +} +.side-col .tabs > li a:hover { + background: #fff; +} +.side-col .tabs > .ui-state-active a { + border-left: 3px solid #d87e34; + padding-left: 15px; + background: #dedcd8; + box-shadow: 0 1px 2px #ccc inset; +} +.side-col .tabs > .ui-state-active a:after, +.side-col .tabs > .ui-state-active a:before { + position: absolute; + top: 50%; + right: 0; + width: 14px; + margin-top: -14px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02b'; + /* left turned triangle icon */ + + font-size: 22px; + color: #f5f2ed; + overflow: hidden; + z-index: 4; +} +.side-col .tabs > .ui-state-active a:before { + color: #bdbbb7; + margin-top: -13px; + z-index: 3; +} +.side-col .tabs span.error, +.side-col .tabs span.loader { + display: none; + position: absolute; + right: 12px; + top: 7px; + width: 16px; + height: 16px; + font-size: 16px; +} +.side-col .tab-item-link.changed { + font-style: italic; +} +.side-col .tab-item-link.error span.error, +.side-col .ui-tabs-loading span.loader { + display: block; +} +.side-col .tab-item-link.error span.error:after { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e006'; + /* warning icon */ + + color: #d87e34; +} +.side-col .ui-tabs-loading span.loader:after { + background: url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%; + display: block; + content: ''; + width: 16px; + height: 16px; +} +/* TODO: styles for navigation on System > Configuration page */ +/* + Horizontal Tabs +-------------------------------------- */ +.tabs-horiz { + list-style: none; + margin: 0; + padding: 3px 0 0; +} +.tabs-horiz > li { + float: left; + border: 1px solid #e9e4db; + border-bottom-width: 0; + margin: 0 -1px 0 0; +} +.tabs-horiz > li a { + position: relative; + display: block; + padding: 7px 18px 9px; + text-decoration: none; + font-size: 12px; + line-height: 1.666; + color: #676056; +} +.tabs-horiz > .ui-state-active a { + background: #fff; + border-top: 3px solid #f3771e; + margin-top: -3px; + box-shadow: 1px 0 3px #e9e4db; +} +/* + System -> Configuration page navigation in sidebar +-------------------------------------- */ +.config-nav, +.config-nav .items { + margin: 0; + padding: 0; + list-style: none; +} +.config-nav-block:last-child { + margin-bottom: 30px; +} +.config-nav .item { + border-top: 1px solid #E5E1DB; +} +.config-nav .item:first-child { + border-top: 0; +} +.config-nav .title { + margin-bottom: 0; + text-transform: uppercase; + color: #444; + border: solid #CCC; + border-width: 1px 0; + opacity: .8; + padding: 7px 17px; + background: #E6E3DE; +} +.config-nav .item-nav { + display: block; + padding: 8px 18px; + text-decoration: none; + color: #676056; + -webkit-transition: background 0.3s ease-in-out; + -moz-transition: background 0.3s ease-in-out; + transition: background 0.3s ease-in-out; +} +.config-nav .item-nav:hover { + background: #fff; +} +.config-nav .item-nav.active { + position: relative; + border-left: 3px solid #d87e34; + padding-left: 15px; + background: #dedcd8; + box-shadow: 0 1px 2px #ccc inset; +} +.config-nav .item-nav.active:after { + position: absolute; + top: 50%; + right: 0; + width: 14px; + margin-top: -14px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02b'; + /* left turned triangle icon */ + + font-size: 22px; + text-shadow: -1px 1px 0 #bdbbb7; + color: #f5f2ed; + overflow: hidden; + z-index: 3; +} +/* + Footer +-------------------------------------- */ +.footer { + position: absolute; + left: 0; + right: 0; + bottom: 0; + color: #989288; + font-size: 11px; +} +.footer-content { + margin: 0 auto; + max-width: 1300px; + min-width: 960px; + padding: 20px; +} +/* + Switcher +-------------------------------------- */ +.switcher { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + display: inline-block; + overflow: hidden; +} +.switcher input[type="checkbox"] { + position: absolute; + left: -999em; +} +.switcher-label { + color: #676056; + font-size: 13px; + font-weight: 600; + text-transform: uppercase; +} +.switcher-label:before { + content: attr(data-text-off); +} +.switcher-label:after { + display: inline-block; + margin-left: 10px; + vertical-align: bottom; + width: 34px; + height: 17px; + background: url(../images/switcher.png) no-repeat; + content: ''; +} +.switcher input[type="checkbox"]:focus + .switcher-label:after { + border-color: #75b9f0; +} +.switcher input[type="checkbox"]:checked + .switcher-label:after { + background-position: -34px 0; +} +.switcher input[type="checkbox"]:checked + .switcher-label:before { + content: attr(data-text-on); +} +/* + Content actions panel (with buttons, switchers...) +-------------------------------------- */ +.page-actions { + padding: 0 0 20px; + text-align: right; +} +.page-actions .buttons-group { + vertical-align: top; + text-align: left; +} +.page-actions > .switcher { + display: inline-block; + vertical-align: top; + margin: 6px 10px 0 0; +} +.main-col .page-actions { + padding: 20px 0; +} +.page-actions .store-switcher { + float: left; +} +.catalog-product-index .page-actions { + padding-top: 0; +} +/* TODO: refactor trees */ +.x-tree ul { + margin: 0; + padding: 0; +} +.page-actions.fixed { + padding: 0 21px; + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 998; +} +.page-actions.fixed .page-actions-inner { + background: -moz-linear-gradient(top, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%); + /* FF3.6+ */ + + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f2ed), color-stop(56%, #f5f2ed), color-stop(100%, rgba(245, 242, 237, 0))); + /* Chrome,Safari4+ */ + + background: -webkit-linear-gradient(top, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%); + /* Chrome10+,Safari5.1+ */ + + background: -o-linear-gradient(top, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%); + /* Opera 11.10+ */ + + background: -ms-linear-gradient(top, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%); + /* IE10+ */ + + background: linear-gradient(to bottom, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%); + /* W3C */ + + padding: 11px 20px 11px; + min-height: 36px; + margin: 0 auto; + min-width: 916px; + max-width: 1259px; +} +.lt-ie10 .page-actions.fixed .page-actions-inner { + background: #f5f2ed; +} +.page-actions.fixed .page-actions-inner:before { + content: attr(data-title); + float: left; + font-size: 20px; + max-width: 50%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +/* + Table Grid +-------------------------------------- */ +/* Grid - General */ +.grid-container { + margin-bottom: 10px; +} +.grid { + border-bottom: 0; + color: #676056; + font-size: 13px; + font-weight: 400; + padding-bottom: .5em; +} +.grid table { + border-collapse: collapse; + border: none; + width: 100%; +} +.grid table.border { + border: 1px solid #c0bbaf; +} +.grid tbody { + background: #e6e3de; +} +.grid tr.even, +.grid tr.even tr { + background: #f5f2ed; +} +.grid tr.on-mouse { + cursor: pointer; +} +.grid tr.on-mouse td, +.grid table tbody tr.on-mouse:hover td, +.grid table tbody tr.on-mouse:hover th, +.grid table tbody tr.on-mouse:nth-child(odd):hover td, +.grid table tbody tr.on-mouse:nth-child(odd):hover th { + background-color: #fff; +} +/* Rows mouse-over */ +.grid tr.invalid { + background-color: #f5d6c7; +} +.grid th, +.grid td { + padding: 2px 4px 2px 4px; + vertical-align: top; +} +.grid th { + border: none; +} +.grid td.editable input.input-text { + width: 50px; + margin-left: 4px; +} +.grid td input.input-text { + width: 86%; +} +.grid td input.input-inactive { + background: #eee; +} +.grid table td { + border: solid #c0bbaf; + border-width: 0 1px 1px; + padding: 5px; +} +.grid table.border td { + background: #fff; +} +.grid table td.product { + text-align: right; +} +.grid table td.empty-text { + border: solid #c0bbaf; + border-width: 0 1px; + color: #676056; + font-size: 16px; + font-weight: 400; + text-align: center; + padding: 15px; +} +.grid table tr:last-child td.empty-text { + border-width: 0 1px 1px; +} +.grid table td.empty-text:hover { + background: #e6e3de; +} +.grid table td .action-select { + width: 100%; +} +.grid tbody.odd tr { + background: #fff; +} +.grid tbody.even tr { + background: #f6f6f6; +} +.grid tbody.odd tr td, +.grid tbody.even tr td { + border-bottom: 0; +} +.grid tbody.odd tr.border td, +.grid tbody.even tr.border td { + border-bottom: 1px solid #dadfe0; +} +/* + Grid - Pager and Buttons row +-------------------------------------- */ +.grid-actions { + border: 1px solid #c0bbaf; + border-bottom: 0; + background: #f6f3ec; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y2ZjNlYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlZGVhZTEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f6f3ec), color-stop(100%, #edeae1)); + background: -webkit-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: -o-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: -ms-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: linear-gradient(to bottom, #f6f3ec 0%, #edeae1 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f3ec', endColorstr='#edeae1', GradientType=0); + padding: 7px 8px 8px; + position: relative; +} +[id$='Grid'] .separator { + padding: 0 4px; + color: #b9b9b9; +} +.grid-actions select { + margin: 0 5px; +} +.grid-actions .export, +.grid-actions .filter-actions { + float: right; + margin-left: 30px; +} +.grid-actions .filter-actions button { + float: left; + margin-left: 4px; +} +.grid-actions .pager { + color: #676056; + font-size: 13px; + font-weight: 400; +} +.grid-actions .pager select { + width: 5em; + margin: 0 4px; +} +.grid-actions .pager input.page { + width: 2em; +} +.pager .action-next, +.pager .action-previous { + display: inline-block; + position: relative; + text-indent: 100%; + overflow: hidden; + height: 16px; + width: 16px; + vertical-align: middle; + text-decoration: none; +} +.pager .action-next:after, +.pager .action-previous:after { + font-family: 'MUI-Icons'; + content: "\e02a"; + font-size: 16px; + color: #333; + position: absolute; + top: 0; + left: 0; + line-height: 1; + text-indent: 0; +} +.pager .action-previous:after { + content: "\e02b"; +} +.pager span.action-next:after, +.pager span.action-previous:after { + color: #7f7f7f; +} +.grid-actions .date { + float: left; + margin: 0 15px 0 0; + position: relative; +} +.grid-actions .date input { + margin: 0 5px; + width: 80px; +} +.grid-actions .required:after { + content: '*'; + color: #f00; +} +[class^=" reports-report-"] .grid-actions .required:after { + content: ''; +} +[class^=" reports-report-"] .grid-actions .required .label span:after { + content: '*'; + color: #f00; +} +.grid-actions img { + vertical-align: middle; + height: 22px; + width: 22px; +} +.grid-actions .pager img { + width: auto; + height: auto; +} +.grid-actions .validation-advice { + background: #f3dcd8; + border: 1px solid #963535; + border-radius: 3px; + color: #963535; + margin: 5px 0 0; + padding: 3px 7px; + position: absolute; + white-space: nowrap; + z-index: 5; +} +.grid-actions .validation-advice:before { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e029'; + /* user icon */ + + position: absolute; + top: -12px; + left: 50%; + margin-left: -3px; +} +.grid-actions .link-feed { + white-space: nowrap; +} +.grid-actions input[type="text"].validation-failed { + border-color: #fa7973; + box-shadow: 0 0 8px rgba(250, 121, 115, 0.6); +} +/* + Grid - Headings +-------------------------------------- */ +.grid tr.headings th { + color: #ffffff; + font-size: 13px; + font-weight: 700; + border-right: 1px solid #837f79; + padding: 0; + vertical-align: bottom; +} +.grid tr th:first-child { + border-left: 1px solid #837f79; +} +.grid tr.headings th > span { + display: block; + border-bottom: 2px solid transparent; + padding: 5px 5px 2px; + white-space: nowrap; +} +.grid tr.headings th:hover > span { + border-color: #504841; +} +.grid tr.headings th.no-link:hover > span, +.grid tr.headings th.col-select:hover > span { + border-color: transparent; +} +.grid tr.headings th a label { + display: block; + padding-right: 20px; +} +.grid tr.headings th a { + display: block; + color: #ffffff; + font-size: 13px; + font-weight: 700; + position: relative; + text-decoration: none; +} +.grid tr.headings th a:after { + display: none; + height: 8px; + width: 15px; + position: absolute; + bottom: 4px; + right: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + font-size: 20px; + line-height: 8px; + -webkit-font-smoothing: antialiased; + content: '\e038'; + /* arrow down icon */ + + color: #8c8172; +} +.grid tr.headings th a:hover:after { + display: block; +} +.grid tr.headings th a.sort-arrow-desc:after { + color: #c7b299; + display: block; +} +.grid tr.headings th a.sort-arrow-asc:after { + color: #c7b299; + content: '\e035'; + /* arrow up icon */ + + display: block; +} +.grid tr.headings th a.sort-arrow-desc:hover:after, +.grid tr.headings th a.sort-arrow-asc:hover:after { + color: #fff; +} +/* Grid - Filter */ +.grid .filter { + cursor: default; +} +.grid .filter th { + padding: 5px; + border-right: 1px solid #837F79; + vertical-align: top; + white-space: normal; +} +.grid .filter input.input-text { + background: #5e5a52; + border-radius: 2px; + border: none; + color: #bcb795; + padding: 0 5px; + height: 20px; + width: 99%; +} +.grid .filter input.input-text::-webkit-input-placeholder { + color: #858376 !important; + text-transform: lowercase; +} +.grid .filter input.input-text:-moz-placeholder { + color: #858376 !important; + text-transform: lowercase; +} +.grid .filter input.input-text::-moz-placeholder { + color: #858376 !important; + text-transform: lowercase; +} +:-ms-input-placeholder { + color: #858376 !important; + text-transform: lowercase; +} +.grid .filter select { + background: #5e5a52; + border-radius: 2px; + border: none; + color: #bcb795; + margin: 0; + padding: 0; + height: 20px; + width: 99%; +} +.grid td select { + font-family: Arial, Helvetica, sans-serif; + font-size: 13px; + padding: 4px 4px 5px; + text-align: left; +} +.grid .action-select { + background: #fff; + border: 1px solid #ccc; + margin: 0; +} +.grid .filter .range .range-line { + margin-bottom: 3px; +} +.grid .filter .range div.date { + min-width: 121px; +} +.grid .filter .range .date input { + margin-top: 0; + vertical-align: middle; + width: 80%; +} +.grid .filter .range select { + margin: 0; + color: #676056; + font-size: 11px; + font-weight: 400; + color: #bcb795; +} +.grid .filter .date { + position: relative; +} +.grid .filter .date img { + width: 15px; + height: 15px; + cursor: pointer; + vertical-align: middle; + margin-left: 5px; + position: relative; + z-index: 2; + opacity: 0; +} +.grid .filter .date:before { + position: absolute; + left: 80%; + top: 1px; + margin-left: 5px; + text-shadow: none; + width: 16px; + height: 16px; + line-height: 16px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 16px; + content: '\e06a'; + /* icon calendar */ + + color: #cac3b4; + z-index: 1; +} +.grid .head-massaction select { + width: 50px; +} +/* Grid - Mass Action */ +.massaction { + color: #cac3b4; + padding: 7px 8px; + background: #666158; + box-shadow: 0 1px 2px 0 #504d46 inset, 0 -1px 2px 0 #504d46 inset; + overflow: hidden; +} +.massaction ul { + list-style: none; + margin: 0; + padding: 6px 0 0; +} +.massaction li { + display: inline-block; +} +.massaction li:before { + color: #837F79; + content: '|'; + display: inline-block; + margin: 0 5px; +} +.massaction li:first-child:before { + display: none; +} +.massaction .entry-edit { + float: right; + display: inline-block; +} +.massaction .entry-edit fieldset { + margin: 0; + padding: 0; + background: none; + border: none; +} +.massaction .entry-edit fieldset select { + border-radius: 2px; + margin: 0; +} +.massaction .entry-edit fieldset select.validation-failed { + border: 1px dashed #eb340a; + background: #faebe7; +} +.massaction .entry-edit .field-row { + display: inline-block; + vertical-align: middle; +} +.massaction .entry-edit .outer-span .entry-edit { + float: none; +} +.massaction .entry-edit .field-row label { + color: #cac3b4; + line-height: 26px; + margin: 0 5px 0 20px; + padding: 0; + vertical-align: middle; + width: auto; + float: none; +} +.massaction .entry-edit .validation-advice { + display: none !important; +} +.massaction a { + color: #e7e2d7; + text-decoration: none; +} +.massaction a:hover { + color: #fff; +} +/* Grid Footer */ +.grid table tfoot tr { + background: #656156; +} +.grid table tfoot tr th, +.grid table tfoot tr td { + border-right: 1px solid #837f79; + line-height: 1.7em; + padding: 3px 10px; +} +.grid table tfoot tr th:first-child, +.grid table tfoot tr td:first-child { + border-left: 1px solid #837f79; +} +.grid table.border tfoot tr td { + background: #656156; +} +.grid .col-price, +.grid .col-number { + text-align: right; +} +/* Dynamic Grid */ +/* Used in pages like Catalog -> Attributes */ +.dynamic-grid th { + padding: 2px; + width: 100px; +} +.dynamic-grid td { + padding: 2px; +} +.dynamic-grid td input { + width: 94px; +} +tr.dynamic-grid td, +tr.dynamic-grid th { + padding: 2px 10px 2px 0; + width: auto; +} +tr.dynamic-grid input.input-text { + width: 154px; +} +.available { + color: #080; + font-weight: bold; +} +.not-available { + color: #800; +} +.categories-side-col { + padding: 0 3%; +} +/* + TODO: change ids to 'table.data' after refactoring of all templates for grids + Manage Products Grid +-------------------------------------- */ +#cross_sell_product_grid table.data, +#up_sell_product_grid table.data, +#related_product_grid table.data, +#productGrid_table, +#setGrid_table, +#attributeGrid_table, +.custom-options .data-table, +.ui-dialog .data { + word-wrap: break-word; + table-layout: fixed; +} +#cross_sell_product_grid table.data th, +#up_sell_product_grid table.data th, +#related_product_grid table.data th, +#productGrid_table th, +#setGrid_table th, +#attributeGrid_table th, +.custom-options .data-table th, +.ui-dialog .data th { + word-wrap: normal; + overflow: hidden; + vertical-align: top; +} +#cross_sell_product_grid table.data th > span, +#up_sell_product_grid table.data th > span, +#related_product_grid table.data th > span, +#productGrid_table th > span, +#customerGrid_table th > span, +#setGrid_table th > span, +#attributeGrid_table th > span, +.custom-options .data-table th > span, +.ui-dialog .data th > span { + white-space: normal; +} +table .col-draggable .draggable-handle { + position: relative; + top: 0; + float: left; +} +.grid table .col-id { + text-align: left; +} +/* + Data table +-------------------------------------- */ +.data-table { + border-collapse: separate; + /* do not remove this! without this rule in FF when table has only 1 row bottom and side borders disappear*/ + + width: 100%; +} +.data-table thead, +.data-table tfoot, +.data-table th, +.accordion .config .data-table thead th, +.accordion .config .data-table tfoot td { + background: #fff; + color: #676056; + font-size: 13px; + font-weight: 600; +} +.data-table th { + border-color: #c9c2b8; + border-width: 0 0 1px; + padding: 7px; +} +.data-table td, +.data-table tbody tr td, +.accordion .config .data-table td { + background: #fff; + padding: 5px 7px; + color: #676056; + font-size: 14px; + font-weight: 400; + vertical-align: middle; + border: solid #eae8e4; + border-width: 0 0 1px; +} +.data-table tbody tr.selected td, +.data-table tbody tr.selected th, +.data-table tbody tr:hover td, +.data-table tbody tr:hover th { + background: #fff; +} +.data-table tbody tr:nth-child(odd) td, +.data-table tbody tr:nth-child(odd):hover td, +.accordion .config .data-table tbody tr:nth-child(odd) td { + background: #fbfaf6; +} +.data-table tbody tr.odd td { + background: #fbfaf6; +} +.data-table tfoot tr:last-child td, +.data-table tfoot tr:last-child th, +.accordion .config .data-table tfoot tr:last-child td { + border: 0; +} +.data-table input[type="text"] { + width: 98%; + padding-left: 1%; + padding-right: 1%; +} +.data-table select { + margin: 0; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 4px; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.data-table th.required-entry:after, +.data-table td.required-entry:after { + content: '*'; + color: red; +} +.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 .dropdown-menu { + border-top-right-radius: 0; +} +/* + Data table - alternative view +-------------------------------------- */ +.customer-information .data-table, +.order-information .data-table, +.order-account-information .data-table, +.adminhtml-rma-new .data-table { + width: 100%; +} +.customer-information .data-table tbody tr th, +.order-information .data-table tbody tr th, +.order-account-information .data-table tbody tr th, +.adminhtml-rma-new .data-table tbody tr th, +.adminhtml-logging-details .log-details .data-table th, +[class^=" sales-transactions-"] .data-table tbody tr th, +[class^=" sales-"] .order-payment-method .data-table tbody tr th, +[class^=" sales-billing-agreement-"] .log-details .data-table tbody tr th { + font-weight: bold; +} +.customer-information .data-table tbody tr td, +.customer-information .data-table tbody tr th, +.order-information .data-table tbody tr td, +.order-information .data-table tbody tr th, +.order-account-information .data-table tbody tr td, +.order-account-information .data-table tbody tr th, +.adminhtml-logging-details .log-details .data-table td, +.adminhtml-logging-details .log-details .data-table th, +[class^=" adminhtml-rma-"] .data-table tbody tr td, +[class^=" adminhtml-rma-"] .data-table tbody tr th, +[class^=" sales-transactions-"] .data-table tbody tr th, +[class^=" sales-transactions-"] .data-table tbody tr td, +[class^=" sales-"] .order-payment-method .data-table tbody tr th, +[class^=" sales-"] .order-payment-method .data-table tbody tr td, +[class^=" sales-billing-agreement-"] .log-details .data-table tbody tr th, +[class^=" sales-billing-agreement-"] .log-details .data-table tbody tr td { + background-color: #fff; + border: 0; + padding: 9px 10px 10px; + color: #666; + vertical-align: top; +} +.customer-information .data-table tbody tr:nth-child(2n+1) td, +.customer-information .data-table tbody tr:nth-child(2n+1) th, +.order-information .data-table tbody tr:nth-child(2n+1) td, +.order-information .data-table tbody tr:nth-child(2n+1) th, +.order-account-information .data-table tbody tr:nth-child(2n+1) td, +.order-account-information .data-table tbody tr:nth-child(2n+1) th, +.adminhtml-logging-details .log-details .data-table tr:nth-child(odd) td, +.adminhtml-logging-details .log-details .data-table tr:nth-child(odd) th, +[class^=" adminhtml-rma-"] .data-table tbody tr:nth-child(2n+1) td, +[class^=" adminhtml-rma-"] .data-table tbody tr:nth-child(2n+1) th, +[class^=" sales-transactions-"] .data-table tbody tr:nth-child(2n+1) th, +[class^=" sales-transactions-"] .data-table tbody tr:nth-child(2n+1) td, +[class^=" sales-"] .order-payment-method .data-table tbody tr:nth-child(2n+1) th, +[class^=" sales-"] .order-payment-method .data-table tbody tr:nth-child(2n+1) td, +[class^=" sales-billing-agreement-"] .log-details .data-table tbody tr:nth-child(2n+1) th, +[class^=" sales-billing-agreement-"] .log-details .data-table tbody tr:nth-child(2n+1) td { + background-color: #fbfaf6; +} +/* + Content alignments in tables +-------------------------------------- */ +/* left */ +.col-website, +.col-name, +.col-sku, +.col-color, +.col-size, +.col-product, +.col-comment, +.col-actions, +.col-status { + text-align: left; +} +/* center */ +.col-include, +.col-display, +.col-image, +.col-no-records, +.col-select, +.col-default, +.col-uqty { + text-align: center; +} +/* right */ +.col-qty, +.col-weight, +.col-price, +.col-price > input, +.col-id, +.col-total, +.col-average { + text-align: right; +} +/* + Attribute Information +-------------------------------------- */ +.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 { + margin: 0 5px; + width: 40%; +} +.data-table .col-file input:first-child { + margin-left: 0; +} +/* + Website store views tree +-------------------------------------- */ +.store-tree .website-name { + font-size: 14px; + font-weight: bold; +} +.store-tree .webiste-groups { + margin: 5px 0 20px 18px; +} +.store-tree .webiste-groups dt { + font-weight: bold; +} +.store-tree .webiste-groups dd { + margin: 5px 0 15px 15px; +} +.store-tree .webiste-groups dd > ul { + list-style: none; + margin: 0; + padding: 0; +} +.store-tree .webiste-groups dd > ul > li { + margin: 0 0 5px; +} +/* + Customer Reviews +-------------------------------------- */ +.field-detailed_rating .control-value { + padding: 0; +} +.field-detailed_rating .nested { + padding: 0; +} +.field-detailed_rating .field-rating { + margin: 15px 0 0 0; +} +.field-detailed_rating .field-rating:first-child { + margin-top: 0; +} +.field-detailed_rating .field-rating .label { + width: 75px; +} +.field-detailed_rating .field-rating .control { + unicode-bidi: bidi-override; + direction: rtl; + width: 125px; +} +.field-detailed_rating input[type="radio"] { + display: none; +} +.field-detailed_rating .field-rating .control label { + color: #ccc; + cursor: pointer; + font-size: 18px; + float: right; + overflow: hidden; + white-space: nowrap; + width: 18px; + -webkit-transition: color 150ms linear; + -moz-transition: color 150ms linear; + -o-transition: color 150ms linear; + -ms-transition: color 150ms linear; + transition: color 150ms linear; +} +/* + Tree Store Scope +-------------------------------------- */ +.tree-store-scope .buttons-set { + margin-bottom: 9px; +} +.tree-store-scope .buttons-set button { + margin-right: 4px; +} +.tree-store-scope .field { + margin: 0 0 5px; +} +.tree-store-scope [class^="field field-website_"] .label, +.tree-store-scope [class^="field field-group_"] .label, +.tree-store-scope [class^="field field-w_"] .label, +.tree-store-scope [class^="field field-sg_"] .label { + text-align: left; + font-size: 18px; + padding-right: 0; + width: auto; +} +.tree-store-scope [class^="field field-group_"] .label, +.tree-store-scope [class^="field field-sg_"] .label { + padding-left: 20px; +} +.tree-store-scope .field input[type="checkbox"] { + margin-right: 3px; + position: relative; + top: 2px; +} +.tree-store-scope .field .addafter { + display: inline-block; + padding-top: 6px; +} +.tree-store-scope .tooltip .help { + margin-top: 11px; +} +/* + Product Massaction page + TODO: css code below should be removed after element.html refactoring +-------------------------------------- */ +.attributes-edit-form .attribute-change-checkbox { + white-space: nowrap; + display: block; +} +.attributes-edit-form .attribute-change-checkbox > label > input { + width: auto; +} +.attributes-edit-form .field:last-child, +.attributes-edit-form .field-name, +.attributes-edit-form .field.type-price, +.attributes-edit-form .field-price, +.attributes-edit-form .field-special_price, +.attributes-edit-form .field-meta_title, +.attributes-edit-form .field-visibility, +.attributes-edit-form .field-custom_design, +.attributes-edit-form .field-page_layout, +.attributes-edit-form .field-options_container, +.attributes-edit-form .field-country_of_manufacture, +.attributes-edit-form .field-msrp_display_actual_price_type, +.attributes-edit-form .field-tax_class_id, +.attributes-edit-form .field-is_returnable, +.attributes-edit-form .field-msrp, +.attributes-edit-form .field-gift_wrapping_price { + margin-bottom: 50px; +} +.attributes-edit-form .field .control { + position: relative; +} +.attributes-edit-form .field-name .attribute-change-checkbox, +.attributes-edit-form .field-meta_title .attribute-change-checkbox, +.attributes-edit-form .field-gift_wrapping_price .attribute-change-checkbox, +.attributes-edit-form .field .control select + .addafter { + position: absolute; + left: 0; + top: 35px; +} +.attributes-edit-form .field.type-price .attribute-change-checkbox, +.attributes-edit-form .field-price .attribute-change-checkbox, +.attributes-edit-form .field-special_price .attribute-change-checkbox, +.attributes-edit-form .field-msrp .attribute-change-checkbox { + position: absolute; + top: 35px; +} +.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; + border-radius: 4px; + width: 130px; +} +.attributes-edit-form .field-special_from_date .attribute-change-checkbox, +.attributes-edit-form .field-special_to_date .attribute-change-checkbox, +.attributes-edit-form .field-news_from_date .attribute-change-checkbox, +.attributes-edit-form .field-news_to_date .attribute-change-checkbox, +.attributes-edit-form .field-custom_design_from .attribute-change-checkbox, +.attributes-edit-form .field-custom_design_to .attribute-change-checkbox { + margin-top: 5px; +} +.attributes-edit-form .field-weight .fields-group-2 .control { + width: 160px; +} +.attributes-edit-form .field-weight .fields-group-2 .control > input { + width: 130px; + float: left; +} +.attributes-edit-form .field-weight .fields-group-2 .control > input + .addafter { + position: absolute; + top: 35px; +} +.attributes-edit-form .field-weight .fields-group-2 .control .addafter strong { + line-height: 26px; +} +.attributes-edit-form .field .control select { + border-radius: 4px; +} +.attributes-edit-form .field-gift_message_available .addon > .select, +.attributes-edit-form .field-gift_wrapping_available .addon > .select { + margin-bottom: 25px; +} +.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; +} +/* + Widgets +-------------------------------------- */ +.widget-layout-updates .fieldset-wrapper, +.widget-layout-updates .data-table { + margin: 0 0 18px; +} +.widget-layout-updates .fieldset-wrapper-title label { + padding: 10px 0 0; +} +.widget-layout-updates .fieldset-wrapper-title select { + margin: 3px 10px 5px; +} +.widget-layout-updates .fieldset-wrapper-title span, +.widget-layout-updates .fieldset-wrapper-title select { + vertical-align: middle; +} +.widget-layout-updates .data-table { + table-layout: fixed; +} +.widget-layout-updates .data-table, +.widget-layout-updates .data-table tr:nth-child(odd) td, +.widget-layout-updates .data-table tr:nth-child(odd):hover td { + background: none; + border: none; +} +.widget-layout-updates .data-table th, +.widget-layout-updates .data-table tbody td { + border: none; + padding: 5px 10px; + vertical-align: top; +} +.widget-layout-updates .data-table select { + margin: 0; + max-width: 99%; + overflow: hidden; +} +.widget-layout-updates .chooser_container { + padding: 0 10px; + margin-bottom: 18px; +} +.widget-layout-updates .chooser_container p { + margin: 0 0 18px; +} +.widget-layout-updates .chooser_container p img, +.widget-layout-updates .chooser_container p input { + vertical-align: middle; +} +/* + Preview window +-------------------------------------- */ +.preview-window { + background: #fff; +} +.preview-window .toolbar { + background: #f5f2ed; + padding: 20px; +} +.preview-window .toolbar .switcher { + margin: 0; +} +.preview-window .toolbar .switcher span { + background: none; + width: auto; +} +/* + Global 'No Products found' block +-------------------------------------- */ +.no-products-message { + background: #fbfaf6; + padding: 12px; + text-align: center; + font-size: 12px; + color: #666; + margin-bottom: 13px; +} +/* + WYSIWYG +-------------------------------------- */ +.action-wysiwyg { + margin: 10px 0; +} +#catalog-wysiwyg-editor .buttons-set { + margin-bottom: 9px; +} +#catalog-wysiwyg-editor .buttons-set button { + margin-right: 4px; +} +/* + System Messages +-------------------------------------- */ +.message-system { + min-width: 960px; + max-width: 1300px; + margin: 0 auto; + overflow: hidden; +} +.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; +} +/* + Add Attribute Popup +-------------------------------------- */ +#create_new_attribute { + overflow: hidden; +} +#create_new_attribute > .loading-mask { + left: -25px; + top: -50px; +} +.attribute-popup { + background: none; +} +.attribute-popup #edit_form > .fieldset > .legend { + display: none; +} +.attribute-popup .wrapper-popup { + padding: 0; + height: 511px; + overflow-x: hidden; + overflow-y: auto; +} +.attribute-popup .fieldset, +.attribute-popup .fieldset-wrapper { + border: none; + border-radius: 0; + padding: 4px 0 20px; + margin: 0 23px 20px; +} +.attribute-popup .fieldset-wrapper { + border-top: none; +} +.attribute-popup .fieldset-wrapper .fieldset-wrapper-title { + border-bottom: none; +} +.attribute-popup .fieldset-wrapper .fieldset-wrapper-content > .fieldset { + margin-left: 0; + margin-right: 0; +} +.attribute-popup .fieldset > .field > input[type="checkbox"] { + margin-top: 7px; +} +.attribute-popup .fieldset .label { + width: 35%; +} +.attribute-popup .collapsable-wrapper, +#manage-titles-wrapper .fieldset-wrapper-title { + margin-bottom: 0; + padding-bottom: 0; +} +.attribute-popup .collapsable-wrapper .fieldset-wrapper-title > .title:before { + color: #797269; + font-size: 14px; + top: 9px; +} +.attribute-popup form .entry-edit:first-child .fieldset { + border-bottom: 1px solid #dfdcd7; +} +.attribute-popup .fieldset .legend { + border: none; +} +.attribute-popup .page-actions { + position: fixed; + top: auto !important; + left: 0; + right: 0; + bottom: 0; + background: #fff; + padding: 27px 50px 25px 23px; + border-top: 1px solid #dfdcd7; +} +.attribute-popup .page-actions [class^='action-'] { + margin-left: 18px; +} +.attribute-popup #base_fieldset { + padding-top: 20px; +} +.attribute-popup #base_fieldset > .legend { + display: none; +} +.attribute-popup .page-actions #reset, +.attribute-popup .page-actions #reset:hover, +.attribute-popup .page-actions #reset:active, +.attribute-popup .page-actions #reset:focus { + float: right; + vertical-align: middle; + margin: 5px 0 0 18px; +} +.attribute-popup .page-actions-placeholder { + display: none; +} +.attribute-popup .page-actions.fixed .page-actions-inner { + background: #fff; + padding: 0; + min-width: 100%; + max-width: 100%; + min-height: 100%; + margin: 0; +} +.attribute-popup .footer { + display: none; +} +#manage-options-panel > .data-table { + clear: both; +} +.CustomGridView .col-1-layout, +.sales-order-index .col-1-layout, +.adminhtml-rma-index .col-1-layout, +.adminhtml-catalog-event-index .col-1-layout, +.adminhtml-urlrewrite-index .col-1-layout, +.catalog-search-index .col-1-layout, +.catalog-product-review-index .col-1-layout, +.catalog-rule-promo-catalog-index .col-1-layout, +.sales-rule-promo-quote-index .col-1-layout, +.adminhtml-reminder-index .col-1-layout, +.newsletter-template-index .col-1-layout, +.adminhtml-system-email-template-index .col-1-layout, +.adminhtml-sitemap-index .col-1-layout, +.adminhtml-googleshopping-types-index .col-1-layout, +.customer-index-index .col-1-layout, +.adminhtml-cms-page-index .col-1-layout, +.cms-block-index .col-1-layout, +.adminhtml-banner-index .col-1-layout, +.adminhtml-widget-instance-index .col-1-layout, +.cms-page-index .col-1-layout, +.adminhtml-webapi-user-index .col-1-layout, +.adminhtml-webapi-role-index .col-1-layout, +.adminhtml-system-variable-index .col-1-layout, +.adminhtml-user-index .col-1-layout, +.adminhtml-user-role-index .col-1-layout, +.adminhtml-integration-index .col-1-layout, +.adminhtml-system-design-theme-index .col-1-layout, +.adminhtml-system-design-index .col-1-layout, +.adminhtml-customer-attribute-index .col-1-layout, +.adminhtml-customer-address-attribute-index .col-1-layout, +.rating-index-index .col-1-layout, +.tax-rule-index .col-1-layout, +.tax-rate-index .col-1-layout, +.adminhtml-rma-item-attribute-index .col-1-layout, +.adminhtml-reward-rate-index .col-1-layout, +.customer-group-index .col-1-layout, +.checkout-agreement-index .col-1-layout, +.catalog-product-attribute-index .col-1-layout, +.catalog-product-set-index .col-1-layout, +.catalog-product-index .col-1-layout, +.sales-invoice-index .col-1-layout, +.sales-shipment-index .col-1-layout, +.sales-creditmemo-index .col-1-layout, +.sales-billing-agreement-index .col-1-layout, +.sales-transactions-index .col-1-layout, +.sales-recurring-profile-index .col-1-layout, +.adminhtml-googleshopping-items-index .col-1-layout, +.customer-online-index .col-1-layout, +.newsletter-queue-index .col-1-layout, +.newsletter-subscriber-index .col-1-layout, +.adminhtml-report-shopcart-product .col-1-layout, +.adminhtml-report-shopcart-abandoned .adminhtml-report-product-downloads .col-1-layout, +.adminhtml-report-product-sold .col-1-layout, +.adminhtml-report-product-lowstock .col-1-layout, +.adminhtml-report-customer-accounts .col-1-layout, +.adminhtml-report-customer-totals .col-1-layout, +.adminhtml-report-customer-orders .col-1-layout, +.adminhtml-report-customer-wishlist-wishlist .col-1-layout, +.adminhtml-report-review-customer .col-1-layout, +.adminhtml-report-review-product .col-1-layout, +.adminhtml-report-search .col-1-layout, +.adminhtml-report-statistics-index .col-1-layout, +.newsletter-problem-index .col-1-layout, +.adminhtml-system-store-index .col-1-layout, +.sales-order-status-index .col-1-layout, +.adminhtml-system-currency-index .col-1-layout, +.adminhtml-system-currencysymbol-index .col-1-layout, +.adminhtml-scheduled-operation-index .col-1-layout, +.adminhtml-cache-index .col-1-layout, +.adminhtml-system-backup-index .col-1-layout, +.adminhtml-locks-index .col-1-layout, +.adminhtml-notification-index .col-1-layout, +.adminhtml-logging-archive .col-1-layout, +.adminhtml-logging-index .col-1-layout, +.adminhtml-process-list .col-1-layout, +.catalog-product-index .col-1-layout { + padding: 0; + background: transparent; + border: 0; + border-radius: 0; + max-width: 1300px; + min-width: 960px; +} +.CustomGridAction .grid-actions, +.sales-order-index .grid-actions, +.adminhtml-rma-index .grid-actions, +.adminhtml-catalog-event-index .grid-actions, +.adminhtml-urlrewrite-index .grid-actions, +.catalog-search-index .grid-actions, +.catalog-product-review-index .grid-actions, +.catalog-rule-promo-catalog-index .grid-actions, +.sales-rule-promo-quote-index .grid-actions, +.adminhtml-reminder-index .grid-actions, +.newsletter-template-index .grid-actions, +.adminhtml-system-email-template-index .grid-actions, +.adminhtml-sitemap-index .grid-actions, +.adminhtml-googleshopping-types-index .grid-actions, +.customer-index-index .grid-actions, +.adminhtml-cms-page-index .grid-actions, +.cms-block-index .grid-actions, +.adminhtml-banner-index .grid-actions, +.adminhtml-widget-instance-index .grid-actions, +.cms-page-index .grid-actions, +.adminhtml-webapi-user-index .grid-actions, +.adminhtml-webapi-role-index .grid-actions, +.adminhtml-system-variable-index .grid-actions, +.adminhtml-user-index .grid-actions, +.adminhtml-user-role-index .grid-actions, +.adminhtml-integration-index .grid-actions, +.adminhtml-system-design-theme-index .grid-actions, +.adminhtml-system-design-index .grid-actions, +.adminhtml-customer-attribute-index .grid-actions, +.adminhtml-customer-address-attribute-index .grid-actions, +.rating-index-index .grid-actions, +.tax-rule-index .grid-actions, +.tax-rate-index .grid-actions, +.adminhtml-rma-item-attribute-index .grid-actions, +.adminhtml-reward-rate-index .grid-actions, +.customer-group-index .grid-actions, +.checkout-agreement-index .grid-actions, +.catalog-product-attribute-index .grid-actions, +.catalog-product-set-index .grid-actions, +.catalog-product-index .grid-actions { + border-radius: 5px 5px 0 0; + margin-top: 20px; + padding: 9px 16px 9px 65px; +} +.CustomGridAction .page-actions.fixed, +.sales-order-index .page-actions.fixed, +.adminhtml-rma-index .page-actions.fixed, +.adminhtml-catalog-event-index .page-actions.fixed, +.adminhtml-urlrewrite-index .page-actions.fixed, +.catalog-search-index .page-actions.fixed, +.catalog-product-review-index .page-actions.fixed, +.catalog-rule-promo-catalog-index .page-actions.fixed, +.sales-rule-promo-quote-index .page-actions.fixed, +.adminhtml-reminder-index .page-actions.fixed, +.newsletter-template-index .page-actions.fixed, +.adminhtml-system-email-template-index .page-actions.fixed, +.adminhtml-sitemap-index .page-actions.fixed, +.adminhtml-googleshopping-types-index .page-actions.fixed, +.customer-index-index .page-actions.fixed, +.adminhtml-cms-page-index .page-actions.fixed, +.cms-block-index .page-actions.fixed, +.adminhtml-banner-index .page-actions.fixed, +.adminhtml-widget-instance-index .page-actions.fixed, +.cms-page-index .page-actions.fixed, +.adminhtml-webapi-user-index .page-actions.fixed, +.adminhtml-webapi-role-index .page-actions.fixed, +.adminhtml-system-variable-index .page-actions.fixed, +.adminhtml-user-index .page-actions.fixed, +.adminhtml-user-role-index .page-actions.fixed, +.adminhtml-integration-index .page-actions.fixed, +.adminhtml-system-design-theme-index .page-actions.fixed, +.adminhtml-system-design-index .page-actions.fixed, +.adminhtml-customer-attribute-index .page-actions.fixed, +.adminhtml-customer-address-attribute-index .page-actions.fixed, +.rating-index-index .page-actions.fixed, +.tax-rule-index .page-actions.fixed, +.tax-rate-index .page-actions.fixed, +.adminhtml-rma-item-attribute-index .page-actions.fixed, +.adminhtml-reward-rate-index .page-actions.fixed, +.customer-group-index .page-actions.fixed, +.checkout-agreement-index .page-actions.fixed, +.catalog-product-attribute-index .page-actions.fixed, +.catalog-product-set-index .page-actions.fixed, +.catalog-product-index .page-actions.fixed { + left: 0; + margin: 0; + padding: 0 21px; + position: fixed; +} +.CustomGridAction .page-actions, +.sales-order-index .page-actions, +.adminhtml-rma-index .page-actions, +.adminhtml-catalog-event-index .page-actions, +.adminhtml-urlrewrite-index .page-actions, +.catalog-search-index .page-actions, +.catalog-product-review-index .page-actions, +.catalog-rule-promo-catalog-index .page-actions, +.sales-rule-promo-quote-index .page-actions, +.adminhtml-reminder-index .page-actions, +.newsletter-template-index .page-actions, +.adminhtml-system-email-template-index .page-actions, +.adminhtml-sitemap-index .page-actions, +.adminhtml-googleshopping-types-index .page-actions, +.customer-index-index .page-actions, +.adminhtml-cms-page-index .page-actions, +.cms-block-index .page-actions, +.adminhtml-banner-index .page-actions, +.adminhtml-widget-instance-index .page-actions, +.cms-page-index .page-actions, +.adminhtml-webapi-user-index .page-actions, +.adminhtml-webapi-role-index .page-actions, +.adminhtml-system-variable-index .page-actions, +.adminhtml-user-index .page-actions, +.adminhtml-user-role-index .page-actions, +.adminhtml-integration-index .page-actions, +.adminhtml-system-design-theme-index .page-actions, +.adminhtml-system-design-index .page-actions, +.adminhtml-customer-attribute-index .page-actions, +.adminhtml-customer-address-attribute-index .page-actions, +.rating-index-index .page-actions, +.tax-rule-index .page-actions, +.tax-rate-index .page-actions, +.adminhtml-rma-item-attribute-index .page-actions, +.adminhtml-reward-rate-index .page-actions, +.customer-group-index .page-actions, +.checkout-agreement-index .page-actions, +.catalog-product-attribute-index .page-actions, +.catalog-product-set-index .page-actions, +.catalog-product-index .page-actions { + position: absolute; + z-index: 2; + margin-top: 10px; + margin-left: 15px; + padding: 0; +} +.adminhtml-googleshopping-items-index .grid-title, +.adminhtml-system-backup-index .page-actions, +.adminhtml-scheduled-operation-index .page-actions, +.adminhtml-system-currency-index .page-actions, +.adminhtml-system-currencysymbol-index .page-actions, +.adminhtml-cache-index .page-actions, +.adminhtml-system-store-index .page-actions, +.sales-order-status-index .page-actions { + border: 1px solid #c0bbaf; + border-bottom: 0; + background: #f6f3ec; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y2ZjNlYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlZGVhZTEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f6f3ec), color-stop(100%, #edeae1)); + background: -webkit-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: -o-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: -ms-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: linear-gradient(to bottom, #f6f3ec 0%, #edeae1 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f3ec', endColorstr='#edeae1', GradientType=0); + padding: 7px 8px 8px; + position: relative; + float: none; +} +.adminhtml-googleshopping-items-index .grid { + padding-bottom: 25px; +} +.adminhtml-googleshopping-items-index .grid-title .title { + font-size: 18px; +} +.adminhtml-googleshopping-items-index .page-actions { + float: right; +} +.adminhtml-system-backup-index .page-actions.fixed, +.adminhtml-scheduled-operation-index .page-actions.fixed, +.adminhtml-system-currency-index .page-actions.fixed, +.adminhtml-system-currencysymbol-index .page-actions.fixed, +.adminhtml-cache-index .page-actions.fixed, +.adminhtml-system-store-index .page-actions.fixed, +.sales-order-status-index .page-actions.fixed { + background-image: none; + padding: 0 21px; + position: fixed; +} +.catalog-product-index .grid-actions { + padding-left: 90px; +} +.catalog-rule-promo-catalog-index .grid-actions { + padding-left: 210px; +} +.catalog-rule-promo-catalog-index .page-actions .apply { + float: right; + margin: 0 0 0 10px; +} +.catalog-product-index .field-store-switcher { + padding: 0; +} +.sidebar-actions { + padding: 14px 0; +} +.sidebar-actions button { + margin: 0 0 5px; +} +.sales-order-create-index .grid table .action-configure { + float: right; +} +.adminhtml-system-currency-index .import-service { + float: left; +} +.adminhtml-system-currency-index .page-actions.fixed .import-service { + display: inline-block; + float: none; +} +.fpt-item-container select { + width: 100%; +} +.fpt-item-container select:first-child { + margin-bottom: 8px; +} +.clearfix:before, +.clearfix:after, +[class$="-layout"]:after, +.footer-content:before, +.footer-content:after, +.page-title-inner:before, +.page-title-inner:after, +.tabs-horiz:before, +.tabs-horiz:after, +.navigation > ul:before, +.navigation > ul:after, +.actions-split:before, +.actions-split:after, +.page-create-order:before, +.page-create-order:after, +.order-addresses:before, +.order-addresses:after, +.order-methods:before, +.order-methods:after, +.order-summary:before, +.order-summary:after, +.order-methods:before, +.order-methods:after, +.grid-actions:before, +.grid-actions:after, +.fieldset-wrapper-title:before, +.fieldset-wrapper-title:after { + content: ""; + display: table; +} +.clearfix:after, +[class$="-layout"]:after, +.footer-content:after, +.page-title-inner:after, +.tabs-horiz:after, +.navigation > ul:after, +.actions-split:after, +.page-create-order:after, +.order-addresses:after, +.order-methods:after, +.order-summary:after, +.order-methods:after, +.grid-actions:after, +.fieldset-wrapper-title:after { + clear: both; +} diff --git a/app/design/adminhtml/magento_backend/css/header.css b/app/design/adminhtml/magento_backend/css/header.css new file mode 100644 index 0000000000000000000000000000000000000000..7ea154188d004d2ee803c5958ce263aa34492802 --- /dev/null +++ b/app/design/adminhtml/magento_backend/css/header.css @@ -0,0 +1,710 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +/* + Header +-------------------------------------- */ +.header { + position: relative; + background: #f5f2ea; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZjJlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmMWVkZTMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f2ea), color-stop(100%, #f1ede3)); + background: -webkit-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%); + background: -o-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%); + background: -ms-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%); + background: linear-gradient(to bottom, #f5f2ea 0%, #f1ede3 100%); + z-index: 992; + padding: 0 20px; +} +.header-inner { + min-width: 960px; + max-width: 1300px; + margin: 0 auto; + padding: 7px 0; +} +.header .logo { + display: block; + width: 109px; + height: 27px; + text-indent: -999em; + background: url(Magento_Backend::images/logo-magento-small.png) no-repeat; + margin: 0; +} +.header-panel { + float: right; + font-size: 12px; +} +/* + Header Dropdown +-------------------------------------- */ +.header-panel .dropdown-menu { + display: none; + width: 195px; + margin: 8px -87px 0 0; + border: 0; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + -moz-box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2); +} +.header-panel .dropdown-menu > li { + position: relative; + padding: 20px 30px 13px 18px; + background: #f7f3eb; + border-bottom: 1px solid #f7e4d0; + white-space: normal; +} +.header-panel .dropdown-menu > li:hover { + background: #fff; +} +.header-panel .dropdown-menu > li:first-child:hover:before, +.header-panel .dropdown-menu > li.first:hover:before { + color: #fff; +} +.header-panel .dropdown-menu > li a { + display: block; + text-decoration: none; + color: #8c867e; + margin: 0 0 10px; +} +.header-panel .dropdown-menu > li a:hover { + text-decoration: underline; +} +.header-panel .dropdown-menu > li:first-child, +.header-panel .dropdown-menu > li.first { + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.header-panel .dropdown-menu > li:last-child, +.header-panel .dropdown-menu > li.last { + border-bottom: 0; + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +/* + Account +-------------------------------------- */ +.header-panel .account { + position: relative; + float: left; + margin: 0 0 0 30px; + padding: 6px 0 0; +} +.header-panel .account > a { + color: #656057; + position: relative; + display: inline-block; + min-width: 20px; + text-decoration: none; + padding: 0 10px 0 0; +} +.header-panel .account > a:before { + position: absolute; + top: 2px; + right: 0; + bottom: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + font-size: 9px; + -webkit-font-smoothing: antialiased; + content: '\e02c'; + /* icon point down */ + +} +.header-panel .account img { + position: relative; + border-radius: 3px; + z-index: 1; +} +.no-js .header-panel .account:hover > a { + padding-bottom: 5px; + margin-bottom: -5px; +} +.header-panel .account.active .dropdown-menu, +.no-js .header-panel .account:hover .dropdown-menu, +.no-js .header-panel .account > a:focus + .dropdown-menu { + display: block; +} +/* + Link to store front +-------------------------------------- */ +.header-panel .store-front { + color: #676056; + text-decoration: none; + position: relative; + padding: 6px 0 0 20px; + float: left; + margin: 0 0 0 30px; +} +.header-panel .store-front:before { + font-family: 'admin-icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e005'; + /* icon store info */ + + font-size: 17px; + position: absolute; + left: 0; + top: 4px; +} +/* + Messages +-------------------------------------- */ +.header-panel .notifications { + position: relative; + float: left; + margin: 0 6px 0 21px; + padding: 9px 0 0; +} +.header-panel .notifications-icon { + position: relative; + display: inline-block; + height: 12px; + width: 17px; + text-decoration: none; + text-align: center; + background: #cac2b5; + box-shadow: 0 1px 0 #fff; + border-radius: 2px; +} +.header-panel .notifications-icon:hover, +.header-panel .notifications-icon:active { + background: #b0a798; +} +.header-panel .notifications-icon:before { + position: absolute; + left: 0; + right: 0; + bottom: -7px; + margin-top: -5px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02c'; + /* user icon */ + + font-size: 8px; + color: #cac2b5; + text-shadow: 0 1px 0 #fff; +} +.header-panel .notifications-icon:hover:before, +.header-panel .notifications-icon:active:before { + color: #b0a798; +} +.header-panel .notifications .value { + color: #ffffff; + font-size: 12px; + font-weight: 600; + line-height: 11px; + padding: 1px 3px; + min-width: 10px; + background: #f58220; + border: 1px solid #bd5100; + border-radius: 4px; + box-shadow: 0 1px 0 #31302b; + left: 6px; + top: -5px; + position: absolute; +} +.header-panel .notifications.active .dropdown-menu { + display: block; + margin-top: 12px; + border: 2px solid #676056; + width: 288px; + margin: 8px -52px 0 0; +} +.header-panel .dropdown-menu > li { + background: #fff; + border-bottom: 0; + position: relative; + padding: 13px 26px 14px 16px; + white-space: normal; +} +.header-panel .dropdown-menu > li:after { + border-bottom: 1px solid #f7e4d0; + display: block; + position: absolute; + bottom: 0; + left: 2px; + content: ''; + width: 284px; +} +.header-panel .dropdown-menu > li:last-child:after, +.header-panel .dropdown-menu > li.last:after { + display: none; +} +.header-panel .notifications > .dropdown-menu .notification-description { + max-height: 43px; + overflow: hidden; + display: block; + color: #676056; + font-size: 11px; + font-weight: 400; +} +.header-panel .notifications > .dropdown-menu .notification-entry { + display: none; +} +.header-panel .notifications .dropdown-menu:before, +.header-panel .notifications .dropdown-menu:after { + position: absolute; + width: 10px; + height: 10px; + right: 55px; + top: -10px; + font-family: 'MUI-Icons'; + font-style: normal; + font-weight: normal; + font-size: 13px; + speak: none; + -webkit-font-smoothing: antialiased; + content: '\e029'; + /* user icon */ + + color: #fff; + z-index: 2; +} +.header-panel .notifications .dropdown-menu:after { + color: #676056; + font-size: 17px; + height: 12px; + right: 57px; + top: -14px; + z-index: 1; +} +.header-panel .notifications > .dropdown-menu .notification-entry:first-child { + display: block; +} +.header-panel .notifications > .dropdown-menu .notification-entry:first-child + .notification-entry { + display: block; +} +.header-panel .notifications > .dropdown-menu .notification-entry:first-child + .notification-entry + .notification-entry { + display: block; +} +.header-panel .notifications > .dropdown-menu .notification-entry:first-child + .notification-entry + .notification-entry + .notification-entry { + display: block; +} +.header-panel .notifications > .dropdown-menu .notification-entry:first-child + .notification-entry + .notification-entry + .notification-entry + .notification-entry { + display: block; +} +.header-panel .notifications > .dropdown-menu .notification-entry:nth-child(-n+5) { + display: block; +} +.header-panel .notifications > .dropdown-menu .notification-entry .notification-dialog-content { + display: none; +} +/* + Notification entry dialog +-------------------------------------- */ +.notification-entry-dialog .notification-dialog-content, +.notification-entry-dialog .ui-dialog-buttonpane { + background: #fefaf6; +} +.notification-entry-dialog .ui-dialog-titlebar { + background: #f9f1e8; +} +.notification-entry-dialog .ui-dialog-title { + font-size: 22px; + padding-left: 24px; +} +.notification-entry-dialog-critical .ui-dialog-titlebar { + background: #fee4d0; +} +.notification-entry-dialog-critical .ui-dialog-title { + padding-left: 54px; +} +.notification-entry-dialog-critical .ui-dialog-title:before { + content: "\e086"; + font-family: 'MUI-Icons'; + color: #c00815; + font-style: normal; + font-weight: normal; + font-size: 26px; + speak: none; + -webkit-font-smoothing: antialiased; + left: 21px; + position: absolute; + top: 16px; +} +.notification-entry-dialog .ui-dialog-titlebar-close:before { + font-size: 15px; +} +.notification-entry-dialog .notification-dialog-content { + padding-top: 19px; + padding-bottom: 16px; +} +.notification-entry-dialog .notification-dialog-content strong { + display: block; + color: #f58220; + font-size: 18px; + font-weight: 500; +} +.notification-entry-dialog .notification-dialog-content .notification-description { + display: block; + font-family: Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42; + padding: 3px 0 7px; +} +.notification-entry-dialog .notification-dialog-content time { + color: #8c867e; + font-size: 13px; + font-family: Helvetica, Arial, sans-serif; + position: absolute; + right: 17px; + bottom: 27px; + text-align: right; +} +.notification-entry-dialog .notification-dialog-content .actions { + margin-bottom: 22px; +} +.notification-entry-dialog .notification-dialog-content .actions a { + color: #676056; + position: relative; + margin-right: 20px; +} +.notification-entry-dialog .notification-dialog-content .actions a:after { + content: "\e084"; + font-family: 'MUI-Icons'; + color: #6a5f54; + font-size: 12px; + speak: none; + -webkit-font-smoothing: antialiased; + position: absolute; + right: -17px; + top: -2px; +} +.notification-entry-dialog .ui-dialog-buttonset { + text-align: left; +} +.notification-entry-dialog .ui-dialog-buttonpane { + margin: 0; + padding: 0 24px 22px; +} +.notification-entry-dialog .ui-dialog-buttonset button[class^="action-"] { + background-image: none; + margin: 0 16px 0 0; + vertical-align: middle; + text-shadow: none; + box-shadow: none; + border: 0; +} +.notification-entry-dialog .ui-dialog-buttonset .action-acknowledge { + background-color: #f47b20; + border: 0; + padding: 5px 15px; +} +.notification-entry-dialog .ui-dialog-buttonset .action-acknowledge:hover { + background-color: #e47821; +} +.notification-entry-dialog .ui-dialog-buttonset .action-cancel { + background-color: #dbd6ce; + border: 0; + padding: 5px 15px; +} +.notification-entry-dialog .ui-dialog-buttonset .action-cancel:hover { + background-color: #d3cdc4; +} +.header-panel .account > .dropdown-menu a, +.header-panel .search .autocomplete-results .title { + display: block; + color: #f58220; + font-size: 14px; + font-weight: 500; + margin-bottom: 5px; +} +.header-panel .notifications > .dropdown-menu li > strong { + display: block; + color: #026294; + font-size: 12px; + font-weight: 600; + max-height: 32px; + overflow: hidden; + line-height: 1.4; + margin-bottom: 4px; +} +.header-panel .notifications > .dropdown-menu li > strong:focus, +.header-panel .notifications > .dropdown-menu li > strong:hover { + text-decoration: underline; +} +.header-panel .notifications > .dropdown-menu li.notification-critical strong { + padding-left: 30px; + position: relative; +} +.header-panel .notifications > .dropdown-menu li.notification-critical > strong:before { + display: block; + content: "\e086"; + font-family: 'MUI-Icons'; + color: #c00815; + font-size: 19px; + speak: none; + -webkit-font-smoothing: antialiased; + position: absolute; + left: 0; + top: 5px; +} +.header-panel .notifications > .dropdown-menu > li:hover { + background: #f7f3eb; + cursor: pointer; + margin-top: -1px; + padding-top: 14px; + z-index: 2; +} +.header-panel .notifications > .dropdown-menu > li:first-child:hover, +.header-panel .notifications > .dropdown-menu > li.first:hover, +.header-panel .notifications > .dropdown-menu > li:last-child:hover, +.header-panel .notifications > .dropdown-menu > li.last:hover { + margin-top: 0; + padding-top: 13px; +} +.header-panel .dropdown-menu > li:hover:after { + display: none; +} +.header-panel .notifications > .dropdown-menu > li:hover .action-close { + display: block; +} +.header-panel .notifications > .dropdown-menu > .new, +.header-panel .notifications > .dropdown-menu > .new:hover { + background: #f47b20; + color: #fff; +} +.header-panel .notifications > .dropdown-menu > li.new:first-child:before, +.header-panel .notifications > .dropdown-menu > li.new.first:before, +.header-panel .notifications > .dropdown-menu > li.new:first-child:hover:before, +.header-panel .notifications > .dropdown-menu > li.new.first:hover:before { + color: #f47b20; +} +.header-panel .notifications > .dropdown-menu > .new strong, +.header-panel .notifications > .dropdown-menu > .new div, +.header-panel .notifications > .dropdown-menu > .new a, +.header-panel .notifications > .dropdown-menu > .new time, +.header-panel .notifications > .dropdown-menu .new .action-close:hover, +.header-panel .notifications > .dropdown-menu .new .action-close:focus { + color: #fff; +} +.header-panel .notifications > .dropdown-menu time { + color: #676056; + font-size: 11px; + font-weight: 400; + display: block; + margin-top: 7px; +} +.header-panel .notifications > .dropdown-menu a:focus ~ .action-close, +.header-panel .notifications > .dropdown-menu .action-close:focus { + display: block; +} +.header-panel .notifications > .dropdown-menu .action-close { + position: absolute; + display: none; + top: 8px; + right: 4px; + width: 20px; + height: 20px; + text-indent: -999em; + overflow: hidden; + color: #cac2b5; +} +.header-panel .notifications > .dropdown-menu .action-close:hover { + color: #b0a789; +} +.header-panel .notifications > .dropdown-menu .action-close:before { + display: block; + font-family: 'MUI-Icons'; + font-style: normal; + font-weight: normal; + font-size: 19px; + speak: none; + -webkit-font-smoothing: antialiased; + content: '\e07f'; + /* trashbin icon */ + + text-indent: 0; +} +.header .header-panel .notifications .dropdown-menu > li.last { + padding: 0; +} +.header .header-panel .notifications .action-more { + display: block; + background: #676056; + border: 0; + color: #f7f3eb; + font-size: 13px; + font-weight: bold; + height: 23px; + width: 100%; + line-height: 23px; + text-shadow: none; + text-align: center; + margin: 0; +} +.header .header-panel .notifications .action-more:hover { + text-decoration: none; +} +/* + Help +-------------------------------------- */ +.header-panel .help { + float: left; + margin: 0 0 0 30px; + padding: 6px 0 0; +} +/* + Search +-------------------------------------- */ +.search { + position: relative; + float: left; + margin: -4px 0 -5px 50px; +} +.search form { + position: relative; +} +.search input { + position: relative; + display: none; + width: 50px; + height: 36px; + line-height: 2; + margin: 0; + padding: 4px 25px 4px 4px; + background: #fff; +} +.header .search .ajax-loading:before { + display: block; + content: ''; + position: absolute; + top: 10px; + left: -20px; + margin: 0; + width: 16px; + height: 16px; + line-height: 16px; + background-image: url(../mui/images/ajax-loader-small.gif); +} +.header .search .mage-suggest { + border: none; +} +.header .search .mage-suggest::after { + content: ''; +} +.search .dropdown-menu { + display: block; + right: auto; + margin-right: 0; + width: 100%; +} +.autocomplete-results { + left: 0 !important; + right: 0; +} +.autocomplete-results .title { + display: block; +} +.autocomplete-results .type { + margin: 0 0 10px; +} +.header.active .search { + margin-left: 30px; +} +.header.active .search input { + display: inline-block; +} +.no-js .search input { + display: inline-block; + width: 350px; +} +.search button[type="submit"], +.search button[type="submit"]:hover, +.search button[type="submit"]:active, +.search button[type="submit"]:focus { + position: absolute; + top: 2px; + right: 0; + width: 32px; + height: 32px; + background: none; + border: none; + overflow: hidden; + text-indent: -999em; + color: #676056; + text-shadow: 0 1px 0 #fff; + box-shadow: none; + filter: none; +} +.search button[type="submit"]:hover, +.header.active .search button[type="submit"], +.header.active .search button[type="submit"]:hover, +.header.active .search button[type="submit"]:active, +.header.active .search button[type="submit"]:focus { + color: #201f1c; +} +.eq-ie9 .search button[type="submit"] { + top: 4px; +} +.search button[type="submit"]:before { + position: absolute; + display: block; + top: 0; + right: 0; + bottom: 0; + left: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e01f'; + /* user icon */ + + text-indent: 0; + font-size: 18px; + line-height: 1.7; + text-align: center; +} +/* + Clearfix +-------------------------------------- */ +.header-panel:before, +.header-panel:after, +.header-inner:before, +.header-inner:after, +.clearfix:before, +.clearfix:after { + content: ""; + display: table; +} +.header-panel:after, +.header-inner:after, +.clearfix:after { + clear: both; +} diff --git a/app/design/adminhtml/magento_backend/css/pages.css b/app/design/adminhtml/magento_backend/css/pages.css new file mode 100644 index 0000000000000000000000000000000000000000..ba9d1a2a10c5e6af0ece6aaefbd766dd0afd956f --- /dev/null +++ b/app/design/adminhtml/magento_backend/css/pages.css @@ -0,0 +1,3053 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +/* + Product Creation +-------------------------------------- */ +/* Action "Back" as cross */ +[class^=" catalog-product-"] .page-actions .action-back, +[class^=" catalog-product-"] .page-actions .action-back:hover, +[class^=" catalog-product-"] .page-actions .action-back:active, +[class^=" newsletter-"] .page-actions .action-back, +[class^=" newsletter-"] .page-actions .action-back:hover, +[class^=" newsletter-"] .page-actions .action-back:active { + overflow: hidden; + padding: 5px 6px 3px; + margin-left: 12px; + color: #7a7976; +} +.sales-order-create-index .page-actions-inner .cancel, +.sales-order-create-index .page-actions-inner .cancel:hover, +.sales-order-create-index .page-actions-inner .cancel:active { + filter: none; + border: 0; +} +[class^=" catalog-product-"] .page-actions .action-back:hover, +[class^=" newsletter-"] .page-actions .action-back:hover, +.sales-order-create-index .page-actions-inner .cancel:hover { + color: #000; +} +[class^=" catalog-product-"] .page-actions .action-back.mage-error, +[class^=" newsletter-"] .page-actions .action-back.mage-error { + color: #b57c72; +} +[class^=" catalog-product-"] .page-actions .action-back:before, +[class^=" newsletter-"] .page-actions .action-back:before, +.sales-order-create-index .page-actions-inner .cancel:before { + display: inline-block; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e07d'; + /* close icon */ + + font-size: 16px; +} +[class^=" catalog-product-"] .page-actions .action-back span, +[class^=" newsletter-"] .page-actions .action-back span, +.sales-order-create-index .page-actions-inner .cancel span { + display: inline-block; + overflow: hidden; + text-indent: -999em; +} +.page-actions .switcher { + display: inline-block; + vertical-align: top; + margin: 6px 17px 6px 6px; +} +.field-weight .control .field:first-child { + width: 36%; + margin-right: 15px; +} +#allow_open_amount { + margin-top: 8px; +} +.catalog-product-new .user-defined.type-select select, +.catalog-product-edit .user-defined.type-select select { + width: 100%; +} +#tab_content_downloadableInfo .data-table td { + vertical-align: top; +} +#tab_content_downloadableInfo .data-table td .row { + margin-bottom: 10px; +} +/* + Customer +---------------------------------------*/ +.customer-index-edit .grid tr.headings th > span { + white-space: normal; +} +#customer_info_tabs_account_content #_accountsendemail { + margin-top: 8px; +} +.customer-information:before, +.customer-information:after { + content: ""; + display: table; +} +.customer-information:after { + clear: both; +} +.customer-information .data-table, +.customer-information address { + width: 48.5%; +} +.customer-information .data-table { + float: left; + width: 48.5%; +} +.customer-information address { + padding-top: 4px; + line-height: 2.2; + float: right; +} +.address-list { + list-style: none; + width: 278px; + margin: 0 0 10px; + padding: 0; + float: left; +} +.address-list li { + border: 1px solid #d9d2ca; + background: #f7f2ec; + padding: 10px 10px 15px; + cursor: pointer; + margin-bottom: -1px; +} +.address-list li.ui-state-active { + background: #fff; + position: relative; + box-shadow: 0 1px 1px 0 #d9d2ca; + margin-left: -2px; + padding-left: 12px; +} +.address-list li.ui-state-active:before, +.address-list li.ui-state-active:after { + position: absolute; + font-family: 'MUI-Icons'; + font-style: normal; + font-weight: normal; + font-size: 18px; + color: #fff; + content: "\e02a"; + speak: none; + line-height: 11px; + width: 10px; + right: -9px; + text-indent: -6px; + top: 50%; + margin-top: -5px; + z-index: 2; +} +.address-list li.ui-state-active:before { + color: #d9d2ca; + right: -11px; + z-index: 1; +} +.address-list li.address-list-actions:before, +.address-list li.address-list-actions:after { + display: none; +} +.address-list li.address-list-actions { + padding: 20px 0 0 0; + border: 0; + background: none; + box-shadow: none; + cursor: default; +} +.address-list li.address-list-actions:first-child { + padding: 0; +} +.address-list .label { + float: none; + width: auto; + padding: 0 0 0 10px; +} +.address-list input[type="checkbox"] { + float: left; +} +.address-list address:first-line { + /* its not work if First Name and Last Name in two lines */ + + font-weight: bold; +} +.address-list address { + margin: 0 20px 15px 0; + line-height: 1.5; +} +.address-list-item-actions { + float: right; +} +.address-list .action-edit { + display: none; +} +.address-list .field { + margin-bottom: 15px; +} +.ui-tabs-nav .address-list-item a { + text-decoration: none; + color: #676056; +} +.address-item-edit { + margin-left: 277px; +} +.address-item-edit-content { + border: 1px solid #dad1c8; + background: #fff; + box-shadow: 0 2px 1px 0 rgba(217, 210, 202, 0.5); + padding-left: 10px; +} +.address-item-edit-content .fieldset:last-child { + margin-bottom: 29px; +} +.address-item-edit .legend { + border-bottom: 0; + margin: 0 0 18px; + padding-left: 20%; +} +.address-item-edit .legend span { + padding-left: 0; +} +.address-item-edit-actions { + padding: 0 0 18px 20%; +} +/* + Configuration -> Design +-------------------------------------- */ +#row_design_theme_ua_regexp .design_theme_ua_regexp { + float: left; + width: 100%; +} +#row_design_theme_ua_regexp .tooltip { + margin-top: 8px; +} +#row_design_theme_ua_regexp .note { + clear: both; +} +/* + Configuration -> Payment Methods +-------------------------------------- */ +.adminhtml-system-config-edit .payflow-settings-notice .important-label { + color: #e22626; + font-size: 14px; + font-weight: 700; +} +.adminhtml-system-config-edit .payflow-settings-notice ul.options-list strong { + color: #676056; + font-size: 14px; + font-weight: 700; +} +/* + CMS -> Banners +-------------------------------------- */ +/* Banner Properties */ +#banner_properties_customer_segment_ids { + min-width: 20%; +} +/* Content */ +.field-store_default_content .buttons-set { + margin-bottom: 9px; +} +.field-store_default_content .buttons-set button { + margin-right: 4px; +} +.field-store_0_content_use input[type="checkbox"] { + margin-right: 3px; + position: relative; + top: 2px; +} +/* + CMS -> Manage Hierarchy +-------------------------------------- */ +.cms-hierarchy .cms-scope { + float: right; + margin-right: 25px; + position: relative; + top: 2px; +} +.cms-hierarchy #tree-container { + margin-top: 25px; + overflow: auto; + padding-bottom: 10px; +} +.cms-hierarchy .buttons-set { + margin-bottom: 10px; +} +.cms-hierarchy .cms-hierarchy-tree { + width: 48.93617020799999%; + float: left; + margin: 10px 0 8px 0; +} +.cms-hierarchy .cms-hierarchy-node { + width: 48.93617020799999%; + float: left; + margin: 10px 0 8px 2.127659574%; +} +.cms-hierarchy #cms_page_grid_container { + clear: both; +} +.cms-hierarchy .store-switcher { + position: relative; + top: 10px; +} +.cms-hierarchy .store-switcher label { + margin-right: 8px; +} +.cms-hierarchy-node #node_properties_fieldset #node_preview { + position: relative; + top: 6px; +} +.cms-hierarchy-node .form-inline .label { + width: 30%; +} +/* + CMS -> Widgets +-------------------------------------- */ +#widget_instace_tabs_properties_section_content .widget-option-label { + margin-top: 6px; +} +/* + CMS -> Static Blocks +-------------------------------------- */ +#buttonsblock_content.buttons-set { + margin-bottom: 9px; +} +#buttonsblock_content.buttons-set button { + margin-right: 4px; +} +/* + CMS -> Manage Content +-------------------------------------- */ +/* Content */ +.cms-manage-content-actions .buttons-set { + margin-bottom: 9px; +} +.cms-manage-content-actions .buttons-set button { + margin-right: 4px; +} +.cms-manage-content-actions textarea { + width: 100%; +} +/* + System -> Action Log -> Report +-------------------------------------- */ +.adminhtml-logging-details .log-details-grid table th { + border: 1px solid #c9c2b8; + border-width: 0 0 1px; + padding: 6px 10px 7px; + background: #fff; + color: #676056; + font-size: 13px; + font-weight: 600; +} +.adminhtml-logging-details .log-details-grid table th span { + border: 0; + padding: 0; +} +.adminhtml-logging-details .log-details-grid table td { + border: none; + padding: 6px 10px 7px; + background: #fff; +} +.adminhtml-logging-details .log-details-grid table tr:last-child td { + border: 1px solid #eae8e4; + border-width: 0 0 1px; +} +.adminhtml-logging-details .log-details-grid table tr.on-mouse { + cursor: inherit; +} +.adminhtml-logging-details .log-details-grid table tr:nth-child(odd) td, +.adminhtml-logging-details .log-details-grid table tr.on-mouse:nth-child(odd):hover td { + background: #fbfaf6; +} +/* + System -> Export +-------------------------------------- */ +#export_filter_grid .grid td .input-text-range-date { + vertical-align: middle; +} +#export_filter_grid .grid td .ui-datepicker-trigger { + vertical-align: middle; + margin-left: 5px; +} +#export_filter_grid .grid select { + margin-bottom: 0; + width: 86%; +} +#export_filter_grid .grid table td:first-child, +#export_filter_grid .grid tr th:first-child { + border-left: 0; +} +#export_filter_grid .data thead { + border-left: 1px solid #837F79; +} +#export_filter_grid .data tbody { + border-left: 1px solid #c0bbaf; +} +/* + System -> Roles +-------------------------------------- */ +#gws_container ul { + padding: 0; + margin: 0; + list-style: none; +} +#gws_container ul ul { + margin: .8em 0 .8em 1.4em; +} +#gws_container input[type="checkbox"] { + margin-right: 3px; + position: relative; + top: -1px; +} +/* + Reports +-------------------------------------- */ +.reports-title .page-actions { + float: right; +} +.reports-title .store-switcher { + padding: 14px 0 18px; +} +.reports-content select { + width: 160px; +} +.reports-content input.hasDatepicker { + width: 133px; +} +/* TODO: refactor when validation design is ready */ +.reports-content .required .control { + position: relative; +} +.reports-content input.hasDatepicker + label.mage-error { + left: 0; + position: absolute; + top: 30px; +} +.reports-title:before, +.reports-title:after { + content: ""; + display: table; +} +.reports-title:after { + clear: both; +} +/* + Reports - Customer Reviews +-------------------------------------- */ +.reports-report-review-customer .col-qty, +.reports-report-review-customer .col-actions { + width: 85px; +} +/* + Reports - Product Reviews +-------------------------------------- */ +.reports-report-review-product .col-id { + width: 35px; +} +.reports-report-review-product .col-qty, +.reports-report-review-product .col-rating, +.reports-report-review-product .col-avg-rating, +.reports-report-review-product .col-actions { + text-align: right; + width: 85px; +} +.reports-report-review-product .col-date { + width: 140px; +} +.reports-report-review-product .col-rating { + width: 104px; +} +/* + Reports - New Accounts +-------------------------------------- */ +.reports-report-customer-accounts .col-period { + white-space: nowrap; + width: 70px; +} +/* + Reports - Refresh Statistics +-------------------------------------- */ +.reports-report-statistics-index .col-period { + white-space: nowrap; + width: 140px; +} +.reports-report-statistics-index .col-select { + width: 25px; +} +/* + Reports - Products Ordered +-------------------------------------- */ +.reports-report-product-sold .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-product-sold .col-qty { + width: 110px; +} +/* + Reports - Customers by Orders Total +-------------------------------------- */ +.reports-report-customer-totals .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-customer-totals .col-qty { + width: 65px; +} +.reports-report-customer-totals .col-rating { + width: 100px; +} +/* + Reports - Tag by popular +-------------------------------------- */ +.reports-report-tag-popular .col-qty, +.reports-report-tag-popular .col-actions { + width: 80px; +} +/* + Reports - Tag by customer +-------------------------------------- */ +.reports-report-tag-customer .col-id { + width: 35px; +} +.reports-report-tag-customer .col-qty, +.reports-report-tag-customer .col-actions { + width: 80px; +} +/* + Reports - Tag by product +-------------------------------------- */ +.reports-report-tag-product .col-id { + width: 35px; +} +.reports-report-tag-product .col-actions { + width: 70px; +} +.reports-report-tag-product .col-unique-numbers, +.reports-report-tag-product .col-total-numbers { + text-align: right; + width: 95px; +} +/* + Reports - Customers by Number of Orders +-------------------------------------- */ +.reports-report-customer-orders .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-customer-orders .col-qty, +.reports-report-customer-orders .col-average, +.reports-report-customer-orders .col-total { + width: 105px; +} +/* + Reports - Customers by Orders Total +-------------------------------------- */ +.reports-report-customer-totals .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-customer-totals .col-qty, +.reports-report-customer-totals .col-average, +.reports-report-customer-totals .col-total { + width: 105px; +} +/* + Reports - Customer's wishlists +-------------------------------------- */ +.adminhtml-report-customer-wishlist-wishlist .col-period { + width: 70px; +} +.adminhtml-report-customer-wishlist-wishlist .col-whishlist-qty, +.adminhtml-report-customer-wishlist-wishlist .col-available-qty, +.adminhtml-report-customer-wishlist-wishlist .col-qty-diff { + text-align: right; + width: 100px; +} +.adminhtml-report-customer-wishlist-wishlist .grid .range { + text-align: left; +} +/* + Reports - Most Viewed +-------------------------------------- */ +.reports-report-product-viewed .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-product-viewed .col-qty, +.reports-report-product-viewed .col-price { + white-space: nowrap; + width: 80px; +} +/* + Reports - Search Terms +-------------------------------------- */ +.reports-index-search .col-id { + width: 35px; +} +.reports-index-search th.col-results, +.reports-index-search th.col-hits { + text-align: left; + width: 117px; +} +.reports-index-search td.col-results, +.reports-index-search td.col-hits { + text-align: right; + width: 117px; +} +.reports-index-search .col-results .range-line:first-child, +.reports-index-search .col-hits .range-line:first-child { + float: left; + margin-right: 3px; +} +/* + Reports - Bestsellers +-------------------------------------- */ +.reports-report-sales-bestsellers .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-sales-bestsellers .col-qty, +.reports-report-sales-bestsellers .col-price { + width: 80px; +} +/* + Reports - Downloads +-------------------------------------- */ +.reports-report-product-downloads .col-qty, +.reports-report-product-downloads .col-price { + width: 80px; +} +/* + Reports - Abandoned Carts +-------------------------------------- */ +.reports-report-shopcart-abandoned .col-ip, +.reports-report-shopcart-abandoned .col-subtotal, +.reports-report-shopcart-abandoned .col-number, +.reports-report-shopcart-abandoned .col-coupon { + text-align: right; +} +.reports-report-shopcart-abandoned .col-ip { + width: 105px; +} +.reports-report-shopcart-abandoned .col-subtotal { + width: 65px; +} +/* + Reports - Products in Carts +-------------------------------------- */ +.reports-report-shopcart-product .col-id { + width: 35px; +} +.reports-report-shopcart-product .col-carts, +.reports-report-shopcart-product .col-qty, +.reports-report-shopcart-product .col-price { + text-align: right; + width: 80px; +} +/* + Reports - Refunds +-------------------------------------- */ +.reports-report-sales-refunded .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-sales-refunded .col-ref-total, +.reports-report-sales-refunded .col-ref-online, +.reports-report-sales-refunded .col-ref-offline { + text-align: right; + width: 23%; +} +/* + Reports - Shipping +-------------------------------------- */ +.reports-report-sales-shipping .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-sales-shipping .col-qty, +.reports-report-sales-shipping .col-total-sales-shipping, +.reports-report-sales-shipping .col-total-shipping { + text-align: right; + width: 115px; +} +/* + Reports - Invoiced +-------------------------------------- */ +.reports-report-sales-invoiced .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-sales-invoiced .col-qty, +.reports-report-sales-invoiced .col-invoiced, +.reports-report-sales-invoiced .col-total-invoiced, +.reports-report-sales-invoiced .col-total-invoiced-paid, +.reports-report-sales-invoiced .col-total-invoiced-not-paid { + text-align: right; + width: 19%; +} +/* + Reports - Tax +-------------------------------------- */ +.reports-report-sales-tax .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-sales-tax .col-rate, +.reports-report-sales-tax .col-qty, +.reports-report-sales-tax .col-tax-amount { + text-align: right; + width: 105px; +} +/* + Reports - Orders +-------------------------------------- */ +.reports-report-sales-sales .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-sales-sales .col-orders, +.reports-report-sales-sales .col-sales-items, +.reports-report-sales-sales .col-sales-total, +.reports-report-sales-sales .col-invoiced, +.reports-report-sales-sales .col-refunded, +.reports-report-sales-sales .col-sales-tax, +.reports-report-sales-sales .col-sales-shipping, +.reports-report-sales-sales .col-sales-discount, +.reports-report-sales-sales .col-canceled { + text-align: right; + width: 10.5%; +} +/* + Reports - Coupons +-------------------------------------- */ +/* TODO: re-check styles for coupons table after coupons functionality will have been repaired */ +.reports-report-sales-coupons .col-period { + white-space: nowrap; + width: 70px; +} +.reports-report-sales-coupons .col-sales, +.reports-report-sales-coupons .col-users, +.reports-report-sales-coupons .col-sales-discount, +.reports-report-sales-coupons .col-total-amount, +.reports-report-sales-coupons .col-subtotal, +.reports-report-sales-coupons .col-discount, +.reports-report-sales-coupons .col-total { + text-align: right; +} +/* + Reports - Low Stock +-------------------------------------- */ +.reports-report-product-lowstock .col-qty { + width: 10%; +} +.reports-report-product-lowstock .range-line { + display: inline-block; +} +.reports-report-product-lowstock .col-product { + width: 65%; +} +.reports-report-product-lowstock .col-sku { + width: 25%; +} +/* + Reports - PayPal Settlement Reports +-------------------------------------- */ +.adminhtml-paypal-reports-index .grid tr.headings th > span { + white-space: normal; +} +.adminhtml-paypal-reports-index .col-transaction_event_code { + max-width: 150px; +} +.adminhtml-paypal-reports-index .col-amount, +.adminhtml-paypal-reports-index .col-fee-amount { + text-align: right; +} +/* + Newsletter +-------------------------------------- */ +[class^=" newsletter-"] .page-actions .action-back { + float: right; +} +/* + Newsletter Templates +-------------------------------------- */ +.newsletter-template-index .col-id { + width: 35px; +} +.newsletter-template-index .col-actions { + width: 80px; +} +.newsletter-template-index .col-type { + width: 100px; +} +.newsletter-template-index .col-added, +.newsletter-template-index .col-updated { + width: 140px; +} +[class^=' newsletter-'] .buttons-set { + margin: 0 0 15px; +} +[class^=" newsletter-"] .buttons-set button { + margin-right: 4px; +} +/* + Newsletter - Queue +-------------------------------------- */ +.newsletter-queue-index .col-id { + width: 35px; +} +.newsletter-queue-index .col-finish, +.newsletter-queue-index .col-start { + width: 130px; +} +.newsletter-queue-index .col-status, +.newsletter-queue-index .col-processed, +.newsletter-queue-index .col-recipients { + white-space: nowrap; + width: 85px; +} +.newsletter-queue-index td.col-processed, +.newsletter-queue-index td.col-recipients { + text-align: right; +} +.newsletter-queue-index .col-actions { + width: 80px; +} +/* + Newsletter - Subscribers +-------------------------------------- */ +.newsletter-subscriber-index .col-id { + width: 35px; +} +.newsletter-subscriber-index .col-type { + width: 75px; +} +.newsletter-subscriber-index .col-status { + white-space: nowrap; + width: 85px; +} +/* + Newsletter - Problems +-------------------------------------- */ +.newsletter-problem-index .col-select { + width: 25px; +} +.newsletter-problem-index .col-id { + width: 35px; +} +.newsletter-problem-index .col-start { + width: 130px; +} +.newsletter-problem-index .col-error-code { + width: 150px; +} +.table-fieldset-alt, +.type-options { + margin-bottom: 20px; +} +.table-fieldset-alt thead th, +.table-fieldset-alt tbody tr td { + border-width: 0; +} +.table-fieldset-alt tbody tr:nth-child(odd) td, +.table-fieldset-alt tbody tr:nth-child(odd):hover td { + background: #fff; +} +/* + System - Tax +--------------------------------------*/ +.tax-rate-popup .ui-dialog-content.ui-widget-content { + padding: 10px 10px 0; +} +.tax-rate-popup .fieldset { + margin: 0; +} +.tax-rate-popup .field { + margin-bottom: 20px; +} +.tax-rate-popup .field .label { + margin: 5px 0 0 0; + width: 26%; + padding: 0 20px 0 0; + float: left; + text-align: right; + box-sizing: content-box; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + -ms-box-sizing: content-box; +} +.tax-rate-popup .field .control { + width: 58%; + margin: 0; + float: left; +} +.tax-rate-popup .field .control select, +.tax-rate-popup .field .control .input-text { + width: 100%; +} +.tax-rate-popup .field-rate .control .input-text { + width: 50%; +} +.tax-rate-popup .field-rate label.mage-error { + display: block; +} +.tax-rate-popup .tax-rate-titles-note-td { + margin-left: 26%; + padding-left: 20px; +} +.field-tax_rate, +.field-tax_customer_class, +.field-tax_product_class { + position: relative; +} +.mselect-hidden + .mage-error { + position: absolute; + top: 100%; +} +/* + Tags +-------------------------------------- */ +.tag-title { + overflow: hidden; +} +.tag-title .page-actions { + float: right; +} +/* + Attribute Mapping +-------------------------------------- */ +.field-attributes_box .control-value { + width: 100%; +} +.adminhtml-googleshopping-types-new #attribute_set { + padding: 0; +} +.adminhtml-googleshopping-types-new #gcontent_attributes_container { + margin-top: -6px; +} +/* + Dashboard +-------------------------------------- */ +.adminhtml-dashboard-index .col-2-left-layout, +.adminhtml-dashboard-index .col-1-layout { + min-width: 0; +} +.adminhtml-dashboard-index .side-col { + width: 38%; + padding: 1%; +} +.adminhtml-dashboard-index .side-col .entry-edit { + padding: 10px 15px 10px 10px; + margin-bottom: 5px; +} +.adminhtml-dashboard-index .side-col .entry-edit .entry-edit-head { + margin-bottom: 20px; +} +.adminhtml-dashboard-index .side-col .entry-edit .entry-edit-head h4 { + margin: 0; +} +.adminhtml-dashboard-index .side-col .entry-edit fieldset { + padding: 0; + border: 0; +} +.adminhtml-dashboard-index .side-col .entry-edit fieldset .grid { + padding-bottom: 0; +} +.adminhtml-dashboard-index .col-2-left-layout .main-col { + min-width: 0; + width: 60%; + padding: 16px 30px 30px; +} +.adminhtml-dashboard-index .col-2-left-layout .main-col .store-switcher-alt { + margin-bottom: 15px; +} +.adminhtml-dashboard-index .col-2-left-layout .main-col .store-switcher-alt > strong { + padding-left: 0; +} +.dashboard-container { + border-radius: 0; +} +.dashboard-container.col-2-left-layout:before { + left: 40%; +} +.dashboard-inner .tabs-horiz > li a { + padding-left: 14px; + padding-right: 14px; +} +.dashboard-container #diagram_tab_content { + background: #fff; + border: 1px solid #eae6e0; + border-radius: 5px; + border-top-left-radius: 0; + margin: 0 0 20px; + padding: 18px; + position: relative; +} +.dashboard-container .dashboard-diagram .store-switcher + div { + /* loader under a diagram */ + + background: url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%; + min-height: 75px; + text-align: center; +} +.dashboard-container .dashboard-diagram .store-switcher + div img { + max-width: 100%; +} +.dashboard-container .dashboard-diagram .store-switcher + div.dashboard-diagram-nodata { + /* when there is no data to display the diagram */ + + background-image: none; + min-height: 15px; +} +.dashboard-container #grid_tab_content { + background: #ffffff url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%; + border: 1px solid #eae6e0; + border-radius: 5px; + border-top-left-radius: 0; + min-height: 50px; +} +.dashboard-container #grid_tab_content .grid { + padding: 0; +} +.dashboard-container .store-switcher { + margin: 20px 0 10px; +} +.dashboard-container .dashboard-diagram .store-switcher { + margin-top: 0; +} +.dashboard-diagram-nodata { + border: 1px solid #ccc; + padding: 20px 0; + text-align: center; +} +.action-switch-to-analytics:link, +.action-switch-to-analytics:visited, +.action-switch-to-hub:link, +.action-switch-to-hub:visited { + font-weight: 400; + font-size: 16px; + color: #19a3d1; + position: relative; + padding: 0 0 0 20px; + margin: 11px 0 0 20px; + background: none; + box-shadow: none; +} +.action-switch-to-hub:before, +.action-switch-to-analytics:before { + position: absolute; + width: 17px; + height: 12px; + background: url(../images/icons-dashboard-switcher.png) 0 0 no-repeat; + left: 0; + top: 4px; + content: ''; +} +.action-switch-to-hub:before { + top: 2px; +} +.action-switch-to-analytics:before { + background-position: 0 -13px; +} +/* + Sales +-------------------------------------- */ +#order-totals strong { + color: #676056; + font-size: 14px; + font-weight: 700; +} +#order-shipping-method-summary a { + color: #007dbd; + font-size: 14px; + font-weight: 400; +} +#order-shipping-method-summary a:focus, +#order-shipping-method-summary a:hover { + text-decoration: underline; +} +.customer-current-activity { + float: left; + width: 22%; +} +.customer-current-activity-inner { + background: #fff; + border: 1px solid #eae6e0; + padding: 18px; + border-radius: 5px; +} +.order-details-existing-customer { + padding-left: 1%; + position: relative; + width: 77%; + float: right; +} +.order-billing-address, +.order-billing-method, +[class^=" sales-order-"] .order-history, +[class^=" sales-order-"] .order-comments-history, +[class^=" sales-order-"] .order-information, +[class^=" sales-order-"] .order-billing-address, +[class^=" sales-order-"] .order-payment-method, +[class^=" adminhtml-rma-"] .order-comments-history, +[class^=" adminhtml-rma-"] .order-shipping-address, +[class^=" adminhtml-rma-"] .rma-request-details { + float: left; + width: 49.5%; +} +.order-shipping-address, +.order-shipping-method, +[class^=" sales-order-"] .order-totals, +[class^=" sales-order-"] .order-account-information, +[class^=" sales-order-"] .order-shipping-address, +[class^=" sales-order-"] .order-payment-method-virtual, +[class^=" sales-order-"] .order-shipping-method, +[class^=" adminhtml-rma-"] .rma-confirmation, +[class^=" adminhtml-rma-"] .order-shipping-method, +[class^=" adminhtml-rma-"] .order-return-address { + float: right; + width: 49%; +} +#order-data .order-account-information { + float: none; + width: auto; +} +[class^=" sales-"] .order-information .fieldset-wrapper > .fieldset-wrapper-title .title { + width: 100%; +} +#order-data .actions .action-add, +#order-data .actions .action-delete, +#order-customer-selector .actions .action-add { + margin: 0 0 0 20px; +} +#order-data .order-methods ul { + list-style: none; + margin: 0; + padding: 0; +} +#order-data .order-methods dl, +#order-data .order-methods dt, +#order-data .order-methods dd, +#order-data .payment-methods dl, +#order-data .payment-methods dt, +#order-data .payment-methods dd { + margin: 0; + padding: 0; +} +#order-data .order-methods dd + dt, +#order-data .payment-methods dd + dt { + margin-top: 17px; +} +#order-data .order-methods dt, +#order-data .payment-methods dt { + margin: 0 0 8px; +} +.order-coupons .box-left, +.order-gift-options .box-left { + float: left; + width: 49%; +} +.order-coupons .box-right, +.order-gift-options .box-right { + float: right; + width: 49%; +} +.order-gift-options .box-left:last-child, +.order-gift-options .fieldset-wrapper-title + .box-right { + float: none; + width: auto; +} +.order-gift-options fieldset { + border-radius: 5px; +} +.order-gift-options .gift-wrapping-form select { + margin-left: 10px; +} +.order-gift-options .giftmessage-entire-order textarea { + height: 6em; + width: 100%; +} +.order-gift-options .giftmessage-whole-order-container textarea { + height: 6em; + width: 100%; +} +.order-gift-options .giftmessage-whole-order-container .actions { + margin-left: 20%; +} +.ui-dialog.gift-options-popup .ui-dialog-content { + padding: 25px; +} +.ui-dialog.gift-options-popup .ui-dialog-content h4 { + margin: 0 0 17px; +} +.gift-options-tooltip { + background: #fff; + border-radius: 5px; + padding: 10px; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); +} +#order-data .box-left fieldset, +#order-data .box-right fieldset { + border-radius: 5px; +} +#order-data .order-items td[colspan="8"] { + border: 1px solid #c0bbaf; +} +.order-search-items thead th:nth-child(1) { + width: 60px; +} +.order-search-items thead th:nth-child(3) { + width: 80px; +} +.order-search-items thead th:nth-child(4) { + width: 100px; +} +.order-search-items thead th:nth-child(5) { + width: 55px; +} +.order-search-items thead th:nth-child(6) { + width: 1px; +} +.adminhtml-rma-new .order-totals, +.order-comments-history .order-comments-history, +[class^=" adminhtml-rma-"] .rma-comments-history { + float: none; + width: 100%; +} +[class^=" sales-order-"] .order-billing-address .actions, +[class^=" sales-order-"] .order-shipping-address .actions { + margin: 17px 0; +} +[class^=" sales-order-"] .order-billing-address .control + label, +[class^=" sales-order-"] .order-shipping-address .control + label { + margin: 17px 0 0; +} +.sales-order-create-index .page-actions-inner .cancel, +.sales-order-create-index .page-actions-inner .cancel:hover, +.sales-order-create-index .page-actions-inner .cancel:active { + float: right; + margin: 0 0 0 12px; + padding: 3px 0 3px 6px; +} +.sales-order-create-index #order-message ul.messages > li, +.sales-order-edit-index #order-message ul.messages > li { + margin: 0 0 60px; +} +.sales-order-create-index thead .col-entity_id, +.sales-order-create-index .col-entity_id, +.sales-order-create-index .col-qty, +.checkout-index-index .col-qty { + width: 50px; +} +.sales-order-create-index .col-in_products, +.checkout-index-index .col-in_products { + text-align: center; +} +.sales-order-create-index .col-sku, +.sales-order-create-index .col-remove, +.checkout-index-index .col-remove { + width: 120px; +} +.sales-order-create-index .col-price { + width: 70px; +} +.sales-order-create-index .order-search-items .col-name, +.checkout-index-index #source_products_table .col-name { + width: 50%; +} +.sales-order-create-index .order-items.fieldset-wrapper .fieldset-wrapper-title, +.sales-order-create-index .order-search-items.fieldset-wrapper .fieldset-wrapper-title, +.sales-order-create-index .order-additional-area.fieldset-wrapper .fieldset-wrapper-title, +.sales-order-create-index .order-errors .fieldset-wrapper-title, +.checkout-index-index .checkout-errors .fieldset-wrapper-title { + border-bottom: 0; + margin: 0; +} +.sales-order-create-index #order-data .fieldset-wrapper-title .actions .action-add { + margin-left: 0; + margin-right: 20px; +} +.sales-order-create-index .order-items.fieldset-wrapper .title, +.sales-order-create-index .order-additional-area.fieldset-wrapper .title, +.sales-order-create-index .order-search-items.fieldset-wrapper .title, +.sales-order-create-index .order-errors .title, +.checkout-index-index .checkout-errors .title { + border-bottom: 1px solid #ededed; + float: none; + margin: 0 0 18px; + width: 100%; +} +.sales-order-create-index .order-items.fieldset-wrapper .actions, +.sales-order-create-index .order-search-items.fieldset-wrapper .actions, +.sales-order-create-index #order-errors .actions, +.checkout-index-index .checkout-errors .fieldset-wrapper-title .actions { + float: none; + border: 1px solid #c0bbaf; + border-bottom: 0; + background: #f6f3ec; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y2ZjNlYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlZGVhZTEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f6f3ec), color-stop(100%, #edeae1)); + background: -webkit-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: -o-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: -ms-linear-gradient(top, #f6f3ec 0%, #edeae1 100%); + background: linear-gradient(to bottom, #f6f3ec 0%, #edeae1 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f3ec', endColorstr='#edeae1', GradientType=0); + margin: 0; + padding: 0 8px; + position: relative; +} +.sales-order-create-index #order-data .fieldset-wrapper .actions .action-add, +.checkout-index-index .checkout-errors .fieldset-wrapper-title .actions .action-add { + margin: 7px 8px 8px 0; +} +.sales-order-create-index .order-additional-area.fieldset-wrapper .actions { + float: none; + margin: 0 0 8px; + padding: 0; +} +.sales-order-create-index #order-data .fieldset-wrapper .actions .action-delete, +.checkout-index-index .checkout-errors .fieldset-wrapper-title .actions .action-delete { + margin: 13px 0 0; +} +.sales-order-create-index .ui-dialog .downloadable.information .link .label { + margin-left: 0; +} +.sales-order-create-index .ui-dialog .downloadable.information .link .nested { + margin-left: 8px; +} +.sales-order-create-index .ui-dialog .fieldset.bundle .nested { + padding-left: 6px; +} +.sales-order-create-index .ui-dialog .fieldset.bundle .nested .field { + margin: 0 0 5px; +} +.sales-order-create-index .ui-dialog .fieldset.bundle .nested .label { + font-size: 13px; + margin: 0; +} +.sales-order-create-index .ui-dialog .fieldset.bundle .nested .qty .control { + display: inline-block; + margin: 0 0 0 10px; + width: 60px; +} +.sales-order-create-index .order-billing-method .payment-methods .fieldset { + padding: 0; + margin: 0; +} +.sales-order-create-index .order-billing-method .payment-methods .fieldset .field { + margin: 0 0 12px 0; +} +.tax.summary-total .summary-collapse { + cursor: pointer; + display: inline-block; +} +.tax.summary-total .summary-collapse:before { + content: "\e02d"; + color: #816063; + background: #f2ebde; + display: inline-block; + text-indent: 0; + font-size: 16px; + width: 16px; + height: 16px; + line-height: 16px; + overflow: hidden; + font-family: 'MUI-Icons'; + border: 1px solid #ada89e; + font-style: normal; + vertical-align: top; + margin-right: 7px; + font-weight: normal; + speak: none; + -webkit-font-smoothing: antialiased; + border-radius: 2px; +} +.tax.summary-total .summary-collapse:hover:before { + background: #cac3b4; +} +.tax.summary-total.show-details .summary-collapse:before { + content: "\e03a"; +} +tr.row-totals:nth-child(even) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(even) td, +tr.row-totals:nth-child(even) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(even) ~ tr.row-totals:nth-child(even) td, +tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(odd) ~ tr.row-totals:nth-child(even) td { + background: #fbfaf6; +} +tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(odd) ~ tr.row-totals:nth-child(odd) td, +tr.row-totals:nth-child(even) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(even) ~ tr.row-totals:nth-child(odd) td, +tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(odd) td { + background: #fff; +} +/* ----------------------------------- */ +#order-data .page-actions { + padding-top: 0; +} +#order-data .store-switcher { + margin: -46px 0 0; + position: relative; + width: 50%; +} +.create-order-sidebar-container > div + div { + border-top: 1px solid #ededed; + margin-top: 35px; +} +.create-order-sidebar-container > div .head h5 { + color: #676056; + font-size: 14px; + font-weight: 400; + margin: 17px 0 7px; +} +.customer-current-activity-inner > h4 { + color: #676056; + font-size: 20px; + font-weight: 400; + border-bottom: 1px solid #ededed; + margin-top: 0; + padding: 0 0 16px; +} +.customer-current-activity-inner .data-table th { + color: #676056; + font-size: 13px; + font-weight: 400; +} +.customer-current-activity-inner .data-table td { + color: #676056; + font-size: 12px; + font-weight: 400; +} +.customer-current-activity .action-refresh { + float: right; +} +.customer-current-activity .action-refresh, +.customer-current-activity .data-table .icon { + display: inline-block; + text-indent: 100%; + overflow: hidden; + height: 16px; + width: 16px; + white-space: nowrap; +} +.customer-current-activity .action-refresh:before, +.customer-current-activity .data-table .icon:before { + content: "\e010"; + color: #c3c2be; + display: block; + text-indent: 0; + font-size: 16px; + font-family: 'MUI-Icons'; + font-style: normal; + font-weight: normal; + speak: none; + -webkit-font-smoothing: antialiased; +} +.customer-current-activity .data-table .icon-remove:before { + content: "\e07f"; +} +.customer-current-activity .data-table .icon-add:before { + content: "\e071"; +} +.customer-current-activity .auto-scroll { + color: #676056; + font-size: 13px; + font-weight: 400; + overflow: auto; + max-height: 150px; +} +.customer-current-activity .auto-scroll + button { + margin: 22px 0 0; +} +.customer-current-activity .actions { + border-top: none; + margin: 20px 0 0; + padding: 0; +} +.overlay { + background: rgba(255, 255, 255, 0.5); + border-radius: 5px; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} +.overlay span { + color: #111; + font-weight: bold; + position: absolute; + top: 56px; + left: 0; + margin: 0 8px; + padding: 10px; + background: #ffffff; +} +/* + Order view +-------------------------------------- */ +[class^=" sales-order-"] .fieldset-wrapper-title .actions { + float: right; + font-size: 12px; + margin: 8px 20px 0 0; +} +[class^=" sales-order-"] .fieldset-wrapper-title .actions a:link, +[class^=" sales-order-"] .fieldset-wrapper-title .actions a:visited, +[class^=" sales-order-"] .fieldset-wrapper-title .actions a:hover, +[class^=" sales-order-"] .fieldset-wrapper-title .actions a:active { + color: #a29c94; +} +.order-comments-history fieldset { + border: 0; + margin: 0; + padding: 0; +} +.order-comments-history textarea, +.rma-history-form textarea { + height: 6em; + margin: 5px 0 10px; + resize: vertical; + width: 100%; +} +.order-comments-history input[type="checkbox"] { + margin-right: 5px; +} +.order-history-comments-options { + float: left; +} +.order-comments-history .actions { + float: right; +} +[class^=" sales-order-"] .fieldset-wrapper address { + overflow: auto; +} +/* + Orders comments +-------------------------------------- */ +.note-list { + list-style: none; + padding: 0; +} +.note-list li { + border-top: 1px solid #ededed; + padding: 9px 0; +} +.note-list li:first-child { + border: 0; + padding-top: 13px; +} +.note-list div { + font-size: 12px; +} +.note-list .note-list-date, +.note-list .note-list-status, +.note-list .note-list-customer span { + font-weight: bold; +} +.note-list .note-list-time, +.note-list .note-list-status { + border-right: 1px solid #676056; + padding: 0 5px 0 0; + margin: 0 5px 0 0; +} +.note-list .note-list-customer { + white-space: nowrap; +} +.note-list .note-list-comment { + margin: 5px 0 0; +} +.note-list .note-list-customer-notapplicable { + color: #d87e34; +} +.note-list .note-list-customer-notified { + color: #185b00; +} +.note-list .note-list-customer-not-notified { + color: #963535; +} +.checkout-agreement-index .col-id, +[class^=" sales-billing-"] .col-id, +[class^=" sales-transactions-"] .col-id { + width: 35px; +} +[class^=" sales-order-shipment-"] .col-ship, +[class^=" sales-"] .col-return-to-stock, +.adminhtml-rma-new .col-select { + text-align: center; + width: 35px; +} +[class^=" sales-order-"] .col-price-original, +[class^=" sales-order-"] .col-tax-amount, +[class^=" sales-order-"] .col-tax-percent, +[class^=" sales-order-"] .col-discont, +[class^=" sales-order-"] .col-total, +[class^=" sales-order-"] .col-discount, +[class^=" sales-order-"] .col-tax, +[class^=" sales-"] .col-refunded, +[class^=" adminhtml-rma-"] .col-order, +[class^=" adminhtml-rma-"] .col-required, +[class^=" adminhtml-rma-"] .col-system, +[class^=" adminhtml-rma-"] .col-visible-on-front, +.checkout-agreement-index .col-status, +.adminhtml-rma-item-attribute-edit .col-position { + text-align: right; + white-space: nowrap; + width: 50px; +} +[class^=" sales-order-"] .col-subtotal, +[class^=" sales-order-"] .col-price, +[class^=" adminhtml-rma-"] .col-price { + text-align: right; + width: 50px; +} +.sales-order-invoice-view .col-subtotal, +.sales-order-invoice-view .col-price { + width: 10%; +} +[class^=" sales-"] .col-actions, +[class^=" adminhtml-rma-"] .col-actions, +[class^=" adminhtml-rma-"] .col-default { + width: 50px; +} +[class^=" sales-"] .col-select, +[class^=" adminhtml-rma-"] .col-select { + width: 60px; +} +[class^=" sales-"] .col-qty, +[class^=" sales-order-"] .col-qty-invoice, +[class^=" sales-order-"] .col-ordered-qty, +[class^=" adminhtml-rma-"] .col-qty, +[class^=" adminhtml-rma-"] .col-condition { + width: 70px; +} +[class^=" sales-"] .col-refund, +[class^=" sales-transactions-"] .col-closed, +.sales-order-view .col-closed { + text-align: center; + width: 70px; +} +[class^=" sales-"] .col-order-number, +[class^=" sales-"] .col-invoice-number, +[class^=" sales-"] .col-memo-number, +[class^=" sales-"] .col-shipment-number, +[class^=" sales-"] .col-rma-number, +[class^=" sales-"] .col-status, +[class^=" adminhtml-rma-"] .col-order-number, +[class^=" adminhtml-rma-"] .col-rma-number, +[class^=" sales-transactions-"] .col-order-id, +.sales-order-view .col-refunded { + white-space: normal; + width: 75px; +} +[class^=" sales-"] .col-gtbase, +[class^=" sales-"] .col-gtpurchased { + text-align: right; + white-space: normal; + width: 75px; +} +[class^=" sales-"] .col-order-number, +[class^=" sales-"] .col-rma-number, +[class^=" adminhtml-rma-"] .col-order-number, +[class^=" adminhtml-rma-"] .col-rma-number { + text-align: left; +} +[class^=" adminhtml-rma-"] .col-status, +[class^=" adminhtml-rma-"] .col-reason, +[class^=" adminhtml-rma-"] .col-resolution, +[class^=" sales-transactions-"] .col-transaction-type, +.sales-order-view .col-memo { + width: 100px; +} +[class^=" sales-"] tr.headings .col-parent-transaction-id > span, +[class^=" sales-"] tr.headings .col-method > span, +[class^=" sales-"] tr.headings .col-transaction-id > span, +[class^=" sales-"] tr.headings .col-transaction-type > span, +[class^=" sales-"] tr.headings .col-gtbase > span, +[class^=" sales-"] tr.headings .col-gtpurchased > span, +[class^=" sales-order-"] tr.headings .col-discont > span { + white-space: normal; +} +[class^=" sales-"] .col-period, +[class^=" adminhtml-rma-"] .col-period { + width: 150px; +} +[class^=" sales-order-shipment-"] .col-carrier { + width: 190px; +} +.checkout-agreement-index .col-store-view { + white-space: nowrap; + width: 200px; +} +[class^=" sales-transactions-"] .log-details .data-table tbody tr th, +[class^=" sales-transactions-"] .col-key { + width: 22%; +} +.sales-order-index .col-1-layout table.data { + table-layout: fixed; + word-wrap: break-word; +} +[class^=" sales-"] .col-from-store { + width: 15%; +} +[class^=" sales-"] .col-2-left-layout .hor-scroll { + margin-bottom: -4px; + overflow: auto; + padding-bottom: 4px; + width: 100%; +} +[class^=" sales-order-"] .order-totals .actions, +[class^=" adminhtml-rma-"] .col-qty, +[class^=" adminhtml-rma-"] .col-qty_ordered, +.sales-order-view .col-refunded { + text-align: right; +} +[class^=" sales-order-"] .col-price .label, +[class^=" sales-order-"] .col-subtotal .label { + display: inline-block; + min-width: 60px; + white-space: nowrap; +} +[class^=" sales-order-"] .col-price .price-excl-tax .price, +[class^=" sales-order-"] .col-price .price-incl-tax .price, +[class^=" sales-order-"] .col-subtotal .price-excl-tax .price, +[class^=" sales-order-"] .col-subtotal .price-incl-tax .price { + font-weight: bold; +} +[class^=" sales-order-"] .grid .col-qty table, +[class^=" sales-order-"] .grid .col-qty tbody, +[class^=" sales-order-"] .grid .col-qty tr, +[class^=" sales-order-"] .grid .col-qty td, +[class^=" sales-order-"] .grid .col-ordered-qty table, +[class^=" sales-order-"] .grid .col-ordered-qty tbody, +[class^=" sales-order-"] .grid .col-ordered-qty tr, +[class^=" sales-order-"] .grid .col-ordered-qty td { + background: none; + border: 0; +} +[class^=" sales-order-"] .col-ordered-qty td { + padding: 0 5px 3px; +} +[class^=" sales-order-"] .grid .product-title { + font-weight: bold; +} +[class^=" sales-order-"] .item-options { + margin: 5px 0 5px 10px; +} +[class^=" sales-order-"] .item-options dt { + font-weight: bold; +} +[class^=" sales-order-"] .item-options dd { + margin: 0 0 0 10px; +} +.adminhtml-rma-item-attribute-edit .col-position input { + text-align: center; +} +.order-subtotal .label { + text-align: right; +} +.items-to-invoice { + border: 1px solid #c0bbaf; + margin-top: 13px; + width: 100%; +} +.items-to-invoice td, +table.items-to-invoice tbody tr:hover td { + background-color: #e6e3de; + border: 0; + text-align: center; +} +[class^=" sales-order-creditmemo-"] .no-items { + padding-top: 13px; + text-align: center; +} +.items-to-invoice .grand-total { + color: #19a3d1; + font-weight: bold; +} +.sales-order-shipment-new .order-totals .fieldset-wrapper { + padding-top: 18px; +} +.sales-order-shipment-new .actions { + float: right; +} +.creditmemo-totals .data-table input[type="text"] { + text-align: right; + width: 60px; +} +[class^=" sales-order-"] .order-subtotal .label { + width: 80%; +} +.adminhtml-rma-new .rma-confirmation .actions { + margin-top: 10px; + text-align: right; +} +[class^=" adminhtml-rma-"] .rma-items th.col-qty span, +.adminhtml-rma-edit .rma-items th.col-qty span { + text-align: left; + white-space: normal; +} +.adminhtml-rma-edit .data-table .col-carrier, +[class^=" sales-billing-agreement-"] .log-details .data-table th { + width: 20%; +} +.adminhtml-rma-edit .data-table .col-title { + width: 35%; +} +.adminhtml-rma-edit .data-table .col-number { + width: 25%; +} +[class^=" sales-order-"] .order-shipping-address .price, +.order-shipping-address .shipping-description-title { + font-weight: bold; +} +[class^=" adminhtml-rma-"] .col-actions a { + cursor: pointer; + white-space: nowrap; +} +[class^=" adminhtml-rma-"] .col-reason input[type="text"] { + margin: 5px 0 0; + width: 100%; +} +[class^=" adminhtml-rma-"] .col-actions .separator { + margin: 0 3px; +} +[class^=" sales-"] .order-payment-method .data-table { + margin-top: 15px; +} +[class^=" sales-"] .order-payment-currency { + margin-top: 15px; +} +[class^=" sales-"] .grid tbody td { + vertical-align: top; +} +[class^=" sales-"] .grid tbody.even tr td { + background: #e6e3de; +} +[class^=" sales-"] .grid tbody.odd tr td { + border-bottom: 0; + background: #f5f2ed; +} +[class^=" sales-"] .grid .data { + border-bottom: 1px solid #c0bbaf; +} +[class^=" sales-"] .grid td .option-label { + font-weight: bold; +} +[class^=" sales-"] .grid td .option-value { + margin: 0 0 0 10px; +} +.col-product .product_to_add { + float: right; +} +[class^=" adminhtml-extension-custom-"] #authors_fieldset .data-table td { + vertical-align: top; +} +/* + Packaging for Shipping Popup +-------------------------------------- */ +#popup-window-mask, +.popup-window-mask { + background: rgba(0, 0, 0, 0.5); + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 999; +} +.packaging-window, +.packed-window { + background: #fff; + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4); + left: 50%; + margin: -200px 0 0 -471px; + position: fixed; + top: 50%; + width: 1000px; + z-index: 1000; +} +.packaging-window .entry-edit-head { + padding: 3px 5px; +} +.packaging-window .messages { + padding: 10px 26px 10px 32px; + border: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + color: #963535; + text-shadow: none; + position: relative; + background: #f3dcd8; + border: 1px solid #963535; + margin-top: -1px; +} +.packaging-window .messages:before { + position: absolute; + left: 8px; + top: 50%; + margin-top: -11px; + background: none; + text-shadow: none; + width: auto; + height: auto; + border: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 16px; + content: '\e069'; + color: #963535; +} +.packaging-window .validation-failed { + background: #fef0ed; + border: 1px dashed #d6340e; +} +.packaging-window .packaging-content { + overflow: auto; + overflow-x: hidden; + height: auto !important; + max-height: 400px; +} +.packaging-window .package-options { + width: 100%; + border-top: 1px solid #ccc; + padding: 10px 0 0; + margin: 3px 0 0; +} +.packaging-window .package-options td { + vertical-align: middle; +} +.packaging-window .package-options .input-text { + width: 50px; +} +.packaging-window .package_prapare { + margin-bottom: 15px; +} +.packaging-window .package-options .customs-value { + width: 80px; +} +.packaging-window .package-options .options-weight { + width: 75px; +} +.packaging-window .package-options .options-units-weight { + width: 45px; +} +.packaging-window .package-options .options-units-dimensions { + width: 45px; +} +.packaging-window .package-options .options-content-type { + width: 120px; +} +.packaging-window .package-options input[type=text].disabled, +.packaging-window .package-options select.disabled { + background: #eee; +} +.packaging-window .package-options-contents { + border-top: 0; +} +.packaging-window .package-add-products { + margin: 20px 0 0; +} +.packaging-window .package-add-products .grid { + padding: 0; +} +.packaging-window .package-add-products .grid button { + vertical-align: middle; +} +.packaging-window .package-number { + font-weight: bold; +} +.packaging-window .package-number span { + margin-left: 5px; +} +.packed-window .entry-edit-head { + padding: 3px 5px; +} +.packed-window .packed-content { + padding: 10px 10px 0; + overflow: auto; + max-height: 400px; +} +.packed-window .package { + border-top: 1px solid #ededed; + margin-bottom: 30px; + padding: 10px; +} +.packed-window .package:first-child { + border-top: 0; +} +.package-info { + background: #e6e3de; + border: 1px solid #c0bbaf; +} +.package-info th { + font-weight: bold; +} +.packed-window .package-info table tbody tr td, +.packed-window .package-info table tbody tr th, +.package-info table tbody tr:nth-child(2n+1) td, +.package-info table tbody tr:nth-child(2n+1) th { + background: none; + border: 0; + padding: 5px 5px 2px; +} +.packed-window .package .grid { + padding: 0; +} +.packed-window .package-options { + width: 60%; +} +.packed-window .package-options td, +.packed-window .package-options th { + padding: 1px 0; +} +.grid .popup-window { + text-align: left; +} +.grid tr.on-mouse td .popup-window .data-table tbody tr:nth-child(2n+1) td, +.grid table tbody tr.on-mouse:nth-child(odd):hover td .popup-window .data-table tbody tr:nth-child(2n+1) td, +.grid table tbody tr.on-mouse:nth-child(odd):hover td .popup-window .data-table tbody tr:nth-child(2n+1):hover td, +.grid table tbody tr.on-mouse:nth-child(2n+1):hover td .popup-window .data-table tbody tr:nth-child(2n+1) td, +.grid table tbody tr.on-mouse:nth-child(2n+1):hover td .popup-window .data-table tbody tr:nth-child(2n+1):hover td, +.grid table tbody tr.on-mouse:hover td .popup-window .data-table tbody tr:nth-child(2n+1), +.grid table tbody tr.on-mouse:hover th .popup-window .data-table tbody tr:nth-child(2n+1) { + background-color: #fbfaf6; +} +.grid .popup-window { + text-align: left; +} +.popup-window-buttons-set { + text-align: right; + padding: 25px; +} +.popup-window-title { + background: #f3efea; + padding: 19px 20px; +} +.popup-window-title .title { + color: #676056; + display: block; + font-size: 20px; + line-height: 1; +} +.popup-window-title .actions { + float: right; +} +.popup-window-content { + padding: 25px 25px 0; +} +.popup-window-content > ul { + list-style: none; + padding: 0; +} +.packaging-window .col-weight { + text-align: left; + width: 60px; +} +.packaging-window .col-qty { + text-align: left; + width: 80px; +} +.packed-window .col-qty, +.packed-window .col-weight, +.packed-window .col-qty_ordered { + text-align: right; + width: 70px; +} +.packaging-window .col-select, +.packaging-window .col-measure { + text-align: center; + width: 35px; +} +.popup-fieldset-title .title { + color: #666; + display: inline-block; + font-size: 18px; + font-weight: normal; + padding: 7px 0 10px; +} +.popup-fieldset-title .actions { + float: right; +} +.packaging-window select { + margin-bottom: 0; +} +.packaging-window .col-width, +.packaging-window .col-height, +.packaging-window .col-length, +.packaging-window .data-table .col-total-weight input[type="text"] { + width: 60px; +} +.packaging-window .col-total-weight { + white-space: nowrap; + width: 100px; +} +.packaging-window .col-signature { + width: 160px; +} +.packaging-window .data-table .col-actions, +.packaging-window .col-total-weight { + white-space: nowrap; +} +.packaging-window .data-table .action-delete { + margin: 5px 0 0 5px; +} +.packaging-window .grid tr th { + border-bottom: 1px solid #c9c2b8; +} +.packaging-window .grid tr th:first-child, +.packaging-window .grid td:first-child, +.packaging-window .grid td:last-child { + border-left: 0; + border-right: 0; +} +.packaging-window .data-table .col-qty-edit { + white-space: nowrap; + width: 50px; +} +.packaging-window .data-table .col-qty-edit input[type="text"] { + width: 50px; +} +.sp-methods > dt { + font-weight: bold; +} +.sp-methods > dd { + margin: 5px 0 5px 15px; +} +.sp-methods > dd > ul { + list-style: none; + padding: 0; +} +[class^=" sales-order-"] .order-billing-address .packaging-window .actions, +[class^=" sales-order-"] .order-shipping-address .packaging-window .actions { + margin: 0; +} +/* + Popup Configuration Popup +-------------------------------------- */ +#product_composite_configure_messages { + margin-left: 0 !important; + padding: 10px 15px; +} +.rma-popup, +.cms-popup { + background: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4); + cursor: default; + position: fixed; + left: 50%; + top: 50%; + z-index: 1000; +} +.rma-popup { + width: 540px; + margin: 0 0 0 -271px; +} +.rma-popup .entry-edit .fieldset { + border: none; +} +.rma-popup .validation-advice, +.rma-popup label.mage-error { + margin-left: 0; +} +.rma-popup .content { + background: #fff; + border-bottom: 1px solid #ccc; + max-height: 400px; + overflow: auto; +} +.rma-popup .content .grid { + padding: 0; +} +.rma-popup .content .grid table { + border-bottom: 1px solid #cbd3d4; +} +.rma-popup .product-options { + border-bottom: 1px solid #e7e7e7; + margin: 0 0 15px; + padding: 0 0 12px; +} +.rma-popup .product-options .required { + color: #333 !important; + font-weight: normal !important; +} +.rma-popup .product-options .required em { + color: #d40707; +} +.rma-popup .last-fieldset .product-options { + border: 0 none; + margin-bottom: 0; + padding-bottom: 0; +} +.rma-popup .buttons-set { + text-align: right; + margin: 0; + overflow: hidden; + padding: 7px 10px 8px; +} +.rma-popup .buttons-set { + width: 518px; +} +.cms-popup .buttons-set { + width: 289px; +} +.rma-popup .buttons-set button { + margin: 0 0 0 5px; +} +.grid .rma-popup .form-list tr, +.grid tr.even .rma-popup .form-list tr, +.grid tr.on-mouse .rma-popup .form-list tr { + background: #fff !important; +} +/* + URL rewrite +-------------------------------------- */ +.adminhtml-urlrewrite-edit .field-url-rewrite-option-select .label { + width: auto; +} +/* + Shopping Cart Price Rule +-------------------------------------- */ +.fieldset .field-coupon_code, +.fieldset .field-rule_use_auto_generation { + margin-bottom: 0; +} +.field-rule_use_auto_generation .label { + margin-left: 5px; +} +.field-rule_use_auto_generation .nested { + margin-bottom: 29px; +} +/* + Product Image Placeholders +-------------------------------------- */ +#catalog_placeholder .input-file, +#catalog_placeholder .delete-image > input { + margin-right: 5px; +} +/* Permanent Redirect for old URL */ +.control > [name="product[url_key_create_redirect]"], +.control > [name="general[url_key_create_redirect]"] { + float: left; + margin: 8px 5px 0 0; +} +.control > [name="product[url_key_create_redirect]"] + .label, +.control > [name="general[url_key_create_redirect]"] + .label { + width: auto; +} +/* + New Product Attribute Set +-------------------------------------- */ +.field-skeleton_set .select { + width: 100%; +} +/* + Cache Management +-------------------------------------- */ +.additional-cache-management .label { + margin-top: 5px; +} +/* + Currency Symbols +-------------------------------------- */ +.adminhtml-system-currencysymbol-index th.col-symbol .required:after { + content: '*'; + margin-left: 3px; +} +.adminhtml-system-currencysymbol-index td.col-currency .label { + margin-top: 5px; +} +/* + Categories +-------------------------------------- */ +.category-content .form-inline.permissions-custom-options .messages li { + margin-top: 0; +} +.category-content .form-inline.permissions-custom-options .data-table { + margin-bottom: 25px; +} +/* + Marketing - Email Reminders +-------------------------------------- */ +.lt-1280 .adminhtml-reminder-edit #customerGrid .grid .filter .range div.date { + min-width: 0; +} +/* + Customers - Manage Shopping Cart +-------------------------------------- */ +.checkout-index-index .products-search { + margin-top: 35px; +} +.checkout-index-index .products-search > .actions { + text-align: right; + margin: 10px 0; +} +.checkout-index-index .shopping-cart-items > .actions { + margin-bottom: 15px; +} +.checkout-index-index .shopping-cart-items .box-left, +.checkout-index-index .shopping-cart-items .box.right { + width: 49%; +} +.checkout-index-index .shopping-cart-items .box-left fieldset, +.checkout-index-index .shopping-cart-items .box.right fieldset { + border-radius: 5px; +} +.checkout-index-index .shopping-cart-items .box-left { + float: left; +} +.checkout-index-index .shopping-cart-items .box.right { + float: right; +} +.checkout-index-index .grid table .action-configure { + float: right; +} +/* + Clearfix +-------------------------------------- */ +.shopping-cart-items:before, +.shopping-cart-items:after, +.image-panel:before, +.image-panel:after, +.images:before, +.images:after, +.tax-rate-popup .field:before, +.tax-rate-popup .field:after, +.clearfix:before, +.clearfix:after, +#tab_content_downloadableInfo .data-table td .row:before, +#tab_content_downloadableInfo .data-table td .row:after { + content: ""; + display: table; +} +.shopping-cart-items:after, +.image-panel:after, +.images:after, +.tax-rate-popup .field:after, +.clearfix:after, +#tab_content_downloadableInfo .data-table td .row:after { + clear: both; +} +.debug { + border: 1px solid red !important; +} +.messages ul, +ul.messages { + list-style: none; + margin: 0; + padding: 0; +} +ul.messages > li { + margin: 20px 0; +} +ul.messages li li { + padding: 10px 26px 10px 35px; + border-radius: 5px; + color: #676056; + text-shadow: none; + position: relative; + background: #fffbf0; + border: 1px solid #d87e34; + margin-top: -1px; +} +ul.messages li li:first-child { + margin-top: 0; +} +ul.messages li li:before { + position: absolute; + left: 11px; + top: 50%; + margin-top: -11px; + background: none; + text-shadow: none; + width: auto; + height: auto; + border: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 16px; + content: '\e046'; + /* icon-info */ + + color: #d87e34; +} +ul.messages li.error-msg li { + color: #963535; + border-color: #963535; + background: #f3dcd8; +} +ul.messages li.error-msg li:before { + content: '\e069'; + color: #963535; +} +ul.messages li.success-msg li { + border-color: #ceceb6; + background: #e4eecb; + color: #185b00; +} +ul.messages li.success-msg li:before { + content: '\e067'; + color: #185b00; +} +/* + Accordion +------------------------*/ +.accordion { + margin: 0 0 8px; + padding: 0; +} +.accordion > dt, +.accordion > dd.open, +.accordion .collapseable, +.section-config.active > .collapseable + input + fieldset, +.accordion .collapseable.open + input + fieldset { + background: #fff; + border: 1px solid #eae6e0; + border-radius: 5px; + margin: 0 0 8px; + padding: 5px 18px 2px; + position: relative; +} +.accordion > dt + dd { + display: none; +} +.accordion > dt.open, +.section-config.active > .collapseable, +.accordion .collapseable.open { + margin: 0; + border-bottom: 0; + border-radius: 5px 5px 0 0; +} +.section-config.active > .collapseable + input + fieldset, +.accordion > dt + dd.open, +.accordion .collapseable.open + input + fieldset { + padding: 25px 18px 18px; + display: block; + border-top: 0; + border-radius: 0 0 5px 5px; +} +.section-config > .collapseable > a, +.accordion > dt a, +.accordion .collapseable > a { + color: #676056; + font-size: 20px; + font-weight: 400; + display: block; + padding: 7px 0 10px 22px; + text-decoration: none; + position: relative; + cursor: pointer; +} +.section-config > .collapseable > a i, +.accordion > dt a i, +.accordion .collapseable > a i { + color: #676056; + font-size: 20px; + font-style: italic; + font-weight: 400; +} +.section-config.active > .collapseable > a, +.accordion .collapseable.open a, +.accordion dt.open a { + border-bottom: 1px solid #ededed; +} +.section-config > .collapseable > a:before, +.accordion > dt a:before, +.accordion .collapseable > a:before { + position: absolute; + left: 0; + top: 7px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02a'; + /* arrow right icon */ + + color: #b2b0ad; +} +.section-config.active > .collapseable > a:before, +.accordion > dt.open a:before, +.accordion .collapseable.open a:before { + content: '\e02c'; + /* arrow down icon */ + +} +.section-config > .collapseable > a:hover:before, +.accordion > dt a:hover:before, +.accordion .collapseable > a:hover:before { + color: #7e7e7e; +} +/* PayPal connected */ +.section-config.complex .section-config.with-button { + padding: 20px 15px; + margin: 0 -30px 0 -15px; + border-bottom: 1px solid #eae6e0; +} +.section-config.complex tr:last-child .section-config.with-button { + border-bottom: 0; +} +.section-config.complex .section-config.with-button > .entry-edit-head { + padding: 0; + padding-left: 25px; + border: 0; +} +.section-config.complex .section-config.with-button.enabled > .entry-edit-head:before { + content: "\e01e"; + color: #fff; + background: #65940a; + font-family: "MUI-Icons"; + font-weight: normal; + padding: 3px; + font-size: 10px; + width: 10px; + height: 10px; + line-height: 10px; + overflow: hidden; + border-radius: 8px; + display: block; + float: left; + margin-left: -25px; + margin-top: 0; +} +.section-config.complex .section-config.with-button > .config { + margin: 10px -10px; + border: 1px solid #d1d0ce; + border-radius: 5px; + padding: 5px 0; +} +.section-config.complex .section-config.with-button > .config > table > tbody > tr > td { + padding: 0; +} +.section-config.complex .section-config.with-button > .config > table > tbody > tr > td > .section-config > .entry-edit-head { + border: 0; + border-radius: 0; + margin-bottom: 0; + padding: 5px 10px 2px; + border-bottom: 1px solid #d1d0ce; + background: transparent; +} +.section-config.complex .section-config.with-button > .config > table > tbody > tr:last-child > td > .section-config > .entry-edit-head { + border: 0; +} +.section-config.complex .section-config.with-button > .config > table > tbody > tr > td > .section-config > .entry-edit-head a { + border-bottom: 0; +} +.section-config.complex .section-config.with-button > .config > table > tbody > tr > td > .section-config > .config { + border: 0; + border-bottom: 1px solid #d1d0ce; + border-radius: 0; + margin: 0; + padding-bottom: 50px; +} +.section-config.complex .section-config.with-button > .config > table > tbody > tr:last-child > td > .section-config > .config { + border-bottom: 0; +} +.section-config .config h4 { + padding-left: 25%; + font-size: 18px; +} +.section-config .config td.label label.enabled:before { + content: "\e01e"; + color: #fff; + background: #65940a; + font-family: "MUI-Icons"; + font-weight: normal; + padding: 3px; + font-size: 10px; + width: 10px; + height: 10px; + line-height: 10px; + overflow: hidden; + border-radius: 8px; + display: block; + float: left; + margin-right: 5px; +} +.section-config.complex .section-config.with-button > .config:before { + content: ''; + height: 9px; + width: 20px; + overflow: hidden; + display: block; + position: absolute; + bottom: 100%; + left: 50%; + zoom: 1; + z-index: 2; + margin-left: -10px; + background: url(../images/subconfig-bg.png) no-repeat 0 0; +} +.section-config.config-advanced { + padding: 30px 0 0; +} +.section-config.config-advanced > .entry-edit-head { + border: 0; + padding: 0; + padding-left: 25%; +} +.section-config.config-advanced > .entry-edit-head a { + border: 0 !important; +} +.section-config.config-advanced > .config { + padding-left: 0!important; + padding-right: 0!important; + border: 0!important; + border-radius: 0!important; +} +.section-config.config-advanced > .entry-edit-head a { + margin-left: -22px; +} +.section-config.with-button .config-heading strong { + display: block; + color: #676056; + font-size: 14px; + font-weight: 700; + margin-bottom: 5px; +} +.section-config.with-button .config-heading .button-container { + margin: 15px 0 0; +} +.section-config.with-button .button-container { + line-height: 28px; +} +.section-config.with-button .button-container a { + margin-left: 20px; +} +.section-config.with-button .action-configure span { + display: block; + position: relative; + text-align: center; +} +.section-config.with-button .action-configure .state-opened { + visibility: hidden; + height: 0; + overflow: hidden; +} +.section-config.with-button .action-configure.open .state-opened { + visibility: visible; + height: auto; + overflow: auto; +} +.section-config.with-button .action-configure.open .state-closed { + visibility: hidden; + height: 0; + overflow: hidden; +} +.accordion > dt + dd { + display: none; +} +.accordion > dt + .open:empty { + background: #ffffff url(../mui/images/ajax-loader-big.gif) no-repeat center; + height: 100px; +} +/* TODO: arrange configuration tables */ +.accordion .collapseable.disabled { + background: #f1f1f1; +} +.accordion .collapseable.disabled > a { + cursor: not-allowed; +} +.accordion .collapseable.disabled > a:before { + content: ''; +} +.accordion .config { + border: 0; +} +.accordion .config .comment a { + color: #007dbd; + font-size: 14px; + font-weight: 400; +} +.accordion .config .comment a:focus, +.accordion .config .comment a:hover { + text-decoration: underline; +} +.accordion .config legend { + display: none; +} +.accordion .config table { + width: 100%; +} +.accordion .config .label { + float: none; + width: 25%; + text-align: right; + color: #676056; + font-size: 13px; + font-weight: 600; +} +.accordion .config .value .label { + padding: 6px 5px 0 15px; + vertical-align: top; + width: auto; +} +.accordion .config .value .label:first-child { + padding-left: 0; +} +.accordion .config .label label { + padding-top: 6px; +} +.accordion .config td { + background: none; + border: 0; + padding: 8px 15px 0 0; + vertical-align: top; +} +.accordion .paypal-selection-simplified { + padding-left: 30px; +} +.accordion .paypal-selection input[type="checkbox"] { + margin: -4px 7px 0 0; +} +.accordion .config input[type="text"], +.accordion .config input[type="password"], +.accordion .config select, +.accordion .config textarea { + width: 100%; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.accordion .config input.input-file { + margin-top: 4px; +} +.accordion .config select.select-date { + width: 20%; +} +.accordion .config .value { + width: 50%; + padding-right: 40px; +} +.accordion .config .value.with-tooltip { + padding-top: 5px; +} +.accordion .config .value.with-tooltip .tooltip { + position: relative; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: 0; + float: right; + margin-right: -20px; + margin-top: 6px; +} +.accordion .config .value.with-tooltip .tooltip-content { + padding: 18px; + margin: 0 -17px 10px 0; + right: 0; + bottom: 100%; + width: 239px; + max-width: 239px; + font-size: 13px; + line-height: 1.4; + background: #31302b; + background: rgba(49, 48, 43, 0.8); + border-radius: 5px; +} +.accordion .config .value.with-tooltip .tooltip-content:before { + content: ''; + position: absolute; + width: 0; + height: 0; + top: auto; + bottom: -5px; + left: auto; + right: 20px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #31302b; + border-bottom: 0; + opacity: .8; +} +.accordion .config .value.with-tooltip .help { + position: relative; + width: auto; + margin: 0; +} +.accordion .config .scope-label { + color: #999; + font-size: 12px; + letter-spacing: 0.05em; + padding: 15px 15px 0 0; +} +.accordion .config .note { + color: #676056; + font-size: 12px; + font-weight: 400; + padding-left: 15px; + margin: 5px 0; +} +.accordion .config .note a { + color: #007dbd; + font-size: 12px; + font-weight: 400; +} +.accordion .config .note a:focus, +.accordion .config .note a:hover { + text-decoration: underline; +} +.accordion .config .note:before { + position: absolute; + margin: 4px 0 0 -14px; + content: ''; + display: inline-block; + vertical-align: top; + font-size: 0; + line-height: 0; + width: 0; + border-bottom: 5px solid #666; + border-left: 5px solid transparent; + border-right: 5px solid transparent; +} +.accordion .config .system-tooltip-box { + position: absolute; +} +.accordion .paypal-selection { + margin: 10px; + width: 98%; +} +.accordion .paypal-selection th { + padding: 6px 10px 7px; +} +.accordion .paypal-selection { + border-bottom: 2px solid #c0bbaf; +} +.accordion .paypal-payment-notice { + margin: 10px; +} +.accordion .custom-options { + border: 1px solid #999; + padding: 0 10px; + margin: 0 0 20px; +} +/* TODO: arrange range inputs width in tables */ +.grid td input.input-text-range { + width: 35%; +} +.grid td input.input-text-range-date { + width: 31%; +} +/* TODO: styles for required TH fields */ +th.required:after { + color: red; + content: "*"; + margin-left: 5px; +} +/* TODO: set color for messages in Cache Storage Management */ +.grid-severity-critical, +.grid-severity-major, +.grid-severity-notice, +.grid-severity-minor { + display: block; + border: 1px solid #c76f35; + background: #fffbf0; + text-align: center; +} +.grid-severity-critical { + border-color: #6e1313; + background: #f7bfbf; + color: #6e1313; +} +.grid-severity-major { + border-color: #963535; + background: #f3dcd8; + color: #963535; +} +.grid-severity-notice { + border-color: #185b00; + background: #e6ecc0; + color: #185b00; +} +/* + Sales +-------------------------------------- */ +.order-items .entry-edit-head .form-buttons { + float: right; +} +.order-items .entry-edit-head .icon-head { + display: inline; +} +.order-items .entry-edit-head { + margin-bottom: 20px; +} +.order-items .entry-edit-head:before, +.order-items .entry-edit-head:after { + content: ""; + display: table; +} +.order-items .entry-edit-head:after { + clear: both; +} +/* + Import-export tax rates +-------------------------------------- */ +.import-export-tax-rates input[type=file] { + margin-right: 10px; +} +.import-tax-rates, +.export-tax-rates { + float: left; + width: 48.9362%; +} +.export-tax-rates { + margin-left: 2.12766%; +} +.import-export-tax-rates:before, +.import-export-tax-rates:after { + content: ""; + display: table; +} +.import-export-tax-rates:after { + clear: both; +} +/* + Product +-------------------------------------- */ +.tier { + margin: 20px 0 0; +} +/* + Edit attribute set +-------------------------------------- */ +.attribute-set-col { + display: block; + float: left; + width: 100%; + margin-left: 2.127659574%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + width: 31.9149%; +} +.attribute-set-col:first-child { + margin-left: 0; +} +.attribute-set-tree { + margin-top: 5px; + overflow: auto; + height: 400px; + width: 100%; +} +.attribute-set:before, +.attribute-set:after { + content: ""; + display: table; +} +.attribute-set:after { + clear: both; +} +/* + Manage Categories +-------------------------------------- */ +.catalog-category-edit .category-edit-title { + float: left; +} +/* + Catalog Price Rule +-------------------------------------- */ +.rule-tree-wrapper { + line-height: 28px; +} +.rule-tree ul { + list-style: none; + padding-left: 16px; + border-left: dotted 1px #888; +} +.rule-tree li { + margin: 0 0 10px; +} +.rule-tree .x-tree ul { + padding-left: 0 !important; + border-left: none !important; +} +.rule-param .label { + color: #000; + float: none; + text-align: left; + padding: 0; + vertical-align: baseline; + width: auto; +} +.rule-param .label-disabled { + color: #eee; + cursor: default; + text-decoration: none; +} +.rule-chooser, +.rule-param .element, +.rule-param-edit .label { + display: none; +} +.rule-param input, +.rule-param select { + width: auto !important; + margin: 0; + min-width: 170px; +} +.rule-param-edit .element { + display: inline; +} +.rule-param-edit .element .addafter { + padding-left: 5px; +} +[class^="rule-param-"] img, +.rule-chooser-trigger img { + vertical-align: middle; +} +.rule-chooser { + border: solid 1px #CCC; + margin: 20px; + padding: 15px 10px 5px; +} +.rule-param-wait { + background: url(../mui/images/ajax-loader-small.gif) no-repeat left center; + padding-left: 20px; +} +/* + + URL Rewrite +-------------------------------------- */ +.field-url-rewrite-option-select { + padding-top: 13px; +} +/* jstree */ +.jstree-default .disabled > a { + color: #a29c94; +} +/* File brouser */ diff --git a/app/design/adminhtml/magento_backend/css/styles-ie8.css b/app/design/adminhtml/magento_backend/css/styles-ie8.css new file mode 100644 index 0000000000000000000000000000000000000000..12df12f742abe93b23129e6f4e05299cddc0cfef --- /dev/null +++ b/app/design/adminhtml/magento_backend/css/styles-ie8.css @@ -0,0 +1,300 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +.eq-ie8 .customer-current-activity .action-refresh, +.eq-ie8 .pager .action-next, +.eq-ie8 .pager .action-previous, +.eq-ie8 .pager .action-next:hover, +.eq-ie8 .pager .action-previous:hover, +.eq-ie8 .pager .action-next.disabled:focus, +.eq-ie8 .pager .action-previous.disabled:focus, +.eq-ie8 .pager .action-next.disabled:active, +.eq-ie8 .pager .action-previous.disabled:active, +.eq-ie8 .data-table .action-.delete, +.eq-ie8 .data-table .action-.delete:hover, +.eq-ie8 .data-table .action-.delete:active, +.eq-ie8 .data-table .action-.delete.active, +.eq-ie8 .data-table .action-delete, +.eq-ie8 .data-table .action-delete:hover, +.eq-ie8 .data-table .action-delete:active, +.eq-ie8 .data-table .action-delete.active, +.eq-ie8 .data-table .action-locked, +.eq-ie8 .data-table .action-locked:hover, +.eq-ie8 .data-table .action-locked:active, +.eq-ie8 .data-table .action-locked.active, +.eq-ie8 #product-variations-matrix .action-choose, +.eq-ie8 #product-variations-matrix .action-choose:hover, +.eq-ie8 #product-variations-matrix .action-choose:active, +.eq-ie8 #product-variations-matrix .action-choose.active, +.eq-ie8 .image-panel .action-close, +.eq-ie8 .eq-ie8 .image-panel .action-close:hover, +.eq-ie8 .image-panel .action-close:active, +.eq-ie8 .image-panel .action-close.active, +.eq-ie8 .image-panel-controls .action-remove, +.eq-ie8 .image-panel-controls .action-remove:hover, +.eq-ie8 .image-panel-controls .action-remove:active, +.eq-ie8 .image-panel-controls .action-remove.active, +.eq-ie8 .suggest-expandable .action-show-all, +.eq-ie8 .suggest-expandable .action-show-all:hover, +.eq-ie8 .suggest-expandable .action-show-all:active, +.eq-ie8 .suggest-expandable .action-show-all.active, +.eq-ie8 .vde-tools-header .action-close, +.eq-ie8 .vde-tools-header .action-close:hover, +.eq-ie8 .vde-tools-header .action-close:active, +.eq-ie8 .vde-tools-header .action-close.active, +.eq-ie8 .image .action-delete, +.eq-ie8 .image .action-delete:hover, +.eq-ie8 .image .action-delete:active, +.eq-ie8 .image .action-delete.active, +.eq-ie8 .fieldset-wrapper-title .actions .action-delete, +.eq-ie8 .fieldset-wrapper-title .actions .action-delete:hover, +.eq-ie8 .fieldset-wrapper-title .actions .action-delete:active, +.eq-ie8 .fieldset-wrapper-title .actions .action-delete.active, +.eq-ie8 .address-list-item-actions .action-delete, +.eq-ie8 .address-list-item-actions .action-delete:hover, +.eq-ie8 .address-list-item-actions .action-delete:active, +.eq-ie8 .address-list-item-actions .action-delete.active, +.eq-ie8 .notification .action-close, +.eq-ie8 .notification .action-close:hover, +.eq-ie8 .notification .action-close:active, +.eq-ie8 .notification .action-close.active, +.eq-ie8 .page-login .action-forgotpassword, +.eq-ie8 .page-login .action-forgotpassword:hover, +.eq-ie8 .page-login .action-forgotpassword:active, +.eq-ie8 .page-login .action-forgotpassword.active, +.eq-ie8 .page-login .action-back, +.eq-ie8 .page-login .action-back:hover, +.eq-ie8 .page-login .action-back:active, +.eq-ie8 .page-login .action-back.active { + border: none; + border-radius: 0; + background: none; + margin: 0; + padding: 0; + box-shadow: none; + text-shadow: none; + filter: none; +} +.eq-ie8 .actions-image-uploader .action-upload { + filter: none; +} +.eq-ie8 select[disabled="disabled"][multiple="multiple"] option[selected="selected"] { + background-color: #ddd; +} +.eq-ie8 .fieldset { + border-width: 0 0 1px; +} +.eq-ie8 .fieldset .fieldset-wrapper .fieldset-wrapper-title, +.eq-ie8 .fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title { + background: #f4f2ef; +} +.eq-ie8 .fieldset-alt, +.eq-ie8 .fieldset-alt > .fieldset { + display: block; + width: 100%; +} +.eq-ie8 .fieldset-alt > .field { + display: inline-block; +} +.eq-ie8 .field.type-price .addon .addafter, +.eq-ie8 .field-price .addon .addafter, +.eq-ie8 .field-special_price .addon .addafter, +.eq-ie8 .field-msrp .addon .addafter { + border-width: 1px 1px 1px 0; +} +.eq-ie8 .field-apply_to .multiselect { + height: 120px; +} +.eq-ie8 .popup-loading { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; +} +.eq-ie8 .loading-old, +.eq-ie8 .loading-mask { + background: #fff; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; +} +.eq-ie8 .navigation { + background: #726c62; +} +.eq-ie8 .navigation:before { + border-top: 1px solid #46433d; +} +.eq-ie8 .navigation .level-0.active > a { + background: #625d54; +} +.eq-ie8 .navigation .level-0.active > a, +.eq-ie8 .navigation .level-0:hover > a, +.eq-ie8 .navigation .level-0.hover > a { + border-top: 1px solid #46433d; + padding-top: 36px; +} +.eq-ie8 .navigation .level-0 > .submenu .column { + float: left; +} +.eq-ie8 .navigation .level-0.item-system > a, +.eq-ie8 .navigation .level-0.item-system:hover > a, +.eq-ie8 .navigation .level-0.item-system.hover > a, +.eq-ie8 .navigation .level-0.item-stores > a, +.eq-ie8 .navigation .level-0.item-stores:hover > a, +.eq-ie8 .navigation .level-0.item-stores.hover > a { + border-top: 0; + padding-top: 0; +} +.eq-ie8 .navigation .level-0.item-system > a:before, +.eq-ie8 .navigation .level-0.item-system > a:after, +.eq-ie8 .navigation .level-0.item-stores > a:before, +.eq-ie8 .navigation .level-0.item-stores > a:after { + display: none; +} +.eq-ie8 .page-login .field-username label, +.eq-ie8 .page-login .field-password label, +.eq-ie8 .page-login .field-confirmation label { + display: block; +} +.eq-ie8 .message-noscript, +.eq-ie8 .message-demo-mode { + border-bottom: 1px solid #46433d; +} +.eq-ie8 .store-switcher-alt .store-selected:after { + vertical-align: middle; +} +.eq-ie8 .store-switcher-website { + border-bottom: 0; +} +.eq-ie8 .store-switcher-store-view { + border-bottom: 0; + border-top: 1px solid #e5e5e5; +} +.eq-ie8 .switcher-label:after { + content: 'off'; + overflow: hidden; + white-space: nowrap; + text-indent: 100%; +} +.eq-ie8 .switcher.checked .switcher-label:after { + background-position: -34px 0; + content: 'on'; +} +.eq-ie8 .switcher.checked .switcher-label:before { + content: attr(data-text-on); +} +.eq-ie8 .grid table td.empty-text { + border-width: 0 1px 1px; +} +.eq-ie8 .grid table tr td.empty-text { + border-width: 0 1px 1px; +} +.eq-ie8 .grid .filter .date img { + filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0); +} +.eq-ie8 .massaction .entry-edit .field-row:first-child { + margin-right: 1px; +} +.eq-ie8 .massaction .entry-edit .field-row { + display: inline; +} +.eq-ie8 .data-table td, +.eq-ie8 .data-table tbody tr td { + border-width: 0 0 1px; +} +.eq-ie8 .data-table td > .field { + margin-bottom: 0; +} +.eq-ie8 .data-table tfoot tr td { + border: none; +} +.eq-ie8 .customer-information .data-table tbody tr td, +.eq-ie8 .customer-information .data-table tbody tr th, +.eq-ie8 .order-information .data-table tbody tr td, +.eq-ie8 .order-information .data-table tbody tr th, +.eq-ie8 .order-account-information .data-table tbody tr td, +.eq-ie8 .order-account-information .data-table tbody tr th, +.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr td, +.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr th, +.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr th, +.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr td, +.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr th, +.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr td, +.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr th, +.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr td { + border-bottom: 1px solid #ededed; +} +.eq-ie8 .widget-layout-updates .data-table { + table-layout: auto; +} +.eq-ie8 .massaction { + border-bottom: 2px solid #504d46; +} +.eq-ie8 .header { + background: #f5f2ea; +} +.eq-ie8 .header-panel .dropdown-menu { + border: 1px solid #c3bcaf; +} +.eq-ie8 .header-panel .notifications-icon:before { + bottom: -6px; +} +.eq-ie8 .header-panel .notifications > .dropdown-menu > li:hover { + margin-top: 0; + padding-top: 13px; +} +.eq-ie8 .header-panel .dropdown-menu > li:hover:after { + display: block; +} +.eq-ie8 .header-panel .notifications > .dropdown-menu .action-close { + filter: none; +} +.eq-ie8 .header .header-panel .notifications .action-more { + filter: none; +} +.eq-ie8 .header .header-panel .notifications .action-more { + margin-bottom: -1px; +} +.eq-ie8 .autocomplete-results { + margin-top: -10px; +} +.eq-ie8 .search button[type="submit"]:before { + line-height: 1.3; +} +.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back, +.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:hover, +.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:active, +.eq-ie8 [class^=" newsletter-"] .page-actions .action-back, +.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:hover, +.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:active { + filter: none; + border: 0; +} +.eq-ie8 .sales-order-index .col-1-layout table.data { + table-layout: auto; + word-wrap: normal; +} +.eq-ie8 .accordion .config legend { + position: absolute; + left: -999em; + display: block; + width: 0; + height: 0; + padding: 0; + margin: 0; + overflow: hidden; +} diff --git a/app/design/adminhtml/magento_backend/css/styles.css b/app/design/adminhtml/magento_backend/css/styles.css index 6c1cab91a97a8840f159beacd2de6253a3e027c2..3387b22a778b4450be0ff515708463636a5ffb44 100644 --- a/app/design/adminhtml/magento_backend/css/styles.css +++ b/app/design/adminhtml/magento_backend/css/styles.css @@ -9273,7 +9273,7 @@ tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-d padding: 0; } .overlay { - background: rgba(0, 0, 0, 0.3); + background: rgba(255, 255, 255, 0.5); border-radius: 5px; position: absolute; top: 0; @@ -9285,10 +9285,11 @@ tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-d color: #111; font-weight: bold; position: absolute; - top: 50%; - left: 50%; - margin: -25px 0 0 -100px; - width: 200px; + top: 56px; + left: 0; + margin: 0 8px; + padding: 10px; + background: #ffffff; } /* Order view @@ -10583,17 +10584,17 @@ ul.messages li.success-msg li:before { margin-top: 6px; } .accordion .config .value.with-tooltip .tooltip-content { - padding: 15px; + padding: 18px; + margin: 0 -17px 10px 0; right: 0; - margin-left: 0; - margin-right: -19px; - margin-bottom: 10px; - left: auto; - top: auto; bottom: 100%; - width: 400px; - max-width: 400px; - line-height: 1.333; + width: 239px; + max-width: 239px; + font-size: 13px; + line-height: 1.4; + background: #31302b; + background: rgba(49, 48, 43, 0.8); + border-radius: 5px; } .accordion .config .value.with-tooltip .tooltip-content:before { content: ''; @@ -10606,7 +10607,7 @@ ul.messages li.success-msg li:before { right: 20px; border-left: 5px solid transparent; border-right: 5px solid transparent; - border-top: 5px solid #000; + border-top: 5px solid #31302b; border-bottom: 0; opacity: .8; } diff --git a/app/design/adminhtml/magento_backend/less/lib/buttons.less b/app/design/adminhtml/magento_backend/less/lib/buttons.less index d6d4958cca97c42715b01df61ae1a1eca126b989..d8ddfec8ae45505ea14562c20f806f4903839fef 100644 --- a/app/design/adminhtml/magento_backend/less/lib/buttons.less +++ b/app/design/adminhtml/magento_backend/less/lib/buttons.less @@ -43,6 +43,7 @@ &:hover, &:focus, &:active { + text-decoration: none; background: @defaultButton4; color: @defaultButton3; } diff --git a/app/design/adminhtml/magento_backend/less/styles/admin.less b/app/design/adminhtml/magento_backend/less/styles/admin.less index 8a9e235e1fd42cca576af275accaf0e5344ed0e0..faa49622af006fc6cd5e4732a13d73c2c249f2d6 100644 --- a/app/design/adminhtml/magento_backend/less/styles/admin.less +++ b/app/design/adminhtml/magento_backend/less/styles/admin.less @@ -1,5 +1,5 @@ -// /** -// * Magento +/** + * Magento * * NOTICE OF LICENSE * @@ -16,10 +16,14 @@ * Do not edit or add to this file if you wish to upgrade Magento to newer * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. -// * -// * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) -// * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -// */ + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +@import "vars.less"; +@import "base.less"; +@import "../lib/buttons.less"; .dont-use-this-class-big-size { font-size: 18px; @@ -133,81 +137,6 @@ margin: 0 15px; } -.eq-ie8 .customer-current-activity .action-refresh, -.eq-ie8 .pager .action-next, -.eq-ie8 .pager .action-previous, -.eq-ie8 .pager .action-next:hover, -.eq-ie8 .pager .action-previous:hover, -.eq-ie8 .pager .action-next.disabled:focus, -.eq-ie8 .pager .action-previous.disabled:focus, -.eq-ie8 .pager .action-next.disabled:active, -.eq-ie8 .pager .action-previous.disabled:active, -.eq-ie8 .data-table .action-.delete, -.eq-ie8 .data-table .action-.delete:hover, -.eq-ie8 .data-table .action-.delete:active, -.eq-ie8 .data-table .action-.delete.active, -.eq-ie8 .data-table .action-delete, -.eq-ie8 .data-table .action-delete:hover, -.eq-ie8 .data-table .action-delete:active, -.eq-ie8 .data-table .action-delete.active, -.eq-ie8 .data-table .action-locked, -.eq-ie8 .data-table .action-locked:hover, -.eq-ie8 .data-table .action-locked:active, -.eq-ie8 .data-table .action-locked.active, -.eq-ie8 #product-variations-matrix .action-choose, -.eq-ie8 #product-variations-matrix .action-choose:hover, -.eq-ie8 #product-variations-matrix .action-choose:active, -.eq-ie8 #product-variations-matrix .action-choose.active, -.eq-ie8 .image-panel .action-close, -.eq-ie8 .eq-ie8 .image-panel .action-close:hover, -.eq-ie8 .image-panel .action-close:active, -.eq-ie8 .image-panel .action-close.active, -.eq-ie8 .image-panel-controls .action-remove, -.eq-ie8 .image-panel-controls .action-remove:hover, -.eq-ie8 .image-panel-controls .action-remove:active, -.eq-ie8 .image-panel-controls .action-remove.active, -.eq-ie8 .suggest-expandable .action-show-all, -.eq-ie8 .suggest-expandable .action-show-all:hover, -.eq-ie8 .suggest-expandable .action-show-all:active, -.eq-ie8 .suggest-expandable .action-show-all.active, -.eq-ie8 .vde-tools-header .action-close, -.eq-ie8 .vde-tools-header .action-close:hover, -.eq-ie8 .vde-tools-header .action-close:active, -.eq-ie8 .vde-tools-header .action-close.active, -.eq-ie8 .image .action-delete, -.eq-ie8 .image .action-delete:hover, -.eq-ie8 .image .action-delete:active, -.eq-ie8 .image .action-delete.active, -.eq-ie8 .fieldset-wrapper-title .actions .action-delete, -.eq-ie8 .fieldset-wrapper-title .actions .action-delete:hover, -.eq-ie8 .fieldset-wrapper-title .actions .action-delete:active, -.eq-ie8 .fieldset-wrapper-title .actions .action-delete.active, -.eq-ie8 .address-list-item-actions .action-delete, -.eq-ie8 .address-list-item-actions .action-delete:hover, -.eq-ie8 .address-list-item-actions .action-delete:active, -.eq-ie8 .address-list-item-actions .action-delete.active, -.eq-ie8 .notification .action-close, -.eq-ie8 .notification .action-close:hover, -.eq-ie8 .notification .action-close:active, -.eq-ie8 .notification .action-close.active, -.eq-ie8 .page-login .action-forgotpassword, -.eq-ie8 .page-login .action-forgotpassword:hover, -.eq-ie8 .page-login .action-forgotpassword:active, -.eq-ie8 .page-login .action-forgotpassword.active, -.eq-ie8 .page-login .action-back, -.eq-ie8 .page-login .action-back:hover, -.eq-ie8 .page-login .action-back:active, -.eq-ie8 .page-login .action-back.active { - border: none; - border-radius: 0; - background: none; - margin: 0; - padding: 0; - box-shadow: none; - text-shadow: none; - filter: none; -} - .data-table .action-.delete[disabled], .data-table .action-delete[disabled], .data-table .action-locked[disabled], @@ -779,10 +708,6 @@ height: 31px; } -.eq-ie8 .actions-image-uploader .action-upload { - filter: none; -} - .actions-image-uploader .action-toggle, .actions-image-uploader .action-toggle:hover, .actions-image-uploader .action-toggle:active, @@ -1033,10 +958,6 @@ select[disabled].multiselect > option[selected] { background: #6d6d6d; } -.eq-ie8 select[disabled="disabled"][multiple="multiple"] option[selected="selected"] { - background-color: #ddd; -} - textarea:-moz-placeholder, input:-moz-placeholder { color: #999 !important; @@ -1208,10 +1129,6 @@ input.mage-error ~ .addafter { position: relative; } -.eq-ie8 .fieldset { - border-width: 0 0 1px; -} - .fieldset-wrapper > .fieldset-wrapper-title, .fieldset > .legend { position: static; @@ -1304,11 +1221,6 @@ input.mage-error ~ .addafter { border-radius: 5px; } -.eq-ie8 .fieldset .fieldset-wrapper .fieldset-wrapper-title, -.eq-ie8 .fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title { - background: #f4f2ef; -} - .fieldset .fieldset-wrapper.opened .fieldset-wrapper-title, .fieldset-wrapper .fieldset-wrapper.opened .fieldset-wrapper-title { border-radius: 5px 5px 0 0; @@ -1396,16 +1308,6 @@ input.mage-error ~ .addafter { margin: 0 0 29px; } -.eq-ie8 .fieldset-alt, -.eq-ie8 .fieldset-alt > .fieldset { - display: block; - width: 100%; -} - -.eq-ie8 .fieldset-alt > .field { - display: inline-block; -} - .fieldset .comment { margin: 0 0 29px 10px; } @@ -1712,13 +1614,6 @@ input.mage-error ~ .addafter { border-radius: 0 4px 4px 0; } -.eq-ie8 .field.type-price .addon .addafter, -.eq-ie8 .field-price .addon .addafter, -.eq-ie8 .field-special_price .addon .addafter, -.eq-ie8 .field-msrp .addon .addafter { - border-width: 1px 1px 1px 0; -} - .field.type-price input, .field-price input, .field-special_price input, @@ -1749,10 +1644,6 @@ input.mage-error ~ .addafter { margin-right: -2px; } -.eq-ie8 .field-apply_to .multiselect { - height: 120px; -} - /* Calendar -------------------------------------- */ @@ -2153,10 +2044,6 @@ table tbody tr:nth-child(odd):hover th { z-index: 2; } -.eq-ie8 .popup-loading { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; -} - /* Loading mask */ .loading-old, .loading-mask { @@ -2201,18 +2088,6 @@ table tbody tr:nth-child(odd):hover th { margin-top: 118px; } -.eq-ie8 .loading-old, -.eq-ie8 .loading-mask { - background: #fff; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; -} - -/* Backup popup */ -/* TODO: remove after backups page js refactoring */ -.backup-dialog { - margin-top: inherit !important; -} - /* Backup popup */ /* TODO: remove after backups page js refactoring */ .backup-dialog { @@ -2237,14 +2112,6 @@ table tbody tr:nth-child(odd):hover th { padding: 0 20px; } -.navigation:hover .level-0 > a { - /*background: red !important;*/ -} - -.eq-ie8 .navigation { - background: #726c62; -} - .navigation:before { position: absolute; left: 0; @@ -2256,10 +2123,6 @@ table tbody tr:nth-child(odd):hover th { z-index: 991; } -.eq-ie8 .navigation:before { - border-top: 1px solid #46433d; -} - .navigation:after { position: absolute; left: 0; @@ -2351,12 +2214,7 @@ table tbody tr:nth-child(odd):hover th { background: linear-gradient(to bottom, #625d54 1%, #565249 100%); } -.eq-ie8 .navigation .level-0.active > a { - background: #625d54; -} - -/*.navigation .level-0:hover > a, -.eq-ie8 .navigation .level-0:hover > a,*/ +//.navigation .level-0:hover > a, .navigation .level-0.hover.recent > a { background: #fff; .style15I(); @@ -2383,13 +2241,6 @@ table tbody tr:nth-child(odd):hover th { display: block; } -.eq-ie8 .navigation .level-0.active > a, -.eq-ie8 .navigation .level-0:hover > a, -.eq-ie8 .navigation .level-0.hover > a { - border-top: 1px solid #46433d; - padding-top: 36px; -} - .navigation .level-0 > a:before { position: absolute; left: 0; @@ -2481,10 +2332,6 @@ table tbody tr:nth-child(odd):hover th { vertical-align: top; } -.eq-ie8 .navigation .level-0 > .submenu .column { - float: left; -} - .navigation .level-0 .submenu .level-1 { white-space: normal; } @@ -2543,16 +2390,6 @@ table tbody tr:nth-child(odd):hover th { padding: 0; } -.eq-ie8 .navigation .level-0.item-system > a, -.eq-ie8 .navigation .level-0.item-system:hover > a, -.eq-ie8 .navigation .level-0.item-system.hover > a, -.eq-ie8 .navigation .level-0.item-stores > a, -.eq-ie8 .navigation .level-0.item-stores:hover > a, -.eq-ie8 .navigation .level-0.item-stores.hover > a { - border-top: 0; - padding-top: 0; -} - .navigation .level-0.item-system:hover > a, .navigation .level-0.item-system.hover > a, .navigation .level-0.item-stores:hover > a, @@ -2608,11 +2445,7 @@ table tbody tr:nth-child(odd):hover th { } .no-js .navigation .level-0.last:hover > a:before, -.navigation .level-0.last.hover > a:before, -.eq-ie8 .navigation .level-0.item-system > a:before, -.eq-ie8 .navigation .level-0.item-system > a:after, -.eq-ie8 .navigation .level-0.item-stores > a:before, -.eq-ie8 .navigation .level-0.item-stores > a:after { +.navigation .level-0.last.hover > a:before { display: none; } @@ -2805,12 +2638,6 @@ table tbody tr:nth-child(odd):hover th { display: none; } -.eq-ie8 .page-login .field-username label, -.eq-ie8 .page-login .field-password label, -.eq-ie8 .page-login .field-confirmation label { - display: block; -} - .page-login .form-inline .label + .control { width: auto; float: none; @@ -2832,55 +2659,56 @@ table tbody tr:nth-child(odd):hover th { background: url(Magento_Backend::images/logo-magento.png) no-repeat; } -/* -.page-login .logo { - display: block; - width: 100px; - height: 65px; - margin: 0; - text-indent: -999em; - position: relative; - z-index: 1; -} - -.page-login .logo:before, -.page-login .logo:after { - font-family: 'admin-icons'; - font-size: 65px; - content: '\e00d'; - position: absolute; - bottom: 0; - left: 0; - text-indent: 0; - line-height: 1; - font-weight: normal; -} - -.page-login .logo:before { - content: '\e00d'; - color: #f37b20; -} - -.page-login .logo:after { - content: '\e00e'; - color: #fab57f; -} - -.page-login .logo span:before { - font-family: 'admin-icons'; - content: '\e00f'; - display: block; - position: absolute; - top: 0; - bottom: 0; - left: 70px; - font-size: 154px; - margin-top: -42px; - text-indent: 0; - line-height: 1; - font-weight: normal; - color: #000; -}*/ +///* +//.page-login .logo { +// display: block; +// width: 100px; +// height: 65px; +// margin: 0; +// text-indent: -999em; +// position: relative; +// z-index: 1; +//} +// +//.page-login .logo:before, +//.page-login .logo:after { +// font-family: 'admin-icons'; +// font-size: 65px; +// content: '\e00d'; +// position: absolute; +// bottom: 0; +// left: 0; +// text-indent: 0; +// line-height: 1; +// font-weight: normal; +//} +// +//.page-login .logo:before { +// content: '\e00d'; +// color: #f37b20; +//} +// +//.page-login .logo:after { +// content: '\e00e'; +// color: #fab57f; +//} +// +//.page-login .logo span:before { +// font-family: 'admin-icons'; +// content: '\e00f'; +// display: block; +// position: absolute; +// top: 0; +// bottom: 0; +// left: 70px; +// font-size: 154px; +// margin-top: -42px; +// text-indent: 0; +// line-height: 1; +// font-weight: normal; +// color: #000; +//} +//*/ .page-login .form-actions { padding: 0; @@ -3068,10 +2896,6 @@ table tbody tr:nth-child(odd):hover th { z-index: 994; } -.eq-ie8 .message-noscript { - border-bottom: 1px solid #46433d; -} - .message-noscript .message-content { margin: 0 auto; max-width: 1300px; @@ -3113,10 +2937,6 @@ table tbody tr:nth-child(odd):hover th { z-index: 993; } -.eq-ie8 .message-demo-mode { - border-bottom: 1px solid #46433d; -} - .message-demo-mode:before { content: ''; } @@ -3232,14 +3052,9 @@ table tbody tr:nth-child(odd):hover th { vertical-align: text-top; } -.eq-ie8 .store-switcher-alt .store-selected:after { - vertical-align: middle; -} - .store-switcher-alt .store-switcher-website, .store-switcher-alt .store-switcher-store { padding: 0; - } .store-switcher-alt .store-switcher-website:hover, @@ -3275,15 +3090,6 @@ table tbody tr:nth-child(odd):hover th { border-top: 1px solid #e5e5e5; } -.eq-ie8 .store-switcher-website { - border-bottom: 0; -} - -.eq-ie8 .store-switcher-store-view { - border-bottom: 0; - border-top: 1px solid #e5e5e5; -} - .store-switcher-store-view > a { display: block; padding: 5px 15px 5px 24px; @@ -3492,7 +3298,7 @@ table tbody tr:nth-child(odd):hover th { /* Universal Sidebar Tabs -------------------------------------- */ -/* TODO: for "Product" page only while refactoring */ +// TODO: for "Product" page only while refactoring */ .side-col .ui-tabs .ui-accordion-header { position: relative; @@ -3821,22 +3627,6 @@ table tbody tr:nth-child(odd):hover th { content: attr(data-text-on); } -.eq-ie8 .switcher-label:after { - content: 'off'; - overflow: hidden; - white-space: nowrap; - text-indent: 100%; -} - -.eq-ie8 .switcher.checked .switcher-label:after { - background-position: -34px 0; - content: 'on'; -} - -.eq-ie8 .switcher.checked .switcher-label:before { - content: attr(data-text-on); -} - /* Content actions panel (with buttons, switchers...) -------------------------------------- */ @@ -4004,19 +3794,10 @@ table tbody tr:nth-child(odd):hover th { text-align: center; padding: 15px; } - -.eq-ie8 .grid table td.empty-text { - border-width: 0 1px 1px; -} - .grid table tr:last-child td.empty-text { border-width: 0 1px 1px; } -.eq-ie8 .grid table tr td.empty-text { - border-width: 0 1px 1px; -} - .grid table td.empty-text:hover { background: #e6e3de; } @@ -4381,10 +4162,6 @@ table tbody tr:nth-child(odd):hover th { opacity: 0; } -.eq-ie8 .grid .filter .date img { - filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0); -} - .grid .filter .date:before { position: absolute; left: 80%; @@ -4418,10 +4195,6 @@ table tbody tr:nth-child(odd):hover th { overflow: hidden; } -.eq-ie8 .massaction { - border-bottom: 2px solid #504d46; -} - .massaction ul { list-style: none; margin: 0; @@ -4470,14 +4243,6 @@ table tbody tr:nth-child(odd):hover th { vertical-align: middle; } -.eq-ie8 .massaction .entry-edit .field-row:first-child { - margin-right: 1px; -} - -.eq-ie8 .massaction .entry-edit .field-row { - display: inline; -} - .massaction .entry-edit .outer-span .entry-edit { float: none; } @@ -4610,48 +4375,48 @@ tr.dynamic-grid input.input-text { white-space: normal; } -/* will be deleted after checking entire back-end -table .col-draggable { - width: 1%; -} - -table .col-default, -table .col-select, -table .col-qty, -table .col-actions, -table .col-action, -table .col-id, -table .col-uqty.qty-box { - width: 5%; -} - -table .col-visibility, -table .col-status, -table .col-websites, -table .col-position { - width: 7%; -} - -table .col-type, -table .col-price, -table .col-attr-name { - width: 8%; -} - -table .col-name, -table .col-sku { - width: 15%; -} - -table .col-attribute_code, -table .col-frontend_label { - width: 25%; -} - -.ui-dialog .selection-search table .col-select { - width: 25%; -} -*/ +///* will be deleted after checking entire back-end +//table .col-draggable { +// width: 1%; +//} +// +//table .col-default, +//table .col-select, +//table .col-qty, +//table .col-actions, +//table .col-action, +//table .col-id, +//table .col-uqty.qty-box { +// width: 5%; +//} +// +//table .col-visibility, +//table .col-status, +//table .col-websites, +//table .col-position { +// width: 7%; +//} +// +//table .col-type, +//table .col-price, +//table .col-attr-name { +// width: 8%; +//} +// +//table .col-name, +//table .col-sku { +// width: 15%; +//} +// +//table .col-attribute_code, +//table .col-frontend_label { +// width: 25%; +//} +// +//.ui-dialog .selection-search table .col-select { +// width: 25%; +//} +//*/ table .col-draggable .draggable-handle { position: relative; @@ -4697,15 +4462,6 @@ table .col-draggable .draggable-handle { border-width: 0 0 1px; } -.eq-ie8 .data-table td, -.eq-ie8 .data-table tbody tr td { - border-width: 0 0 1px; -} - -.eq-ie8 .data-table td > .field { - margin-bottom: 0; -} - .data-table tbody tr.selected td, .data-table tbody tr.selected th, .data-table tbody tr:hover td, @@ -4729,10 +4485,6 @@ table .col-draggable .draggable-handle { border: 0; } -.eq-ie8 .data-table tfoot tr td { - border: none; -} - .data-table input[type="text"] { width: 98%; padding-left: 1%; @@ -4866,23 +4618,6 @@ table .col-draggable .draggable-handle { background-color: #fbfaf6; } -.eq-ie8 .customer-information .data-table tbody tr td, -.eq-ie8 .customer-information .data-table tbody tr th, -.eq-ie8 .order-information .data-table tbody tr td, -.eq-ie8 .order-information .data-table tbody tr th, -.eq-ie8 .order-account-information .data-table tbody tr td, -.eq-ie8 .order-account-information .data-table tbody tr th, -.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr td, -.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr th, -.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr th, -.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr td, -.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr th, -.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr td, -.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr th, -.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr td { - border-bottom: 1px solid #ededed; -} - /* Content alignments in tables -------------------------------------- */ @@ -5203,10 +4938,6 @@ table .col-draggable .draggable-handle { table-layout: fixed; } -.eq-ie8 .widget-layout-updates .data-table { - table-layout: auto; -} - .widget-layout-updates .data-table, .widget-layout-updates .data-table tr:nth-child(odd) td, .widget-layout-updates .data-table tr:nth-child(odd):hover td { diff --git a/app/design/adminhtml/magento_backend/less/styles/base.less b/app/design/adminhtml/magento_backend/less/styles/base.less index 8d3b401d83d648a39407ad5ecb53943f3fa62dce..a46576eb670fc0133506261cc95cfca684af186a 100644 --- a/app/design/adminhtml/magento_backend/less/styles/base.less +++ b/app/design/adminhtml/magento_backend/less/styles/base.less @@ -21,253 +21,6 @@ // * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) // */ -.actionLink() { - display: inline; - color: @linkColor; - text-decoration: none; - &:visited, - &:active { - color: @linkColor; - } - &:focus, - &:hover { - color: @linkColor; - text-decoration: underline; - } -} - -.actionLinkI() { - display: inline; - color: @linkColor2; - text-decoration: underline; - &:visited, - &:active { - color: @linkColor2; - } - &:focus, - &:hover { - color: @linkColor2; - text-decoration: underline; - } -} - -.style1() { // absent in design -} - -.style2 { - color: @primary1; - font-size: 13px; - font-weight: @baseFontWeightSemibold; -} - -.style3() { - color: @primary5; - font-size: 14px; - font-weight: @baseFontWeight; - - &:focus, - &:hover { - text-decoration: underline; - } -} - -.style4() { // absent in design -} - -.style5() { // absent in design -} - -.style6() { - color: @primary5; - font-size: 13px; - font-weight: @baseFontWeight; - - &:focus, - &:hover { - text-decoration: underline; - } -} - -.style7() { - color: @primary1; - font-size: 16px; - font-weight: @baseFontWeight; -} - -.style8() { - color: @primary6; - font-size: 13px; - font-weight: @baseFontWeight; -} - -.style9() { - color: @primary1; - font-size: 14px; - font-weight: @baseFontWeight; -} - -.style10() { - color: @primary1; - font-size: 20px; - font-weight: @baseFontWeight; -} - -.style11() { // absent in design -} - -.style12() { // absent in design -} - -.style13() { // absent in design -} - -.style14() { - color: @primary1; - font-size: 11px; - font-weight: @baseFontWeight; -} - -.style15() { - color: @primary7; - font-size: 13px; - font-weight: @baseFontWeight; -} - -.style15I() { - color: @primary1; - font-size: 13px; - font-weight: @baseFontWeight; -} - -.style16() { - color: @primary4; - font-size: 12px; - font-weight: @baseFontWeightSemibold; -} - -.style17() { // absent in design -} - -.style18() { - color: @primary1; - font-size: 13px; - font-weight: @baseFontWeight; -} - -.style19() { - color: @primary1; - font-size: 12px; - font-weight: @baseFontWeight; -} - -.style20() { // absent in design - color: @primary2; - font-size: 12px; - font-weight: @baseFontWeightSemibold; -} - -.style21() { // absent in design - color: @primary1; - font-size: 11px; - font-weight: @baseFontWeight; -} - -.style22() { - color: @primary5; - font-size: 12px; - font-weight: @baseFontWeight; - &:focus, - &:hover { - text-decoration: underline; - } -} - -.style23() { - color: @primary1; - font-size: 28px; - font-weight: @baseFontWeight; -} - -.style24() { // absent in design - color: @primary1; - font-size: 12px; - font-weight: @baseFontWeight; -} - -.style25() { // absent in design - color: @primary8; - font-size: 14px; - font-weight: @baseFontWeight; - &:focus, - &:hover { - text-decoration: underline; - } -} - -.style26() { // absent in design - color: @primary4; - font-size: 30px; - font-weight: @baseFontWeightBold; -} - -.style27() { // absent in design - color: @primary9; - font-size: 20px; - font-weight: @baseFontWeightBold; -} - -.style28() { - color: @primary1; - font-size: 14px; - font-weight: @baseFontWeightBold; -} - -.style29() { - color: @primary4; - font-size: 13px; - font-weight: @baseFontWeightBold; -} - -.style30() { - color: @primary1; - font-size: 14px; - font-weight: @baseFontWeightSemibold; -} - -.style31() { - color: @primary1; - font-size: 20px; - font-style: italic; - font-weight: @baseFontWeight; -} - -.style32() { - color: @primary6; - font-size: 14px; - font-weight: @baseFontWeightBold; -} - -.style33() { - color: @primary3; - font-size: 12px; - font-weight: @baseFontWeightSemibold; - - &:focus, - &:hover { - text-decoration: underline; - } -} - -.style34() { // no such html yet - color: @primary2; - font-size: 12px; - font-weight: @baseFontWeight; - &:focus, - &:hover { - text-decoration: underline; - } -} - // Fonts @font-face { @@ -289,28 +42,28 @@ /* @import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,400,600,700 <http://fonts.googleapis.com/css?family=Open+Sans:400italic%2c400%2c600%2c700>); */ @font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans'), local('OpenSans'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff'); + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans'), local('OpenSans'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff'); } @font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/MTP_ySUJH_bn48VBG8sNSnhCUOGz7vYGh680lGh-uXM.woff) format('woff'); + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/MTP_ySUJH_bn48VBG8sNSnhCUOGz7vYGh680lGh-uXM.woff) format('woff'); } @font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 700; - src: local('Open Sans Bold'), local('OpenSans-Bold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woff) format('woff'); + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woff) format('woff'); } @font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - src: local('Open Sans Italic'), local('OpenSans-Italic'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/xjAJXh38I15wypJXxuGMBobN6UDyHWBl620a-IRfuBk.woff) format('woff'); + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/xjAJXh38I15wypJXxuGMBobN6UDyHWBl620a-IRfuBk.woff) format('woff'); } // Base @@ -364,4 +117,4 @@ h6 { a { .actionLink(); -} \ No newline at end of file +} diff --git a/app/design/adminhtml/magento_backend/less/styles/debug.less b/app/design/adminhtml/magento_backend/less/styles/debug.less index 276e70485ad7550ddd2213d364fdd5c937afaf6e..5ed22427aee0823613461a3c9218d56a00c1758e 100644 --- a/app/design/adminhtml/magento_backend/less/styles/debug.less +++ b/app/design/adminhtml/magento_backend/less/styles/debug.less @@ -21,28 +21,28 @@ // * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) // */ -/* - This file was created to debug old classes in order to indicate where we must replase it with new ones - The types of messages are generated in file: \app\code\core\Mage\Core\Block\Messages.php like $html .= '<' . $this->_messagesSecondLevelTagName . ' class="' . $type . '-msg">'; --------------------------------------- */ - -/* - All messages to identify and refactor: - -label.mage-error, -.notice, -.messages ul, -.messages li, -.messages ul li, -.error-msg, -.success-msg, -.notice-msg, -.warning-msg - -Done: -.notification-global -.notification-global-notice --------------------------------------- */ +///* +// This file was created to debug old classes in order to indicate where we must replase it with new ones +// The types of messages are generated in file: \app\code\core\Mage\Core\Block\Messages.php like $html .= '<' . $this->_messagesSecondLevelTagName . ' class="' . $type . '-msg">'; +//-------------------------------------- */ + +///* +// All messages to identify and refactor: +// +//label.mage-error, +//.notice, +//.messages ul, +//.messages li, +//.messages ul li, +//.error-msg, +//.success-msg, +//.notice-msg, +//.warning-msg +// +//Done: +//.notification-global +//.notification-global-notice +//-------------------------------------- */ .debug { border: 1px solid red !important; } @@ -413,17 +413,6 @@ ul.messages li.success-msg li:before { display: none; } -.eq-ie8 .accordion .config legend { - position: absolute; - left: -999em; - display: block; - width: 0; - height: 0; - padding: 0; - margin: 0; - overflow: hidden; -} - .accordion .config table { width: 100%; } @@ -502,17 +491,17 @@ ul.messages li.success-msg li:before { margin-top:6px; } .accordion .config .value.with-tooltip .tooltip-content { - padding:15px; - right:0; - margin-left:0; - margin-right:-19px; - margin-bottom:10px; - left:auto; - top:auto; - bottom:100%; - width: 400px; - max-width: 400px; - line-height: 1.333; + padding: 18px; + margin: 0 -17px 10px 0; + right: 0; + bottom: 100%; + width: 239px; + max-width: 239px; + font-size: 13px; + line-height: 1.4; + background: #31302b; + background: rgba(49, 48, 43, .8); + border-radius: 5px; } .accordion .config .value.with-tooltip .tooltip-content:before { content: ''; @@ -525,7 +514,7 @@ ul.messages li.success-msg li:before { right: 20px; border-left: 5px solid transparent; border-right: 5px solid transparent; - border-top: 5px solid #000; + border-top: 5px solid #31302b; border-bottom:0; opacity: .8; } diff --git a/app/design/adminhtml/magento_backend/less/styles/header.less b/app/design/adminhtml/magento_backend/less/styles/header.less index 57b2ac82e0345bf2f888a1556c6e88a20a9b4e7e..b9352175bff1f1480e49c60857b81aba18ecbf22 100644 --- a/app/design/adminhtml/magento_backend/less/styles/header.less +++ b/app/design/adminhtml/magento_backend/less/styles/header.less @@ -1,5 +1,5 @@ -// /** -// * Magento +/** + * Magento * * NOTICE OF LICENSE * @@ -16,11 +16,12 @@ * Do not edit or add to this file if you wish to upgrade Magento to newer * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. -// * -// * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) -// * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -// */ + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +@import "vars.less"; /* Header -------------------------------------- */ @@ -38,10 +39,6 @@ padding: 0 20px; } -.eq-ie8 .header { - background: #f5f2ea; -} - .header-inner { min-width: 960px; max-width: 1300px; @@ -57,55 +54,56 @@ background: url(Magento_Backend::images/logo-magento-small.png) no-repeat; margin: 0; } -/* -.header .logo { - display: inline-block; - width: 100px; - height: 27px; - margin: 0; - text-indent: -999em; - position: relative; - z-index: 1; -} - -.header .logo:before, -.header .logo:after { - font-family: 'admin-icons'; - font-size: 26px; - content: '\e00d'; - position: absolute; - bottom: 0; - left: 0; - text-indent: 0; - line-height: 1; - font-weight: normal; -} - -.header .logo:before { - content: '\e00d'; - color: #f37b20; -} - -.header .logo:after { - content: '\e00e'; - color: #fab57f; -} - -.header .logo span:before { - font-family: 'admin-icons'; - content: '\e00f'; - display: block; - position: absolute; - top: 0; - bottom: 0; - left: 28px; - font-size: 65px; - margin-top: -17px; - text-indent: 0; - line-height: 1; - font-weight: normal; - color: #000; -}*/ +// /* +//.header .logo { +// display: inline-block; +// width: 100px; +// height: 27px; +// margin: 0; +// text-indent: -999em; +// position: relative; +// z-index: 1; +//} +// +//.header .logo:before, +//.header .logo:after { +// font-family: 'admin-icons'; +// font-size: 26px; +// content: '\e00d'; +// position: absolute; +// bottom: 0; +// left: 0; +// text-indent: 0; +// line-height: 1; +// font-weight: normal; +//} +// +//.header .logo:before { +// content: '\e00d'; +// color: #f37b20; +//} +// +//.header .logo:after { +// content: '\e00e'; +// color: #fab57f; +//} +// +//.header .logo span:before { +// font-family: 'admin-icons'; +// content: '\e00f'; +// display: block; +// position: absolute; +// top: 0; +// bottom: 0; +// left: 28px; +// font-size: 65px; +// margin-top: -17px; +// text-indent: 0; +// line-height: 1; +// font-weight: normal; +// color: #000; +//} +// */ .header-panel { float: right; @@ -128,10 +126,6 @@ box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2); } -.eq-ie8 .header-panel .dropdown-menu { - border: 1px solid #c3bcaf; -} - .header-panel .dropdown-menu > li { position: relative; padding: 20px 30px 13px 18px; @@ -299,10 +293,6 @@ color: #b0a798; } -.eq-ie8 .header-panel .notifications-icon:before { - bottom: -6px; -} - .header-panel .notifications .value { .style16(); line-height: 11px; @@ -577,7 +567,7 @@ padding-top: 14px; z-index: 2; } -.eq-ie8 .header-panel .notifications > .dropdown-menu > li:hover, + .header-panel .notifications > .dropdown-menu > li:first-child:hover, .header-panel .notifications > .dropdown-menu > li.first:hover, .header-panel .notifications > .dropdown-menu > li:last-child:hover, @@ -590,10 +580,6 @@ display: none; } -.eq-ie8 .header-panel .dropdown-menu > li:hover:after { - display: block; -} - .header-panel .notifications > .dropdown-menu > li:hover .action-close { display: block; } @@ -659,9 +645,6 @@ text-indent: 0; } -.eq-ie8 .header-panel .notifications > .dropdown-menu .action-close { - filter: none; -} .header .header-panel .notifications .dropdown-menu > li.last { padding: 0; @@ -682,18 +665,10 @@ margin: 0; } -.eq-ie8 .header .header-panel .notifications .action-more { - filter: none; -} - .header .header-panel .notifications .action-more:hover { text-decoration: none; } -.eq-ie8 .header .header-panel .notifications .action-more { - margin-bottom: -1px; -} - /* Help -------------------------------------- */ @@ -756,14 +731,10 @@ } .autocomplete-results { - left: 0 !important; /* TODO: Because of script bug in IE9 */ + left: 0 !important; // TODO: Because of script bug in IE9 right: 0; } -.eq-ie8 .autocomplete-results { - margin-top: -10px; -} - .autocomplete-results .title { display: block; } @@ -835,10 +806,6 @@ text-align: center; } -.eq-ie8 .search button[type="submit"]:before { - line-height: 1.3; -} - /* Clearfix -------------------------------------- */ diff --git a/app/design/adminhtml/magento_backend/less/styles/pages.less b/app/design/adminhtml/magento_backend/less/styles/pages.less index 55d29b75e6d47a993b9c8042a67781f167c4b620..06197eccfadf5f0ba4efe63a7522fea78bd74291 100644 --- a/app/design/adminhtml/magento_backend/less/styles/pages.less +++ b/app/design/adminhtml/magento_backend/less/styles/pages.less @@ -1,5 +1,5 @@ -// /** -// * Magento +/** + * Magento * * NOTICE OF LICENSE * @@ -16,10 +16,12 @@ * Do not edit or add to this file if you wish to upgrade Magento to newer * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. -// * -// * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) -// * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) -// */ + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +@import "vars.less"; /* Product Creation @@ -38,12 +40,6 @@ color: #7a7976; } -.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back, -.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:hover, -.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:active, -.eq-ie8 [class^=" newsletter-"] .page-actions .action-back, -.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:hover, -.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:active, .sales-order-create-index .page-actions-inner .cancel, .sales-order-create-index .page-actions-inner .cancel:hover, .sales-order-create-index .page-actions-inner .cancel:active { @@ -103,9 +99,20 @@ width: 100%; } +#tab_content_downloadableInfo .data-table td { + vertical-align: top; + .row { + margin-bottom: 10px; + } +} + /* Customer ---------------------------------------*/ +.customer-index-edit .grid tr.headings th > span { + white-space: normal; +} + #customer_info_tabs_account_content #_accountsendemail { margin-top: 8px; } @@ -464,6 +471,7 @@ #export_filter_grid .grid select { margin-bottom: 0; + width: 86%; } #export_filter_grid .grid table td:first-child, @@ -1619,6 +1627,17 @@ } } } + .order-billing-method { + .payment-methods { + .fieldset { + padding: 0; + margin: 0; + .field { + margin: 0 0 12px 0; + } + } + } + } } .tax.summary-total .summary-collapse { @@ -1756,23 +1775,24 @@ tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-d } .overlay { - background: rgba(0, 0, 0, .3); + background: rgba(255, 255, 255, .5); border-radius: 5px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; -} -.overlay span { - color: #111; - font-weight: bold; - position: absolute; - top: 50%; - left: 50%; - margin: -25px 0 0 -100px; - width: 200px; + span { + color: #111; + font-weight: bold; + position: absolute; + top: 56px; + left: 0; + margin: 0 8px; + padding: 10px; + background: #ffffff; + } } /* @@ -2017,11 +2037,6 @@ tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-d word-wrap: break-word; } -.eq-ie8 .sales-order-index .col-1-layout table.data { - table-layout: auto; - word-wrap: normal; -} - [class^=" sales-"] .col-from-store { width: 15%; } @@ -2797,7 +2812,9 @@ table.items-to-invoice tbody tr:hover td { .tax-rate-popup .field:before, .tax-rate-popup .field:after, .clearfix:before, -.clearfix:after { +.clearfix:after, +#tab_content_downloadableInfo .data-table td .row:before, +#tab_content_downloadableInfo .data-table td .row:after { content: ""; display: table; } @@ -2806,6 +2823,9 @@ table.items-to-invoice tbody tr:hover td { .image-panel:after, .images:after, .tax-rate-popup .field:after, -.clearfix:after { +.clearfix:after, +#tab_content_downloadableInfo .data-table td .row:after { clear: both; } + +@import "debug.less"; diff --git a/app/design/adminhtml/magento_backend/less/styles/styles-ie8.less b/app/design/adminhtml/magento_backend/less/styles/styles-ie8.less new file mode 100644 index 0000000000000000000000000000000000000000..dd8d4c7f517ffb6d1646d30fe3e55f7d4ca1474c --- /dev/null +++ b/app/design/adminhtml/magento_backend/less/styles/styles-ie8.less @@ -0,0 +1,372 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +// Reset 'button view' for actions +.eq-ie8 .customer-current-activity .action-refresh, +.eq-ie8 .pager .action-next, +.eq-ie8 .pager .action-previous, +.eq-ie8 .pager .action-next:hover, +.eq-ie8 .pager .action-previous:hover, +.eq-ie8 .pager .action-next.disabled:focus, +.eq-ie8 .pager .action-previous.disabled:focus, +.eq-ie8 .pager .action-next.disabled:active, +.eq-ie8 .pager .action-previous.disabled:active, +.eq-ie8 .data-table .action-.delete, +.eq-ie8 .data-table .action-.delete:hover, +.eq-ie8 .data-table .action-.delete:active, +.eq-ie8 .data-table .action-.delete.active, +.eq-ie8 .data-table .action-delete, +.eq-ie8 .data-table .action-delete:hover, +.eq-ie8 .data-table .action-delete:active, +.eq-ie8 .data-table .action-delete.active, +.eq-ie8 .data-table .action-locked, +.eq-ie8 .data-table .action-locked:hover, +.eq-ie8 .data-table .action-locked:active, +.eq-ie8 .data-table .action-locked.active, +.eq-ie8 #product-variations-matrix .action-choose, +.eq-ie8 #product-variations-matrix .action-choose:hover, +.eq-ie8 #product-variations-matrix .action-choose:active, +.eq-ie8 #product-variations-matrix .action-choose.active, +.eq-ie8 .image-panel .action-close, +.eq-ie8 .eq-ie8 .image-panel .action-close:hover, +.eq-ie8 .image-panel .action-close:active, +.eq-ie8 .image-panel .action-close.active, +.eq-ie8 .image-panel-controls .action-remove, +.eq-ie8 .image-panel-controls .action-remove:hover, +.eq-ie8 .image-panel-controls .action-remove:active, +.eq-ie8 .image-panel-controls .action-remove.active, +.eq-ie8 .suggest-expandable .action-show-all, +.eq-ie8 .suggest-expandable .action-show-all:hover, +.eq-ie8 .suggest-expandable .action-show-all:active, +.eq-ie8 .suggest-expandable .action-show-all.active, +.eq-ie8 .vde-tools-header .action-close, +.eq-ie8 .vde-tools-header .action-close:hover, +.eq-ie8 .vde-tools-header .action-close:active, +.eq-ie8 .vde-tools-header .action-close.active, +.eq-ie8 .image .action-delete, +.eq-ie8 .image .action-delete:hover, +.eq-ie8 .image .action-delete:active, +.eq-ie8 .image .action-delete.active, +.eq-ie8 .fieldset-wrapper-title .actions .action-delete, +.eq-ie8 .fieldset-wrapper-title .actions .action-delete:hover, +.eq-ie8 .fieldset-wrapper-title .actions .action-delete:active, +.eq-ie8 .fieldset-wrapper-title .actions .action-delete.active, +.eq-ie8 .address-list-item-actions .action-delete, +.eq-ie8 .address-list-item-actions .action-delete:hover, +.eq-ie8 .address-list-item-actions .action-delete:active, +.eq-ie8 .address-list-item-actions .action-delete.active, +.eq-ie8 .notification .action-close, +.eq-ie8 .notification .action-close:hover, +.eq-ie8 .notification .action-close:active, +.eq-ie8 .notification .action-close.active, +.eq-ie8 .page-login .action-forgotpassword, +.eq-ie8 .page-login .action-forgotpassword:hover, +.eq-ie8 .page-login .action-forgotpassword:active, +.eq-ie8 .page-login .action-forgotpassword.active, +.eq-ie8 .page-login .action-back, +.eq-ie8 .page-login .action-back:hover, +.eq-ie8 .page-login .action-back:active, +.eq-ie8 .page-login .action-back.active { + border: none; + border-radius: 0; + background: none; + margin: 0; + padding: 0; + box-shadow: none; + text-shadow: none; + filter: none; +} + +// Variations Image Uploader + +.eq-ie8 .actions-image-uploader .action-upload { + filter: none; +} + +// Forms + +.eq-ie8 select[disabled="disabled"][multiple="multiple"] option[selected="selected"] { + background-color: #ddd; +} + +.eq-ie8 .fieldset { + border-width: 0 0 1px; +} + +.eq-ie8 .fieldset .fieldset-wrapper .fieldset-wrapper-title, +.eq-ie8 .fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title { + background: #f4f2ef; +} + +.eq-ie8 .fieldset-alt, +.eq-ie8 .fieldset-alt > .fieldset { + display: block; + width: 100%; +} + +.eq-ie8 .fieldset-alt > .field { + display: inline-block; +} + +.eq-ie8 .field.type-price .addon .addafter, +.eq-ie8 .field-price .addon .addafter, +.eq-ie8 .field-special_price .addon .addafter, +.eq-ie8 .field-msrp .addon .addafter { + border-width: 1px 1px 1px 0; +} + +.eq-ie8 .field-apply_to .multiselect { + height: 120px; +} + +// Popups + +.eq-ie8 .popup-loading { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; +} + +.eq-ie8 .loading-old, +.eq-ie8 .loading-mask { + background: #fff; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; +} + +// Global Navigation +.eq-ie8 .navigation { + background: #726c62; +} + +.eq-ie8 .navigation:before { + border-top: 1px solid #46433d; +} + +.eq-ie8 .navigation .level-0.active > a { + background: #625d54; +} + +.eq-ie8 .navigation .level-0.active > a, +.eq-ie8 .navigation .level-0:hover > a, +.eq-ie8 .navigation .level-0.hover > a { + border-top: 1px solid #46433d; + padding-top: 36px; +} + +.eq-ie8 .navigation .level-0 > .submenu .column { + float: left; +} + +.eq-ie8 .navigation .level-0.item-system > a, +.eq-ie8 .navigation .level-0.item-system:hover > a, +.eq-ie8 .navigation .level-0.item-system.hover > a, +.eq-ie8 .navigation .level-0.item-stores > a, +.eq-ie8 .navigation .level-0.item-stores:hover > a, +.eq-ie8 .navigation .level-0.item-stores.hover > a { + border-top: 0; + padding-top: 0; +} + +.eq-ie8 .navigation .level-0.item-system > a:before, +.eq-ie8 .navigation .level-0.item-system > a:after, +.eq-ie8 .navigation .level-0.item-stores > a:before, +.eq-ie8 .navigation .level-0.item-stores > a:after { + display: none; +} + +.eq-ie8 .page-login .field-username label, +.eq-ie8 .page-login .field-password label, +.eq-ie8 .page-login .field-confirmation label { + display: block; +} + +.eq-ie8 .message-noscript, +.eq-ie8 .message-demo-mode { + border-bottom: 1px solid #46433d; +} + +// Switcher +.eq-ie8 .store-switcher-alt .store-selected:after { + vertical-align: middle; +} + +.eq-ie8 .store-switcher-website { + border-bottom: 0; +} + +.eq-ie8 .store-switcher-store-view { + border-bottom: 0; + border-top: 1px solid #e5e5e5; +} + +.eq-ie8 .switcher-label:after { + content: 'off'; + overflow: hidden; + white-space: nowrap; + text-indent: 100%; +} + +.eq-ie8 .switcher.checked .switcher-label:after { + background-position: -34px 0; + content: 'on'; +} + +.eq-ie8 .switcher.checked .switcher-label:before { + content: attr(data-text-on); +} + +// Table Grid + +.eq-ie8 .grid table td.empty-text { + border-width: 0 1px 1px; +} + +.eq-ie8 .grid table tr td.empty-text { + border-width: 0 1px 1px; +} + +.eq-ie8 .grid .filter .date img { + filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0); +} + +.eq-ie8 .massaction .entry-edit .field-row:first-child { + margin-right: 1px; +} + +.eq-ie8 .massaction .entry-edit .field-row { + display: inline; +} + +// Data table + +.eq-ie8 .data-table td, +.eq-ie8 .data-table tbody tr td { + border-width: 0 0 1px; +} + +.eq-ie8 .data-table td > .field { + margin-bottom: 0; +} + +.eq-ie8 .data-table tfoot tr td { + border: none; +} + +// Data table - alternative view + +.eq-ie8 .customer-information .data-table tbody tr td, +.eq-ie8 .customer-information .data-table tbody tr th, +.eq-ie8 .order-information .data-table tbody tr td, +.eq-ie8 .order-information .data-table tbody tr th, +.eq-ie8 .order-account-information .data-table tbody tr td, +.eq-ie8 .order-account-information .data-table tbody tr th, +.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr td, +.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr th, +.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr th, +.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr td, +.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr th, +.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr td, +.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr th, +.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr td { + border-bottom: 1px solid #ededed; +} + +// Widgets +.eq-ie8 .widget-layout-updates .data-table { + table-layout: auto; +} + +// Grid - Mass Action + +.eq-ie8 .massaction { + border-bottom: 2px solid #504d46; +} + +// Header +.eq-ie8 .header { + background: #f5f2ea; +} + +.eq-ie8 .header-panel .dropdown-menu { + border: 1px solid #c3bcaf; +} + +.eq-ie8 .header-panel .notifications-icon:before { + bottom: -6px; +} + +.eq-ie8 .header-panel .notifications > .dropdown-menu > li:hover { + margin-top: 0; + padding-top: 13px; +} + +.eq-ie8 .header-panel .dropdown-menu > li:hover:after { + display: block; +} + +.eq-ie8 .header-panel .notifications > .dropdown-menu .action-close { + filter: none; +} + +.eq-ie8 .header .header-panel .notifications .action-more { + filter: none; +} + +.eq-ie8 .header .header-panel .notifications .action-more { + margin-bottom: -1px; +} + +.eq-ie8 .autocomplete-results { + margin-top: -10px; +} + +.eq-ie8 .search button[type="submit"]:before { + line-height: 1.3; +} + +// Product Creation + +.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back, +.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:hover, +.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:active, +.eq-ie8 [class^=" newsletter-"] .page-actions .action-back, +.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:hover, +.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:active { + filter: none; + border: 0; +} + +.eq-ie8 .sales-order-index .col-1-layout table.data { + table-layout: auto; + word-wrap: normal; +} + +// Accordion +.eq-ie8 .accordion .config legend { + position: absolute; + left: -999em; + display: block; + width: 0; + height: 0; + padding: 0; + margin: 0; + overflow: hidden; +} diff --git a/app/design/adminhtml/magento_backend/less/styles/vars.less b/app/design/adminhtml/magento_backend/less/styles/vars.less new file mode 100644 index 0000000000000000000000000000000000000000..d1e4701b182816a5e85b02d33a491086a19a5eda --- /dev/null +++ b/app/design/adminhtml/magento_backend/less/styles/vars.less @@ -0,0 +1,337 @@ +// /** +// * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. +// * +// * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) +// * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +// */ + +@import "../clearless/all.less"; + +@baseDir: ~".."; + +// Primary colors +@primary1: #676056; +@primary2: #ed4f2e; +@primary3: #026294; +@primary4: #fff; +@primary5: #007dbd; +@primary6: #e22626; +@primary7: #f2ebde; +@primary8: #31302b; +@primary9: #ef672f; + +// Buttons +// Default Buttons +@defaultButton1: #f2ebde; +@defaultButton2: #ada89e; +@defaultButton3: #676056; +@defaultButton4: #cac3b4; +@defaultButton5: #989287; + +// Primary Buttons +@primaryButton1: #007dbd; +@primaryButton2: #0574ad; +@primaryButton3: #026294; +@primaryButton4: #004c74; + +// Links +@linkColor: @primary3; +@linkColor2: @primary4; + +// Base font +@baseFont: 'Open Sans', sans-serif; +@baseFontSize: 14px; +@baseFontWeight: 400; +@baseFontWeightSemibold: 600; +@baseFontWeightBold: 700; +@baseLineHeight: 1.33; +@baseColor: @primary1; + +// Headings +// H1 +@h1color: @primary1; +@h1font: 400 28px/1.2 @baseFont; + +// H2 +@h2color: @primary1; +@h2font: 400 20px/1.2 @baseFont; + +// H3 +@h3color: @primary1; +@h3font: 600 16px/1.2 @baseFont; + +// H4 +@h4color: @primary1; +@h4font: 600 14px/1.2 @baseFont; + +// H5 +@h5color: @primary1; +@h5font: 600 13px/1.2 @baseFont; + +// H6 +@h6color: @primary1; +@h6font: 600 12px/1.2 @baseFont; + + +.actionLink() { + display: inline; + color: @linkColor; + text-decoration: none; + &:visited, + &:active { + color: @linkColor; + } + &:focus, + &:hover { + color: @linkColor; + text-decoration: underline; + } +} + +.actionLinkI() { + display: inline; + color: @linkColor2; + text-decoration: underline; + &:visited, + &:active { + color: @linkColor2; + } + &:focus, + &:hover { + color: @linkColor2; + text-decoration: underline; + } +} + +.style1() { // absent in design +} + +.style2() { + color: @primary1; + font-size: 13px; + font-weight: @baseFontWeightSemibold; +} + +.style3() { + color: @primary5; + font-size: 14px; + font-weight: @baseFontWeight; + + &:focus, + &:hover { + text-decoration: underline; + } +} + +.style4() { // absent in design +} + +.style5() { // absent in design +} + +.style6() { + color: @primary5; + font-size: 13px; + font-weight: @baseFontWeight; + + &:focus, + &:hover { + text-decoration: underline; + } +} + +.style7() { + color: @primary1; + font-size: 16px; + font-weight: @baseFontWeight; +} + +.style8() { + color: @primary6; + font-size: 13px; + font-weight: @baseFontWeight; +} + +.style9() { + color: @primary1; + font-size: 14px; + font-weight: @baseFontWeight; +} + +.style10() { + color: @primary1; + font-size: 20px; + font-weight: @baseFontWeight; +} + +.style11() { // absent in design +} + +.style12() { // absent in design +} + +.style13() { // absent in design +} + +.style14() { + color: @primary1; + font-size: 11px; + font-weight: @baseFontWeight; +} + +.style15() { + color: @primary7; + font-size: 13px; + font-weight: @baseFontWeight; +} + +.style15I() { + color: @primary1; + font-size: 13px; + font-weight: @baseFontWeight; +} + +.style16() { + color: @primary4; + font-size: 12px; + font-weight: @baseFontWeightSemibold; +} + +.style17() { // absent in design +} + +.style18() { + color: @primary1; + font-size: 13px; + font-weight: @baseFontWeight; +} + +.style19() { + color: @primary1; + font-size: 12px; + font-weight: @baseFontWeight; +} + +.style20() { // absent in design + color: @primary2; + font-size: 12px; + font-weight: @baseFontWeightSemibold; +} + +.style21() { // absent in design + color: @primary1; + font-size: 11px; + font-weight: @baseFontWeight; +} + +.style22() { + color: @primary5; + font-size: 12px; + font-weight: @baseFontWeight; + &:focus, + &:hover { + text-decoration: underline; + } +} + +.style23() { + color: @primary1; + font-size: 28px; + font-weight: @baseFontWeight; +} + +.style24() { // absent in design + color: @primary1; + font-size: 12px; + font-weight: @baseFontWeight; +} + +.style25() { // absent in design + color: @primary8; + font-size: 14px; + font-weight: @baseFontWeight; + &:focus, + &:hover { + text-decoration: underline; + } +} + +.style26() { // absent in design + color: @primary4; + font-size: 30px; + font-weight: @baseFontWeightBold; +} + +.style27() { // absent in design + color: @primary9; + font-size: 20px; + font-weight: @baseFontWeightBold; +} + +.style28() { + color: @primary1; + font-size: 14px; + font-weight: @baseFontWeightBold; +} + +.style29() { + color: @primary4; + font-size: 13px; + font-weight: @baseFontWeightBold; +} + +.style30() { + color: @primary1; + font-size: 14px; + font-weight: @baseFontWeightSemibold; +} + +.style31() { + color: @primary1; + font-size: 20px; + font-style: italic; + font-weight: @baseFontWeight; +} + +.style32() { + color: @primary6; + font-size: 14px; + font-weight: @baseFontWeightBold; +} + +.style33() { + color: @primary3; + font-size: 12px; + font-weight: @baseFontWeightSemibold; + + &:focus, + &:hover { + text-decoration: underline; + } +} + +.style34() { // no such html yet + color: @primary2; + font-size: 12px; + font-weight: @baseFontWeight; + &:focus, + &:hover { + text-decoration: underline; + } +} diff --git a/app/design/frontend/magento_plushe/Magento_Theme/layout/default_head_blocks.xml b/app/design/frontend/magento_plushe/Magento_Theme/layout/default_head_blocks.xml index baaa059b8b8da53a3efa2bdb036c2e232ab2d681..87820ad284cbda2284d910fdbdbd3419753da917 100644 --- a/app/design/frontend/magento_plushe/Magento_Theme/layout/default_head_blocks.xml +++ b/app/design/frontend/magento_plushe/Magento_Theme/layout/default_head_blocks.xml @@ -32,7 +32,7 @@ </block> <block class="Magento\Theme\Block\Html\Head\Script" name="js-matchmedia-js"> <arguments> - <argument name="file" xsi:type="string">js/matchMedia.js</argument> + <argument name="file" xsi:type="string">matchMedia.js</argument> </arguments> </block> <block class="Magento\Theme\Block\Html\Head\Script" name="js-responsive-js"> @@ -42,7 +42,7 @@ </block> <block class="Magento\Theme\Block\Html\Head\Script" name="js-head-js"> <arguments> - <argument name="file" xsi:type="string">js/head.js</argument> + <argument name="file" xsi:type="string">headjs/head.min.js</argument> </arguments> </block> <block class="Magento\Theme\Block\Html\Head\Script" name="js-jquery-dropdowns-js"> @@ -67,7 +67,7 @@ </block> <block class="Magento\Theme\Block\Html\Head\Script" name="js-selectivizr-js"> <arguments> - <argument name="file" xsi:type="string">js/selectivizr.js</argument> + <argument name="file" xsi:type="string">selectivizr.js</argument> <argument name="properties" xsi:type="array"> <item name="ie_condition" xsi:type="string">lt IE 9</item> </argument> diff --git a/app/design/frontend/magento_plushe/css/styles.css b/app/design/frontend/magento_plushe/css/styles.css index 16a5de8bdb00535ec7c94c69abc888fdaa2719fc..6b5a8b9d13789502d35843114778818e6a02ce07 100644 --- a/app/design/frontend/magento_plushe/css/styles.css +++ b/app/design/frontend/magento_plushe/css/styles.css @@ -5278,6 +5278,19 @@ body { padding: 0; margin: 0 0 30px; } +.block.progress.onepage dd.complete .cards.items dd { + margin-left: 0; +} +.block.progress.onepage dd.complete .cards.items dd .card.item { + font-size: 12px; + margin: 5px 0 10px; +} +.block.progress.onepage dd.complete .cards.items dd .card.item dt { + font-weight: bold; +} +.block.progress.onepage dd.complete .cards.items dd .card.item dd { + margin-bottom: 5px; +} .block.progress.onepage address { font-style: normal; } diff --git a/app/design/frontend/magento_plushe/js/extra-options.js b/app/design/frontend/magento_plushe/js/extra-options.js index a7457b18dc75d67de33a81f95db1d0222f3719ab..5e32b5cc2e12b392d87abec6c1787ff3e682fba0 100644 --- a/app/design/frontend/magento_plushe/js/extra-options.js +++ b/app/design/frontend/magento_plushe/js/extra-options.js @@ -17,8 +17,6 @@ * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. * - * @category gift options - * @package mage * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ diff --git a/app/design/frontend/magento_plushe/js/head.js b/app/design/frontend/magento_plushe/js/head.js deleted file mode 100644 index 67de77740949bcedf9cfcad1034ce8a90a2f5cd6..0000000000000000000000000000000000000000 --- a/app/design/frontend/magento_plushe/js/head.js +++ /dev/null @@ -1,356 +0,0 @@ -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License (AFL 3.0) - * that is bundled with this package in the file LICENSE_AFL.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/afl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) - */ - -(function (a, w) { - function f(a) { - p[p.length] = a - } - - function m(a) { - q.className = q.className.replace(RegExp("\\b" + a + "\\b"), "") - } - - function k(a, d) { - for (var b = 0, c = a.length; b < c; b++)d.call(a, a[b], b) - } - - function s() { - q.className = q.className.replace(/ (w-|eq-|gt-|gte-|lt-|lte-|portrait|no-portrait|landscape|no-landscape)\d+/g, ""); - var b = a.innerWidth || q.clientWidth, d = a.outerWidth || a.screen.width; - h.screen.innerWidth = b; - h.screen.outerWidth = d; - f("w-" + b); - k(c.screens, function (a) { - b > a ? (c.screensCss.gt && f("gt-" + a), c.screensCss.gte && f("gte-" + - a)) : b < a ? (c.screensCss.lt && f("lt-" + a), c.screensCss.lte && f("lte-" + a)) : b === a && (c.screensCss.lte && f("lte-" + a), c.screensCss.eq && f("e-q" + a), c.screensCss.gte && f("gte-" + a)) - }); - var d = a.innerHeight || q.clientHeight, g = a.outerHeight || a.screen.height; - h.screen.innerHeight = d; - h.screen.outerHeight = g; - h.feature("portrait", d > b); - h.feature("landscape", d < b) - } - - function r() { - a.clearTimeout(u); - u = a.setTimeout(s, 100) - } - - var n = a.document, g = a.navigator, t = a.location, q = n.documentElement, p = [], c = {screens:[240, 320, 480, 640, 768, 800, 1024, 1280, - 1440, 1680, 1920], screensCss:{gt:!0, gte:!1, lt:!0, lte:!1, eq:!1}, browsers:[ - {ie:{min:6, max:10}} - ], browserCss:{gt:!0, gte:!1, lt:!0, lte:!1, eq:!0}, section:"-section", page:"-page", head:"head"}; - if (a.head_conf)for (var b in a.head_conf)a.head_conf[b] !== w && (c[b] = a.head_conf[b]); - var h = a[c.head] = function () { - h.ready.apply(null, arguments) - }; - h.feature = function (a, b, c) { - if (!a)return q.className += " " + p.join(" "), p = [], h; - "[object Function]" === Object.prototype.toString.call(b) && (b = b.call()); - f((b ? "" : "no-") + a); - h[a] = !!b; - c || (m("no-" + - a), m(a), h.feature()); - return h - }; - h.feature("js", !0); - b = g.userAgent.toLowerCase(); - g = /mobile|midp/.test(b); - h.feature("mobile", g, !0); - h.feature("desktop", !g, !0); - b = /(chrome|firefox)[ \/]([\w.]+)/.exec(b) || /(iphone|ipad|ipod)(?:.*version)?[ \/]([\w.]+)/.exec(b) || /(android)(?:.*version)?[ \/]([\w.]+)/.exec(b) || /(webkit|opera)(?:.*version)?[ \/]([\w.]+)/.exec(b) || /(msie) ([\w.]+)/.exec(b) || []; - g = b[1]; - b = parseFloat(b[2]); - switch (g) { - case "msie": - g = "ie"; - b = n.documentMode || b; - break; - case "firefox": - g = "ff"; - break; - case "ipod": - case "ipad": - case "iphone": - g = - "ios"; - break; - case "webkit": - g = "safari" - } - h.browser = {name:g, version:b}; - h.browser[g] = !0; - for (var v = 0, x = c.browsers.length; v < x; v++)for (var i in c.browsers[v])if (g === i) { - f(i); - for (var A = c.browsers[v][i].max, l = c.browsers[v][i].min; l <= A; l++)b > l ? (c.browserCss.gt && f("gt-" + i + l), c.browserCss.gte && f("gte-" + i + l)) : b < l ? (c.browserCss.lt && f("lt-" + i + l), c.browserCss.lte && f("lte-" + i + l)) : b === l && (c.browserCss.lte && f("lte-" + i + l), c.browserCss.eq && f("eq-" + i + l), c.browserCss.gte && f("gte-" + i + l)) - } else f("no-" + i); - "ie" === g && 9 > b && k("abbr article aside audio canvas details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "), - function (a) { - n.createElement(a) - }); - k(t.pathname.split("/"), function (a, b) { - if (2 < this.length && this[b + 1] !== w)b && f(this.slice(1, b + 1).join("-").toLowerCase() + c.section); else { - var g = a || "index", h = g.indexOf("."); - 0 < h && (g = g.substring(0, h)); - q.id = g.toLowerCase() + c.page; - b || f("root" + c.section) - } - }); - h.screen = {height:a.screen.height, width:a.screen.width}; - s(); - var u = 0; - a.addEventListener ? a.addEventListener("resize", r, !1) : a.attachEvent("onresize", r) -})(window); -(function (a, w) { - function f(a) { - var f = a.charAt(0).toUpperCase() + a.substr(1), a = (a + " " + r.join(f + " ") + f).split(" "), c; - a:{ - for (c in a)if (k[a[c]] !== w) { - c = !0; - break a - } - c = !1 - } - return!!c - } - - var m = a.document.createElement("i"), k = m.style, s = " -o- -moz- -ms- -webkit- -khtml- ".split(" "), r = ["Webkit", "Moz", "O", "ms", "Khtml"], n = a[a.head_conf && a.head_conf.head || "head"], g = {gradient:function () { - k.cssText = ("background-image:" + s.join("gradient(linear,left top,right bottom,from(#9f9),to(#fff));background-image:") + s.join("linear-gradient(left top,#eee,#fff);background-image:")).slice(0, - -17); - return!!k.backgroundImage - }, rgba:function () { - k.cssText = "background-color:rgba(0,0,0,0.5)"; - return!!k.backgroundColor - }, opacity:function () { - return"" === m.style.opacity - }, textshadow:function () { - return"" === k.textShadow - }, multiplebgs:function () { - k.cssText = "background:url(//:),url(//:),red url(//:)"; - return/(url\s*\(.*?){3}/.test(k.background) - }, boxshadow:function () { - return f("boxShadow") - }, borderimage:function () { - return f("borderImage") - }, borderradius:function () { - return f("borderRadius") - }, cssreflections:function () { - return f("boxReflect") - }, - csstransforms:function () { - return f("transform") - }, csstransitions:function () { - return f("transition") - }, touch:function () { - return"ontouchstart"in a - }, retina:function () { - return 1 < a.devicePixelRatio - }, fontface:function () { - var a = n.browser.version; - switch (n.browser.name) { - case "ie": - return 9 <= a; - case "chrome": - return 13 <= a; - case "ff": - return 6 <= a; - case "ios": - return 5 <= a; - case "android": - return!1; - case "webkit": - return 5.1 <= a; - case "opera": - return 10 <= a; - default: - return!1 - } - }}, t; - for (t in g)g[t] && n.feature(t, g[t].call(), !0); - n.feature() -})(window); -(function (a, w) { - function f() { - } - - function m(j, a) { - if (j) { - "object" === typeof j && (j = [].slice.call(j)); - for (var b = 0, c = j.length; b < c; b++)a.call(j, j[b], b) - } - } - - function k(a, b) { - var e = Object.prototype.toString.call(b).slice(8, -1); - return b !== w && null !== b && e === a - } - - function s(a) { - return k("Function", a) - } - - function r(a) { - a = a || f; - a._done || (a(), a._done = 1) - } - - function n(a) { - var b = {}; - if ("object" === typeof a)for (var e in a)a[e] && (b = {name:e, url:a[e]}); else b = a.split("/"), b = b[b.length - 1], e = b.indexOf("?"), b = {name:-1 !== e ? b.substring(0, e) : b, url:a}; - return(a = i[b.name]) && a.url === b.url ? a : i[b.name] = b - } - - function g(a) { - var a = a || i, b; - for (b in a)if (a.hasOwnProperty(b) && a[b].state !== y)return!1; - return!0 - } - - function t(a, b) { - b = b || f; - a.state === y ? b() : a.state === D ? d.ready(a.name, b) : a.state === C ? a.onpreload.push(function () { - t(a, b) - }) : (a.state = D, q(a, function () { - a.state = y; - b(); - m(x[a.name], function (a) { - r(a) - }); - u && g() && m(x.ALL, function (a) { - r(a) - }) - })) - } - - function q(j, c) { - var c = c || f, e; - /\.css[^\.]*$/.test(j.url) ? (e = b.createElement("link"), e.type = "text/" + (j.type || "css"), e.rel = "stylesheet", - e.href = j.url) : (e = b.createElement("script"), e.type = "text/" + (j.type || "javascript"), e.src = j.url); - e.onload = e.onreadystatechange = function (j) { - j = j || a.event; - if ("load" === j.type || /loaded|complete/.test(e.readyState) && (!b.documentMode || 9 > b.documentMode))e.onload = e.onreadystatechange = e.onerror = null, c() - }; - e.onerror = function () { - e.onload = e.onreadystatechange = e.onerror = null; - c() - }; - e.async = !1; - e.defer = !1; - var d = b.head || b.getElementsByTagName("head")[0]; - d.insertBefore(e, d.lastChild) - } - - function p() { - b.body ? u || (u = !0, m(h, function (a) { - r(a) - })) : - (a.clearTimeout(d.readyTimeout), d.readyTimeout = a.setTimeout(p, 50)) - } - - function c() { - b.addEventListener ? (b.removeEventListener("DOMContentLoaded", c, !1), p()) : "complete" === b.readyState && (b.detachEvent("onreadystatechange", c), p()) - } - - var b = a.document, h = [], v = [], x = {}, i = {}, A = "async"in b.createElement("script") || "MozAppearance"in b.documentElement.style || a.opera, l, u, B = a.head_conf && a.head_conf.head || "head", d = a[B] = a[B] || function () { - d.ready.apply(null, arguments) - }, C = 1, D = 3, y = 4; - d.load = A ? function () { - var a = arguments, b = a[a.length - - 1], e = {}; - s(b) || (b = null); - m(a, function (c, d) { - c !== b && (c = n(c), e[c.name] = c, t(c, b && d === a.length - 2 ? function () { - g(e) && r(b) - } : null)) - }); - return d - } : function () { - var a = arguments, b = [].slice.call(a, 1), c = b[0]; - if (!l)return v.push(function () { - d.load.apply(null, a) - }), d; - c ? (m(b, function (a) { - if (!s(a)) { - var b = n(a); - b.state === w && (b.state = C, b.onpreload = [], q({url:b.url, type:"cache"}, function () { - b.state = 2; - m(b.onpreload, function (a) { - a.call() - }) - })) - } - }), t(n(a[0]), s(c) ? c : function () { - d.load.apply(null, b) - })) : t(n(a[0])); - return d - }; - d.js = d.load; - d.test = - function (a, b, c, g) { - a = "object" === typeof a ? a : {test:a, success:b ? k("Array", b) ? b : [b] : !1, failure:c ? k("Array", c) ? c : [c] : !1, callback:g || f}; - (b = !!a.test) && a.success ? (a.success.push(a.callback), d.load.apply(null, a.success)) : !b && a.failure ? (a.failure.push(a.callback), d.load.apply(null, a.failure)) : g(); - return d - }; - d.ready = function (a, c) { - if (a === b)return u ? r(c) : h.push(c), d; - s(a) && (c = a, a = "ALL"); - if ("string" !== typeof a || !s(c))return d; - var e = i[a]; - if (e && e.state === y || "ALL" === a && g() && u)return r(c), d; - (e = x[a]) ? e.push(c) : x[a] = [c]; - return d - }; - d.ready(b, function () { - g() && m(x.ALL, function (a) { - r(a) - }); - d.feature && d.feature("domloaded", !0) - }); - if ("complete" === b.readyState)p(); else if (b.addEventListener)b.addEventListener("DOMContentLoaded", c, !1), a.addEventListener("load", p, !1); else { - b.attachEvent("onreadystatechange", c); - a.attachEvent("onload", p); - var z = !1; - try { - z = null == a.frameElement && b.documentElement - } catch (F) { - } - z && z.doScroll && function E() { - if (!u) { - try { - z.doScroll("left") - } catch (b) { - a.clearTimeout(d.readyTimeout); - d.readyTimeout = a.setTimeout(E, 50); - return - } - p() - } - }() - } - setTimeout(function () { - l = !0; - m(v, function (a) { - a() - }) - }, 300) -})(window); diff --git a/app/design/frontend/magento_plushe/js/sticky.js b/app/design/frontend/magento_plushe/js/sticky.js index 2ebd90c1f143d731ea6d406277ee00b07bb0692a..64000be11e584f87765e09849300b8041f778630 100644 --- a/app/design/frontend/magento_plushe/js/sticky.js +++ b/app/design/frontend/magento_plushe/js/sticky.js @@ -17,8 +17,6 @@ * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. * - * @category EE - * @package EE_refrence * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ @@ -58,4 +56,4 @@ } } }); -})(jQuery, window); \ No newline at end of file +})(jQuery, window); diff --git a/app/design/frontend/magento_plushe/less/styles.less b/app/design/frontend/magento_plushe/less/styles.less index 2a5ddb95c480b8934360b55ee68a736ae7280362..ce54fa847d4053d718b55d66a2d76a4f116152dc 100644 --- a/app/design/frontend/magento_plushe/less/styles.less +++ b/app/design/frontend/magento_plushe/less/styles.less @@ -854,6 +854,21 @@ body { dd.complete { padding: 0; margin: 0 0 30px; + .cards.items { + dd { + margin-left: 0; + .card.item { + font-size: 12px; + margin: 5px 0 10px; + dt { + font-weight: bold; + } + dd { + margin-bottom: 5px; + } + } + } + } } address { font-style: normal; diff --git a/dev/tests/integration/framework/Magento/TestFramework/Helper/Memory.php b/dev/tests/integration/framework/Magento/TestFramework/Helper/Memory.php index 95b314cf9219fd8c4c0cabd99aa18b70b23066b8..942e7431c1fd5e1bd2645a0d6640472677b660ea 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/Helper/Memory.php +++ b/dev/tests/integration/framework/Magento/TestFramework/Helper/Memory.php @@ -85,7 +85,11 @@ class Memory protected function _getUnixProcessMemoryUsage($pid) { // RSS - resident set size, the non-swapped physical memory - $output = $this->_shell->execute('ps --pid %s --format rss --no-headers', array($pid)); + $command = 'ps --pid %s --format rss --no-headers'; + if ($this->isMacOS()) { + $command = 'ps -p %s -o rss='; + } + $output = $this->_shell->execute($command, array($pid)); $result = $output . 'k'; // kilobytes return self::convertToBytes($result); } @@ -165,4 +169,15 @@ class Memory } return preg_replace('/\D+/', '', $number); } + + /** + * Whether the operating system belongs to the Mac family + * + * @link http://php.net/manual/en/function.php-uname.php + * @return boolean + */ + public static function isMacOs() + { + return (strtoupper(PHP_OS) === 'DARWIN'); + } } diff --git a/dev/tests/integration/framework/bootstrap.php b/dev/tests/integration/framework/bootstrap.php index 6b6976c618e72689325e49559139e377b6515e67..0663d27b189505dc8224c80d05e63d297938dd5d 100644 --- a/dev/tests/integration/framework/bootstrap.php +++ b/dev/tests/integration/framework/bootstrap.php @@ -71,7 +71,7 @@ $bootstrap->runBootstrap(); \Magento\TestFramework\Helper\Bootstrap::setInstance(new \Magento\TestFramework\Helper\Bootstrap($bootstrap)); -Magento\TestFramework\Utility\Files::init(new Magento\TestFramework\Utility\Files($magentoBaseDir)); +Magento\TestFramework\Utility\Files::setInstance(new Magento\TestFramework\Utility\Files($magentoBaseDir)); /* Unset declared global variables to release the PHPUnit from maintaining their values between tests */ unset($bootstrap); diff --git a/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php b/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php index 9d912e5d93835908b87aa905fd326873627f3ce2..250e1309b59f420d7915ee91dc7fce784679d046 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php @@ -52,9 +52,20 @@ class Controller extends \Magento\TestFramework\TestCase\AbstractController $this->_auth = $this->_objectManager->get('Magento\Backend\Model\Auth'); $this->_session = $this->_auth->getAuthStorage(); - $this->_auth->login( - \Magento\TestFramework\Bootstrap::ADMIN_NAME, - \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD + $credentials = $this->_getAdminCredentials(); + $this->_auth->login($credentials['user'], $credentials['password']); + } + + /** + * Get credentials to login admin user + * + * @return array + */ + protected function _getAdminCredentials() + { + return array( + 'user' => \Magento\TestFramework\Bootstrap::ADMIN_NAME, + 'password' => \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD, ); } diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Helper/CategoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Helper/CategoryTest.php index a6d49296ea43b61866e7cd4013e84a3e4c2c2e97..c95aabab12897a2f3c84508201b2fdadf432b532 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Helper/CategoryTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Helper/CategoryTest.php @@ -59,7 +59,10 @@ class CategoryTest extends \PHPUnit_Framework_TestCase $categories = $this->_helper->getStoreCategories(); $this->assertInstanceOf('Magento\Data\Tree\Node\Collection', $categories); $index = 0; - $expectedPaths = array(array(3, '1/2/3'), array(6, '1/2/6'), array(7, '1/2/7')); + $expectedPaths = array( + array(3, '1/2/3'), array(6, '1/2/6'), array(7, '1/2/7'), + array(9, '1/2/9'), array(10, '1/2/10'), array(11, '1/2/11'), + ); foreach ($categories as $category) { $this->assertInstanceOf('Magento\Data\Tree\Node', $category); $this->assertEquals($expectedPaths[$index][0], $category->getId()); diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php index 0c118a9614d2769a0b25d2d22ebc6b7e481400c5..85152f1979b36e4aa685191f455b476d15395158 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php @@ -47,6 +47,44 @@ class CategoryTreeTest extends \PHPUnit_Framework_TestCase ->create('Magento\Catalog\Model\Category'); } + /** + * Load category + * + * @param $categoryId + * @return Category + */ + protected function loadCategory($categoryId) + { + $this->_model->setData(array()); + $this->_model->load($categoryId); + return $this->_model; + } + + public function testMovePosition() + { + //move category 9 to new parent 6 with afterCategoryId = null + $category = $this->loadCategory(9); + $category->move(6, null); + $category = $this->loadCategory(9); + $this->assertEquals(1, $category->getPosition(), 'Position must be 1, if $afterCategoryId was null|false|0'); + $category = $this->loadCategory(10); + $this->assertEquals(5, $category->getPosition(), 'Category 10 position must decrease after Category 9 moved'); + $category = $this->loadCategory(11); + $this->assertEquals(6, $category->getPosition(), 'Category 11 position must decrease after Category 9 moved'); + $category = $this->loadCategory(6); + $this->assertEquals(2, $category->getPosition(), 'Category 6 position must be the same'); + + //move category 11 to new parent 6 with afterCategoryId = 9 + $category = $this->loadCategory(11); + $category->move(6, 9); + $category = $this->loadCategory(11); + $this->assertEquals(2, $category->getPosition(), 'Category 11 position must be after category 9'); + $category = $this->loadCategory(10); + $this->assertEquals(5, $category->getPosition(), 'Category 10 position must be the same'); + $category = $this->loadCategory(9); + $this->assertEquals(1, $category->getPosition(), 'Category 9 position must be 1'); + } + public function testMove() { $this->_model->load(7); diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php index f3434c54f41906a0399e86eb50c9dfe8d9cdf5bc..30eb9cb1418db7593d0bc406103fbfefddf043be 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php @@ -153,6 +153,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->assertNotEquals($duplicate->getId(), $this->_model->getId()); $this->assertNotEquals($duplicate->getSku(), $this->_model->getSku()); $this->assertEquals(\Magento\Catalog\Model\Product\Status::STATUS_DISABLED, $duplicate->getStatus()); + $this->assertEquals(\Magento\Core\Model\Store::DEFAULT_STORE_ID, $duplicate->getStoreId()); $this->_undo($duplicate); } catch (\Exception $e) { $this->_undo($duplicate); diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php index e3dc77a153add844e9c826f065bd79a94a7ac38c..a3cd9e68c132103453e8c61a8d1e986f0c2f6faa 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php @@ -35,7 +35,7 @@ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\Catalog\Model\Category'); $category->setId(3) ->setName('Category 1') - ->setParentId(2) /**/ + ->setParentId(2) ->setPath('1/2/3') ->setLevel(2) ->setAvailableSortBy('name') @@ -48,7 +48,7 @@ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\Catalog\Model\Category'); $category->setId(4) ->setName('Category 1.1') - ->setParentId(3) /**/ + ->setParentId(3) ->setPath('1/2/3/4') ->setLevel(3) ->setAvailableSortBy('name') @@ -62,13 +62,13 @@ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\Catalog\Model\Category'); $category->setId(5) ->setName('Category 1.1.1') - ->setParentId(4) /**/ + ->setParentId(4) ->setPath('1/2/3/4/5') ->setLevel(4) ->setAvailableSortBy('name') ->setDefaultSortBy('name') ->setIsActive(true) - ->setPosition(2) + ->setPosition(1) ->setCustomUseParentSettings(0) ->setCustomDesign('magento_blank') ->save(); @@ -77,7 +77,7 @@ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\Catalog\Model\Category'); $category->setId(6) ->setName('Category 2') - ->setParentId(2) /**/ + ->setParentId(2) ->setPath('1/2/6') ->setLevel(2) ->setAvailableSortBy('name') @@ -90,7 +90,7 @@ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\Catalog\Model\Category'); $category->setId(7) ->setName('Movable') - ->setParentId(2) /**/ + ->setParentId(2) ->setPath('1/2/7') ->setLevel(2) ->setAvailableSortBy('name') @@ -99,11 +99,50 @@ $category->setId(7) ->setPosition(3) ->save(); +$category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Catalog\Model\Category'); +$category->setId(9) + ->setName('Movable Position 1') + ->setParentId(2) + ->setPath('1/2/9') + ->setLevel(2) + ->setAvailableSortBy('name') + ->setDefaultSortBy('name') + ->setIsActive(true) + ->setPosition(5) + ->save(); + +$category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Catalog\Model\Category'); +$category->setId(10) + ->setName('Movable Position 2') + ->setParentId(2) + ->setPath('1/2/10') + ->setLevel(2) + ->setAvailableSortBy('name') + ->setDefaultSortBy('name') + ->setIsActive(true) + ->setPosition(6) + ->save(); + +$category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Catalog\Model\Category'); +$category->setId(11) + ->setName('Movable Position 3') + ->setParentId(2) + ->setPath('1/2/11') + ->setLevel(2) + ->setAvailableSortBy('name') + ->setDefaultSortBy('name') + ->setIsActive(true) + ->setPosition(7) + ->save(); + $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\Catalog\Model\Category'); $category->setId(8) ->setName('Inactive') - ->setParentId(2) /**/ + ->setParentId(2) ->setPath('1/2/8') ->setAvailableSortBy('name') ->setDefaultSortBy('name') @@ -111,7 +150,6 @@ $category->setId(8) ->setPosition(4) ->save(); - /** @var $product \Magento\Catalog\Model\Product */ $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\Catalog\Model\Product'); diff --git a/dev/tests/integration/testsuite/Magento/Checkout/Controller/OnepageTest.php b/dev/tests/integration/testsuite/Magento/Checkout/Controller/OnepageTest.php index 78a80fa74e936fb1d2cf344a438f8e9f6094321b..ebe1a517a718a23d22142e2d4e5db74b9a7963b6 100644 --- a/dev/tests/integration/testsuite/Magento/Checkout/Controller/OnepageTest.php +++ b/dev/tests/integration/testsuite/Magento/Checkout/Controller/OnepageTest.php @@ -52,6 +52,7 @@ class OnepageTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertContains('<li id="opc-payment"', $html); $this->assertSelectCount('[id="checkout-payment-method-load"]', 1, $html); $this->assertSelectCount('form[id="co-billing-form"][action=""]', 1, $html); + $this->assertSelectCount('form[id="co-payment-form"] input[name="form_key"]', 1, $html); } /** @@ -92,6 +93,24 @@ class OnepageTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertContains('Place Order', $this->getResponse()->getBody()); $this->assertContains('checkout-review', $this->getResponse()->getBody()); } + + public function testSaveOrderActionWithoutFormKey() + { + $this->dispatch('checkout/onepage/saveOrder'); + $this->assertRedirect($this->stringContains('checkout/onepage')); + } + + public function testSaveOrderActionWithFormKey() + { + $formKey = $this->_objectManager->get('\Magento\Data\Form\FormKey'); + $this->getRequest()->setParam('form_key', $formKey->getFormKey()); + $this->dispatch('checkout/onepage/saveOrder'); + $html = $this->getResponse()->getBody(); + $this->assertEquals( + '{"success":false,"error":true,"error_messages":"Please specify a shipping method."}', + $html + ); + } } diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/CustomerTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/CustomerTest.php index 29c5e2bfdba616a4421560d73fce96f5e620e838..db32c7fcd5daa6cff16921cdf1e728cc10d96422 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Service/CustomerTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Service/CustomerTest.php @@ -65,7 +65,8 @@ class CustomerTest extends \PHPUnit_Framework_TestCase $this->_createdCustomer->getAddressesCollection()->delete(); $this->_createdCustomer->delete(); } - \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Core\Model\StoreManagerInterface') + \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->get('Magento\Core\Model\StoreManagerInterface') ->setCurrentStore($previousStoreId); $this->_model = null; @@ -324,9 +325,9 @@ class CustomerTest extends \PHPUnit_Framework_TestCase ->load(1); $updatedCustomer = $this->_model->update($expected->getId(), $customerData); + $this->assertInstanceOf('Magento\Customer\Model\Customer', $updatedCustomer); $this->assertFalse($updatedCustomer->isObjectNew()); - $actualData = $this->_customerFactory->create() ->load($expected->getId())->getData(); $expectedData = array_merge($updatedCustomer->toArray(array_keys($actualData)), $customerData); @@ -365,6 +366,24 @@ class CustomerTest extends \PHPUnit_Framework_TestCase ); } + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testUpdateFirstname() + { + $customer = $this->_customerFactory->create()->load(1); + // This call to getAttributes will cause our test to fail if the + // customer fixture was using attribute set 0 instead of 1 + $customer->getAttributes(); + + $updatedCustomer = $this->_model->update(1, ['firstname' => 'new_name']); + + $customer = $this->_customerFactory->create()->load(1); + + $this->assertEquals('new_name', $customer->getFirstname()); + $this->assertEquals('new_name', $updatedCustomer->getFirstname()); + } + /** * @param array $customerData * @param string $exceptionName @@ -386,15 +405,24 @@ class CustomerTest extends \PHPUnit_Framework_TestCase public function updateExceptionsDataProvider() { return array( - 'Invalid password' => array(array( - 'password' => '111' - ), 'Magento\Eav\Model\Entity\Attribute\Exception'), - 'Invalid name' => array(array( - 'firstname' => null - ), 'Magento\Validator\ValidatorException'), - 'Invalid email' => array(array( - 'email' => '3434@23434' - ), 'Magento\Validator\ValidatorException') + 'Invalid password' => array( + array( + 'password' => '111' + ), + 'Magento\Eav\Model\Entity\Attribute\Exception' + ), + 'Invalid name' => array( + array( + 'firstname' => null + ), + 'Magento\Validator\ValidatorException' + ), + 'Invalid email' => array( + array( + 'email' => '3434@23434' + ), + 'Magento\Validator\ValidatorException' + ) ); } @@ -416,9 +444,10 @@ class CustomerTest extends \PHPUnit_Framework_TestCase $oldPasswordHash = $this->_customerFactory->create() ->load(1) ->getPasswordHash(); - $updatedCustomer = $this->_model->update(1, array( - 'autogenerate_password' => true, - )); + $updatedCustomer = $this->_model->update( + 1, + array('autogenerate_password' => true,) + ); $this->assertNotEquals($oldPasswordHash, $updatedCustomer->getPasswordHash()); } @@ -435,8 +464,11 @@ class CustomerTest extends \PHPUnit_Framework_TestCase ->load(1); $this->assertCount(2, $customer->getAddresses(), 'Not all customer addresses were created.'); $updatedCustomer = $this->_model->update(1, array(), $addressesData); - $this->assertCount(count($addressesData), $updatedCustomer->getAddresses(), - 'Customer address was not deleted.'); + $this->assertCount( + count($addressesData), + $updatedCustomer->getAddresses(), + 'Customer address was not deleted.' + ); /** @var \Magento\Customer\Model\Customer $actualCustomer */ $actualCustomer = $this->_customerFactory->create() @@ -515,15 +547,17 @@ class CustomerTest extends \PHPUnit_Framework_TestCase ->load(1); $customerData = array('firstname' => 'Updated name'); $customer->addData($customerData); - $addressData = array(array( - 'firstname' => 'John', - 'lastname' => 'Smith', - 'street' => 'Green str, 67', - 'country_id' => 'AL', - 'city' => 'CityM', - 'postcode' => '75477', - 'telephone' => '3468676', - )); + $addressData = array( + array( + 'firstname' => 'John', + 'lastname' => 'Smith', + 'street' => 'Green str, 67', + 'country_id' => 'AL', + 'city' => 'CityM', + 'postcode' => '75477', + 'telephone' => '3468676', + ) + ); $callbackCount = 0; $callback = function ($actualCustomer, $actualData, $actualAddresses) use ($customer, $customerData, @@ -533,8 +567,10 @@ class CustomerTest extends \PHPUnit_Framework_TestCase // Remove updated_at as in afterSave updated_at may be changed $expectedCustomerData = $customer->getData(); unset($expectedCustomerData['updated_at']); - \PHPUnit_Framework_Assert::assertEquals($expectedCustomerData, - $actualCustomer->toArray(array_keys($expectedCustomerData))); + \PHPUnit_Framework_Assert::assertEquals( + $expectedCustomerData, + $actualCustomer->toArray(array_keys($expectedCustomerData)) + ); \PHPUnit_Framework_Assert::assertEquals($customerData, $actualData); \PHPUnit_Framework_Assert::assertEquals($addressData, $actualAddresses); }; diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..1589d285eebc70a788aa94ff66a1aeeb65243448 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php @@ -0,0 +1,434 @@ +<?php + +namespace Magento\Customer\Service\V1; +use Magento\Customer\Service\V1; +use Magento\Customer\Service\Entity\V1\Exception; + +/** + * Integration test for service layer \Magento\Customer\Service\CustomerV1 + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * + * @SuppressWarnings(PHPMD.TooManyMethods) + * @SuppressWarnings(PHPMD.ExcessivePublicCount) + */ +class CustomerAccountServiceTest extends \PHPUnit_Framework_TestCase +{ + /** @var CustomerAccountServiceInterface */ + private $_service; + + /** @var CustomerServiceInterface needed to setup tests */ + private $_customerService; + + /** @var \Magento\ObjectManager */ + private $_objectManager; + + /** @var \Magento\Customer\Service\V1\Dto\Address[] */ + private $_expectedAddresses; + + /** @var \Magento\Customer\Service\V1\Dto\AddressBuilder */ + private $_addressBuilder; + + /** @var \Magento\Customer\Service\V1\Dto\CustomerBuilder */ + private $_customerBuilder; + + protected function setUp() + { + $this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->_service = $this->_objectManager->create('Magento\Customer\Service\V1\CustomerAccountServiceInterface'); + $this->_customerService = $this->_objectManager->create('Magento\Customer\Service\V1\CustomerServiceInterface'); + + $this->_addressBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\AddressBuilder'); + $this->_customerBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\CustomerBuilder'); + + $this->_addressBuilder->setId(1) + ->setCountryId('US') + ->setCustomerId(1) + ->setDefaultBilling(true) + ->setDefaultShipping(true) + ->setPostcode('75477') + ->setRegion(new V1\Dto\Region([ + 'region_code' => 'AL', + 'region' => 'Alabama', + 'region_id' => 1 + ])) + ->setStreet(['Green str, 67']) + ->setTelephone('3468676') + ->setCity('CityM') + ->setFirstname('John') + ->setLastname('Smith'); + $address = $this->_addressBuilder->create(); + + /* XXX: would it be better to have a clear method for this? */ + $this->_addressBuilder->setId(2) + ->setCountryId('US') + ->setCustomerId(1) + ->setDefaultBilling(false) + ->setDefaultShipping(false) + ->setPostcode('47676') + ->setRegion(new V1\Dto\Region([ + 'region_code' => 'AL', + 'region' => 'Alabama', + 'region_id' => 1 + ])) + ->setStreet(['Black str, 48']) + ->setCity('CityX') + ->setTelephone('3234676') + ->setFirstname('John') + ->setLastname('Smith'); + $address2 = $this->_addressBuilder->create(); + + $this->_expectedAddresses = [$address, $address2]; + } + + + /** + * @magentoAppArea frontend + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testLogin() + { + // Customer e-mail and password are pulled from the fixture customer.php + $customer = $this->_service->authenticate('customer@example.com', 'password', true); + + $this->assertSame('customer@example.com', $customer->getEmail()); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionMessage Invalid login or password + */ + public function testLoginWrongPassword() + { + // Customer e-mail and password are pulled from the fixture customer.php + $this->_service->authenticate('customer@example.com', 'wrongPassword', true); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionMessage Invalid login or password + */ + public function testLoginWrongUsername() + { + // Customer e-mail and password are pulled from the fixture customer.php + $this->_service->authenticate('non_existing_user', 'password', true); + } + + /** + * @magentoDataFixture Magento/Customer/_files/inactive_customer.php + * @magentoAppArea frontend + */ + public function testActivateAccount() + { + /** @var \Magento\Customer\Model\Customer $customerModel */ + $customerModel = $this->_objectManager->create('Magento\Customer\Model\Customer'); + $customerModel->load(1); + // Assert in just one test that the fixture is working + $this->assertNotNull($customerModel->getConfirmation(), 'New customer needs to be confirmed'); + + $this->_service->activateAccount($customerModel->getId(), $customerModel->getConfirmation()); + + $customerModel = $this->_objectManager->create('Magento\Customer\Model\Customer'); + $customerModel->load(1); + $this->assertNull($customerModel->getConfirmation(), 'Customer should be considered confirmed now'); + } + + /** + * @magentoDataFixture Magento/Customer/_files/inactive_customer.php + * + * @expectedException \Magento\Core\Exception + * @expectedExceptionMessage Wrong confirmation key + */ + public function testActivateAccountWrongKey() + { + /** @var \Magento\Customer\Model\Customer $customerModel */ + $customerModel = $this->_objectManager->create('Magento\Customer\Model\Customer'); + $customerModel->load(1); + $key = $customerModel->getConfirmation(); + + $this->_service->activateAccount($customerModel->getId(), $key . $key); + } + + /** + * @magentoDataFixture Magento/Customer/_files/inactive_customer.php + * + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionMessage No customer with customerId 12341 exists. + */ + public function testActivateAccountWrongAccount() + { + /** @var \Magento\Customer\Model\Customer $customerModel */ + $customerModel = $this->_objectManager->create('Magento\Customer\Model\Customer'); + $customerModel->load(1); + $key = $customerModel->getConfirmation(); + + $this->_service->activateAccount('1234' . $customerModel->getId(), $key); + } + + /** + * @magentoDataFixture Magento/Customer/_files/inactive_customer.php + * @magentoAppArea frontend + * + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionMessage Customer account is already active + */ + public function testActivateAccountAlreadyActive() + { + /** @var \Magento\Customer\Model\Customer $customerModel */ + $customerModel = $this->_objectManager->create('Magento\Customer\Model\Customer'); + $customerModel->load(1); + $key = $customerModel->getConfirmation(); + $this->_service->activateAccount($customerModel->getId(), $key); + + $this->_service->activateAccount($customerModel->getId(), $key); + } + + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testValidateResetPasswordLinkToken() + { + $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [ + 'rp_token' => 'token', + 'rp_token_created_at' => date('Y-m-d') + ])); + $this->_customerService->saveCustomer($this->_customerBuilder->create()); + + $this->_service->validateResetPasswordLinkToken(1, 'token'); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED + */ + public function testValidateResetPasswordLinkTokenExpired() + { + $this->_service->validateResetPasswordLinkToken(1, 'some_token'); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_RESET_TOKEN + */ + public function testValidateResetPasswordLinkTokenInvalid() + { + $this->_service->validateResetPasswordLinkToken(0, null); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_CUSTOMER_ID + * @expectedExceptionMessage No customer with customerId 4200 exists + */ + public function testValidateResetPasswordLinkTokenWrongUser() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + + + $this->_service->validateResetPasswordLinkToken(4200, $resetToken); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_RESET_TOKEN + * @expectedExceptionMessage Invalid password reset token + */ + public function testValidateResetPasswordLinkTokenNull() + { + $this->_service->validateResetPasswordLinkToken(null, null); + } + + /** + * @magentoAppArea frontend + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testSendPasswordResetLink() + { + $email = 'customer@example.com'; + + $this->_service->sendPasswordResetLink($email, 1); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_EMAIL_NOT_FOUND + * @expectedExceptionMessage No customer found for the provided email and website ID + */ + public function testSendPasswordResetLinkBadEmailOrWebsite() + { + $email = 'foo@example.com'; + + $this->_service->sendPasswordResetLink($email, 0); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testResetPassword() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $password = 'password_secret'; + + $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [ + 'rp_token' => $resetToken, + 'rp_token_created_at' => date('Y-m-d') + ])); + $this->_customerService->saveCustomer($this->_customerBuilder->create()); + + $this->_service->resetPassword(1, $password, $resetToken); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED + * @expectedExceptionMessage Your password reset link has expired. + */ + public function testResetPasswordTokenExpired() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $password = 'password_secret'; + + $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [ + 'rp_token' => $resetToken, + 'rp_token_created_at' => '1970-01-01' + ])); + $this->_customerService->saveCustomer($this->_customerBuilder->create()); + + $this->_service->resetPassword(1, $password, $resetToken); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED + * @expectedExceptionMessage Your password reset link has expired. + */ + public function testResetPasswordTokenInvalid() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $invalidToken = $resetToken . 'invalid'; + $password = 'password_secret'; + + $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [ + 'rp_token' => $resetToken, + 'rp_token_created_at' => date('Y-m-d') + ])); + $this->_customerService->saveCustomer($this->_customerBuilder->create()); + + $this->_service->resetPassword(1, $password, $invalidToken); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_CUSTOMER_ID + * @expectedExceptionMessage No customer with customerId 4200 exists + */ + public function testResetPasswordTokenWrongUser() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $password = 'password_secret'; + + $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [ + 'rp_token' => $resetToken, + 'rp_token_created_at' => date('Y-m-d') + ])); + $this->_customerService->saveCustomer($this->_customerBuilder->create()); + + $this->_service->resetPassword(4200, $password, $resetToken); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_RESET_TOKEN + * @expectedExceptionMessage Invalid password reset token + */ + public function testResetPasswordTokenInvalidUserId() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $password = 'password_secret'; + + $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [ + 'rp_token' => $resetToken, + 'rp_token_created_at' => date('Y-m-d') + ])); + $this->_customerService->saveCustomer($this->_customerBuilder->create()); + + $this->_service->resetPassword(0, $password, $resetToken); + } + + /** + * @magentoAppArea frontend + * @magentoAppIsolation enabled + * @magentoDataFixture Magento/Customer/_files/inactive_customer.php + */ + public function testSendConfirmation() + { + $this->_service->sendConfirmation('customer@needAconfirmation.com'); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_EMAIL_NOT_FOUND + */ + public function testSendConfirmationNoEmail() + { + $this->_service->sendConfirmation('wrongemail@example.com'); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_CONFIRMATION_NOT_NEEDED + */ + public function testSendConfirmationNotNeeded() + { + $this->_service->sendConfirmation('customer@example.com'); + } + + + +} diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..91fbe7dd24af90d1f0741d365336083627d94eb3 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php @@ -0,0 +1,568 @@ +<?php + +namespace Magento\Customer\Service\V1; +use Magento\Customer\Service\V1; +use Magento\Customer\Service\Entity\V1\Exception; + +/** + * Integration test for service layer \Magento\Customer\Service\V1\CustomerAddressService + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * + * @SuppressWarnings(PHPMD.TooManyMethods) + * @SuppressWarnings(PHPMD.ExcessivePublicCount) + */ +class CustomerAddressServiceTest extends \PHPUnit_Framework_TestCase +{ + /** @var CustomerAddressServiceInterface */ + private $_service; + + /** @var \Magento\ObjectManager */ + private $_objectManager; + + /** @var \Magento\Customer\Service\V1\Dto\Address[] */ + private $_expectedAddresses; + + /** @var \Magento\Customer\Service\V1\Dto\AddressBuilder */ + private $_addressBuilder; + + /** @var \Magento\Customer\Service\V1\Dto\CustomerBuilder */ + private $_customerBuilder; + + protected function setUp() + { + $this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->_service = $this->_objectManager->create('Magento\Customer\Service\V1\CustomerAddressServiceInterface'); + + $this->_addressBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\AddressBuilder'); + $this->_customerBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\CustomerBuilder'); + + $this->_addressBuilder->setId(1) + ->setCountryId('US') + ->setCustomerId(1) + ->setDefaultBilling(true) + ->setDefaultShipping(true) + ->setPostcode('75477') + ->setRegion(new V1\Dto\Region([ + 'region_code' => 'AL', + 'region' => 'Alabama', + 'region_id' => 1 + ])) + ->setStreet(['Green str, 67']) + ->setTelephone('3468676') + ->setCity('CityM') + ->setFirstname('John') + ->setLastname('Smith'); + $address = $this->_addressBuilder->create(); + + /* XXX: would it be better to have a clear method for this? */ + $this->_addressBuilder->setId(2) + ->setCountryId('US') + ->setCustomerId(1) + ->setDefaultBilling(false) + ->setDefaultShipping(false) + ->setPostcode('47676') + ->setRegion(new V1\Dto\Region([ + 'region_code' => 'AL', + 'region' => 'Alabama', + 'region_id' => 1 + ])) + ->setStreet(['Black str, 48']) + ->setCity('CityX') + ->setTelephone('3234676') + ->setFirstname('John') + ->setLastname('Smith'); + $address2 = $this->_addressBuilder->create(); + + $this->_expectedAddresses = [$address, $address2]; + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php + * @magentoAppIsolation enabled + */ + public function testSaveAddressChanges() + { + $customerId = 1; + $address = $this->_service->getAddressById($customerId, 2); + $proposedAddressBuilder = $this->_addressBuilder->populate($address); + $proposedAddressBuilder->setTelephone('555' . $address->getTelephone()); + $proposedAddress = $proposedAddressBuilder->create(); + + $this->_service->saveAddresses($customerId, [$proposedAddress]); + + $addresses = $this->_service->getAddresses($customerId); + $this->assertEquals(2, count($addresses)); + $this->assertNotEquals($this->_expectedAddresses[1], $addresses[1]); + $this->_assertAddressAndRegionArrayEquals($proposedAddress->__toArray(), $addresses[1]->__toArray()); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php + * @magentoAppIsolation enabled + */ + public function testSaveAddressesIdSetButNotAlreadyExisting() + { + $proposedAddressBuilder = $this->_createSecondAddressBuilder() + ->setFirstname('Jane') + ->setId(4200); + $proposedAddress = $proposedAddressBuilder->create(); + + $customerId = 1; + $this->_service->saveAddresses($customerId, [$proposedAddress]); + $addresses = $this->_service->getAddresses($customerId); + $this->assertEquals($this->_expectedAddresses[0], $addresses[0]); + $this->assertEquals($this->_expectedAddresses[1], $addresses[1]); + + $expectedThirdAddressBuilder = $this->_addressBuilder->populate($proposedAddress); + // set id + $expectedThirdAddressBuilder->setId($addresses[2]->getId()); + $expectedThirdAddress = $expectedThirdAddressBuilder->create(); + $this->_assertAddressAndRegionArrayEquals($expectedThirdAddress->__toArray(), $addresses[2]->__toArray()); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php + * @magentoAppIsolation enabled + */ + public function testGetAddresses() + { + $customerId = 1; + $addresses = $this->_service->getAddresses($customerId); + $this->assertEquals(2, count($this->_expectedAddresses) ); + $this->assertEquals(2, count($addresses) ); + $this->_assertAddressAndRegionArrayEquals( + $this->_expectedAddresses[0]->__toArray(), + $addresses[0]->__toArray() + ); + $this->_assertAddressAndRegionArrayEquals( + $this->_expectedAddresses[1]->__toArray(), + $addresses[1]->__toArray() + ); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php + * @magentoAppIsolation enabled + */ + public function testGetDefaultBillingAddress() + { + $customerId = 1; + $address = $this->_service->getDefaultBillingAddress($customerId); + $this->assertEquals($this->_expectedAddresses[0], $address); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php + * @magentoAppIsolation enabled + */ + public function testGetAddressById() + { + $customerId = 1; + $addressId = 2; + $addresses = $this->_service->getAddressById($customerId, $addressId); + $this->assertEquals($this->_expectedAddresses[1], $addresses); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_ADDRESS_NOT_FOUND + */ + public function testGetAddressByIdBadAddrId() + { + // Should throw the address not found excetion + $this->_service->getAddressById(1, 12345); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoAppIsolation enabled + */ + public function testSaveNewAddress() + { + $proposedAddressBuilder = $this->_createSecondAddressBuilder(); + $proposedAddress = $proposedAddressBuilder->create(); + $customerId = 1; + + $this->_service->saveAddresses($customerId, [$proposedAddress]); + $addresses = $this->_service->getAddresses($customerId); + $this->assertEquals($this->_expectedAddresses[0], $addresses[0]); + $expectedNewAddressBuilder = $this->_addressBuilder->populate($this->_expectedAddresses[1]); + $expectedNewAddressBuilder + ->setId($addresses[1]->getId()); + $expectedNewAddress = $expectedNewAddressBuilder->create(); + $this->assertEquals($expectedNewAddress->__toArray(), $addresses[1]->__toArray()); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoAppIsolation enabled + */ + public function testSaveNewAddressWithAttributes() + { + $this->_addressBuilder->populateWithArray(array_merge($this->_expectedAddresses[1]->__toArray(), [ + 'firstname' => 'Jane', + 'id' => 4200, + 'weird' => 'something_strange_with_hair' + ]))->setId(null); + $proposedAddress = $this->_addressBuilder->create(); + + $customerId = 1; + $this->_service->saveAddresses($customerId, [$proposedAddress]); + + $addresses = $this->_service->getAddresses($customerId); + $this->assertNotEquals($proposedAddress->getAttributes(), $addresses[1]->getAttributes()); + $this->assertArrayHasKey('weird', $proposedAddress->getAttributes()); + $this->assertArrayNotHasKey('weird', $addresses[1]->getAttributes()); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoAppIsolation enabled + */ + public function testSaveNewInvalidAddresses() + { + $firstAddressBuilder = $this->_addressBuilder->populateWithArray( + array_merge($this->_expectedAddresses[0]->__toArray(), [ + 'firstname' => null + ]) + )->setId(null); + $firstAddress = $firstAddressBuilder->create(); + $secondAddressBuilder = $this->_addressBuilder->populateWithArray( + array_merge($this->_expectedAddresses[0]->__toArray(), [ + 'lastname' => null + ]) + )->setId(null); + $secondAddress = $secondAddressBuilder->create(); + $customerId = 1; + try { + $this->_service->saveAddresses($customerId, [$firstAddress, $secondAddress]); + } catch (\Magento\Customer\Service\Entity\V1\AggregateException $ae) { + $failures = $ae->getExceptions(); + $firstAddressError = $failures[0]; + $this->assertInstanceOf('\Magento\Customer\Service\Entity\V1\Exception', $firstAddressError); + $this->assertInstanceOf('\Magento\Validator\ValidatorException', $firstAddressError->getPrevious()); + $this->assertSame('Please enter the first name.', $firstAddressError->getPrevious()->getMessage()); + + $secondAddressError = $failures[1]; + $this->assertInstanceOf('\Magento\Customer\Service\Entity\V1\Exception', $secondAddressError); + $this->assertInstanceOf('\Magento\Validator\ValidatorException', $secondAddressError->getPrevious()); + $this->assertSame('Please enter the last name.', $secondAddressError->getPrevious()->getMessage()); + return; + } + $this->fail('Expected AggregateException not caught.'); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoAppIsolation enabled + */ + public function testSaveNewAddressDefaults() + { + $addressShippingBuilder = $this->_createFirstAddressBuilder(); + $addressShippingBuilder->setDefaultShipping(true)->setDefaultBilling(false); + $addressShipping = $addressShippingBuilder->create(); + + $addressBillingBuilder = $this->_createSecondAddressBuilder(); + $addressBillingBuilder->setDefaultBilling(true)->setDefaultShipping(false); + $addressBilling = $addressBillingBuilder->create(); + $customerId = 1; + $this->_service->saveAddresses($customerId, [$addressShipping, $addressBilling]); + + $shipping = $this->_service->getDefaultShippingAddress($customerId); + /* XXX: cannot reuse addressShippingBuilder; actually all of this code + is re-using the same addressBuilder which is wrong */ + $addressShipping = $this->_addressBuilder->populate($addressShipping)->setId($shipping->getId())->create(); + $this->_assertAddressAndRegionArrayEquals($addressShipping->__toArray(), $shipping->__toArray()); + + $billing = $this->_service->getDefaultBillingAddress($customerId); + $addressBilling = $this->_addressBuilder->populate($addressBilling)->setId($billing->getId())->create(); + $this->_assertAddressAndRegionArrayEquals($addressBilling->__toArray(), $billing->__toArray()); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoAppIsolation enabled + */ + public function testSaveSeveralNewAddressesSameDefaults() + { + $addressTwoBuilder = $this->_createSecondAddressBuilder(); + $addressTwo = $addressTwoBuilder->create(); + $addressThreeBuilder = $this->_addressBuilder->populate($addressTwo); + $addressThreeBuilder->setDefaultBilling(true); + $addressThree = $addressThreeBuilder->create(); + + $addressFourBuilder = $this->_addressBuilder->populate($addressTwo); + $addressFourBuilder->setDefaultBilling(false)->setDefaultShipping(true); + $addressFour = $addressFourBuilder->create(); + + $addressDefaultBuilder = $this->_addressBuilder->populate($addressTwo); + $addressDefaultBuilder->setDefaultBilling(true)->setDefaultShipping(true) + ->setFirstname('Dirty Garry'); + $addressDefault = $addressDefaultBuilder->create(); + + $customerId = 1; + $this->_service->saveAddresses( + $customerId, + [$addressTwo, $addressThree, $addressFour, $addressDefault] + ); + + $addresses = $this->_service->getAddresses($customerId); + $this->assertEquals(5, count($addresses)); + + // retrieve defaults + $addresses = [ + $this->_service->getDefaultBillingAddress($customerId), + $this->_service->getDefaultShippingAddress($customerId), + ]; + // Same address is returned twice + $this->assertEquals($addresses[0], $addresses[1]); + $this->assertEquals($addressDefault->getFirstname(), $addresses[1]->getFirstname()); + + //clone object + $expectedDefaultBuilder = $this->_addressBuilder->populate($addressDefault); + // It is the same address retrieved as the one which get saved + $expectedDefaultBuilder->setId($addresses[1]->getId()); + $expectedDefault = $expectedDefaultBuilder->create(); + $this->_assertAddressAndRegionArrayEquals($expectedDefault->__toArray(), $addresses[1]->__toArray()); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoAppIsolation enabled + */ + public function testSaveSeveralNewAddressesDifferentDefaults() + { + $addressTwoBuilder = $this->_createSecondAddressBuilder(); + $addressTwo = $addressTwoBuilder->create(); + + $addressThreeBuilder = $this->_addressBuilder->populate($addressTwo); + $addressThreeBuilder->setDefaultBilling(true); + $addressThree = $addressThreeBuilder->create(); + + $defaultShippingBuilder = $this->_addressBuilder->populate($addressTwo); + $defaultShippingBuilder->setFirstname('Shippy') + ->setLastname('McShippington') + ->setDefaultBilling(false) + ->setDefaultShipping(true); + $defaultShipping = $defaultShippingBuilder->create(); + + $defaultBillingBuilder = $this->_addressBuilder->populate($addressTwo); + $defaultBillingBuilder + ->setFirstname('Billy') + ->setLastname('McBillington') + ->setDefaultBilling(true) + ->setDefaultShipping(false); + $defaultBilling = $defaultBillingBuilder->create(); + + $customerId = 1; + + $this->_service->saveAddresses($customerId, [$addressTwo, $addressThree, $defaultShipping, $defaultBilling]); + $addresses = $this->_service->getAddresses($customerId); + + $this->assertEquals(5, count($addresses)); + + $addresses = [ + $this->_service->getDefaultBillingAddress($customerId), + $this->_service->getDefaultShippingAddress($customerId), + ]; + $this->assertNotEquals($addresses[0], $addresses[1]); + $this->assertTrue($addresses[0]->isDefaultBilling()); + $this->assertTrue($addresses[1]->isDefaultShipping()); + + $expectedDfltShipBuilder = $this->_addressBuilder->populate($defaultShipping); + $expectedDfltShipBuilder->setId($addresses[1]->getId()); + $expectedDfltShip = $expectedDfltShipBuilder->create(); + + $expectedDfltBillBuilder = $this->_addressBuilder->populate($defaultBilling); + $expectedDfltBillBuilder->setId($addresses[0]->getId()); + $expectedDfltBill = $expectedDfltBillBuilder->create(); + + $this->_assertAddressAndRegionArrayEquals($expectedDfltShip->__toArray(), $addresses[1]->__toArray()); + $this->_assertAddressAndRegionArrayEquals($expectedDfltBill->__toArray(), $addresses[0]->__toArray()); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php + * @magentoAppIsolation enabled + */ + public function testSaveAddressesNoAddresses() + { + $addressIds = $this->_service->saveAddresses(1, []); + $this->assertEmpty($addressIds); + $customerId = 1; + $addresses = $this->_service->getAddresses($customerId); + $this->assertEquals($this->_expectedAddresses, $addresses); + } + + /** + * @expectedException Exception + * @expectedExceptionMessage No customer with customerId 4200 exists + */ + public function testSaveAddressesCustomerIdNotExist() + { + $proposedAddress = $this->_createSecondAddressBuilder()->create(); + $this->_service->saveAddresses(4200, [$proposedAddress]); + } + + /** + * @expectedException Exception + * @expectedExceptionMessage No customer with customerId this_is_not_a_valid_id exists + */ + public function testSaveAddressesCustomerIdInvalid() + { + $proposedAddress = $this->_createSecondAddressBuilder()->create(); + $this->_service->saveAddresses('this_is_not_a_valid_id', [$proposedAddress]); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + */ + public function testDeleteAddressFromCustomer() + { + $customerId = 1; + $addressId = 1; + // See that customer already has an address with expected addressId + $addressDto = $this->_service->getAddressById($customerId, $addressId); + $this->assertEquals($addressDto->getId(), $addressId); + + // Delete the address from the customer + $this->_service->deleteAddressFromCustomer($customerId, $addressId); + + // See that address is deleted + try { + $addressDto = $this->_service->getAddressById($customerId, $addressId); + $this->fail('Did not catch expected exception'); + } catch (Exception $e) { + $this->assertEquals($e->getCode(), Exception::CODE_ADDRESS_NOT_FOUND); + } + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_ADDRESS_NOT_FOUND + */ + public function testDeleteAddressFromCustomerBadAddrId() + { + // Should throw the address not found exception + $this->_service->deleteAddressFromCustomer(1, 12345); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_ADDRESS_ID + */ + public function testDeleteAddressFromCustomerAddrIdNotSet() + { + // Should throw the address not found exception + $this->_service->deleteAddressFromCustomer(1, 0); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php + * @expectedException Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_CUSTOMER_ID_MISMATCH + */ + public function testDeleteAddressFromCustomerBadCustMismatch() + { + // Should throw the address not found excetion + $this->_service->deleteAddressFromCustomer(2, 1); + } + + /** + * Helper function that returns an Address DTO that matches the data from customer_address fixture + * + * @return \Magento\Customer\Service\V1\Dto\AddressBuilder + */ + private function _createFirstAddressBuilder() + { + $addressBuilder = $this->_addressBuilder->populate($this->_expectedAddresses[0]); + $addressBuilder->setId(null); + return $addressBuilder; + } + + /** + * Helper function that returns an Address DTO that matches the data from customer_two_address fixture + * + * @return \Magento\Customer\Service\V1\Dto\AddressBuilder + */ + private function _createSecondAddressBuilder() + { + return $this->_addressBuilder->populate($this->_expectedAddresses[1]) + ->setId(null); + } + + /** + * Checks that the arrays are equal, but accounts for the 'region' being an object + * + * @param array $expectedArray + * @param array $actualArray + */ + protected function _assertAddressAndRegionArrayEquals($expectedArray, $actualArray) + { + if (array_key_exists('region', $expectedArray)) { + /** @var \Magento\Customer\Service\V1\Dto\Region $expectedRegion */ + $expectedRegion = $expectedArray['region']; + unset($expectedArray['region']); + } + if (array_key_exists('region', $actualArray)) { + /** @var \Magento\Customer\Service\V1\Dto\Region $actualRegion */ + $actualRegion = $actualArray['region']; + unset($actualArray['region']); + } + + $this->assertEquals($expectedArray, $actualArray); + + // Either both set or both unset + $this->assertTrue(!(isset($expectedRegion) xor isset($actualRegion))); + if (isset($expectedRegion) && isset($actualRegion)) { + $this->assertInstanceOf('Magento\Customer\Service\V1\Dto\Region', $expectedRegion); + $this->assertInstanceOf('Magento\Customer\Service\V1\Dto\Region', $actualRegion); + $this->assertEquals($expectedRegion->__toArray(), $actualRegion->__toArray()); + } + } +} diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerGroupServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerGroupServiceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4e0a4412629f9ed69fa0cc0d166f93acffc32184 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerGroupServiceTest.php @@ -0,0 +1,181 @@ +<?php +/** + * Integration test for service layer \Magento\Customer\Service\Customer + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1; + +use Magento\Customer\Service\V1; + +class CustomerGroupServiceTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\ObjectManager + */ + protected $_objectManager = null; + + /** + * @var \Magento\Customer\Service\V1\CustomerGroupServiceInterface + */ + protected $_groupService = null; + + protected function setUp() + { + + $this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->_groupService = $this->_objectManager->get('Magento\Customer\Service\V1\CustomerGroupServiceInterface'); + } + + protected function tearDown() + { + $this->_objectManager = null; + $this->_groupService = null; + } + + /** + * Cleaning up the extra groups that might have been created as part of the testing. + */ + public static function tearDownAfterClass() + { + /** @var \Magento\Customer\Service\V1\CustomerGroupServiceInterface $customerGroupService */ + $customerGroupService = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( + 'Magento\Customer\Service\V1\CustomerGroupServiceInterface' + ); + foreach ($customerGroupService->getGroups() as $group) { + if ($group->getId() > 3) { + $customerGroupService->deleteGroup($group->getId()); + } + } + } + + /** + */ + public function testGetGroups() + { + $groups = $this->_groupService->getGroups(); + $this->assertEquals(4, count($groups)); + $this->assertEquals( + [0, "NOT LOGGED IN", 3], + [$groups[0]->getId(), $groups[0]->getCode(), $groups[0]->getTaxClassId()] + ); + $this->assertEquals( + [1, "General", 3], + [$groups[1]->getId(), $groups[1]->getCode(), $groups[1]->getTaxClassId()] + ); + $this->assertEquals( + [2, "Wholesale", 3], + [$groups[2]->getId(), $groups[2]->getCode(), $groups[2]->getTaxClassId()] + ); + $this->assertEquals( + [3, "Retailer", 3], + [$groups[3]->getId(), $groups[3]->getCode(), $groups[3]->getTaxClassId()] + ); + } + + /** + */ + public function testGetGroupsFiltered() + { + $groups = $this->_groupService->getGroups(FALSE); + $this->assertEquals(3, count($groups)); + $this->assertEquals( + [1, "General", 3], + [$groups[0]->getId(), $groups[0]->getCode(), $groups[0]->getTaxClassId()] + ); + $this->assertEquals( + [2, "Wholesale", 3], + [$groups[1]->getId(), $groups[1]->getCode(), $groups[1]->getTaxClassId()] + ); + $this->assertEquals( + [3, "Retailer", 3], + [$groups[2]->getId(), $groups[2]->getCode(), $groups[2]->getTaxClassId()] + ); + } + + /** + * @param array $group + * @dataProvider getGroups + */ + public function testGetGroup($testGroup) + { + $group = $this->_groupService->getGroup($testGroup["id"]); + $this->assertEquals($testGroup["id"], $group->getId()); + $this->assertEquals($testGroup["code"], $group->getCode()); + $this->assertEquals($testGroup["taxClass"], $group->getTaxClassId()); + } + + public function testCreateGroup() + { + $group = new V1\Dto\CustomerGroup([ + 'id' => null, + 'code' => "Test Group", + 'tax_class_id' => 4 + ]); + $groupId = $this->_groupService->saveGroup($group); + $this->assertNotNull($groupId); + + $newGroup = $this->_groupService->getGroup($groupId); + $this->assertEquals($groupId, $newGroup->getId()); + $this->assertEquals($group->getCode(), $newGroup->getCode()); + $this->assertEquals($group->getTaxClassId(), $newGroup->getTaxClassId()); + } + + public function testUpdateGroup() + { + $group = new V1\Dto\CustomerGroup([ + 'id' => null, + 'code' => "New Group", + 'tax_class_id' => 4 + ]); + $groupId = $this->_groupService->saveGroup($group); + $this->assertNotNull($groupId); + + $newGroup = $this->_groupService->getGroup($groupId); + $this->assertEquals($groupId, $newGroup->getId()); + $this->assertEquals($group->getCode(), $newGroup->getCode()); + $this->assertEquals($group->getTaxClassId(), $newGroup->getTaxClassId()); + + $updates = new V1\Dto\CustomerGroup([ + 'id' => $groupId, + 'code' => "Updated Group", + 'tax_class_id' => 2 + ]); + $newId = $this->_groupService->saveGroup($updates); + $this->assertEquals($newId, $groupId); + $updatedGroup = $this->_groupService->getGroup($groupId); + $this->assertEquals($updates->getCode(), $updatedGroup->getCode()); + $this->assertEquals($updates->getTaxClassId(), $updatedGroup->getTaxClassId()); + } + + /** + * @return array + */ + public function getGroups() + { + return [ [["id" => 0, "code" => "NOT LOGGED IN", "taxClass" => 3]], + [["id" => 1, "code" => "General", "taxClass" => 3]], + [["id" => 2, "code" => "Wholesale", "taxClass" => 3]], + [["id" => 3, "code" => "Retailer", "taxClass" => 3]], + ]; + } +} diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a42fda2b25bf0dfafe4b4b1095205ec2e595b4be --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php @@ -0,0 +1,113 @@ +<?php +/** + * Integration test for service layer \Magento\Customer\Service\Eav\AttributeMetadataV1 + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1; + +class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Customer\Service\V1\CustomerServiceInterface */ + private $_customerService; + + /** @var \Magento\Customer\Service\V1\CustomerMetadataServiceInterface */ + private $_service; + + protected function setUp() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->_customerService = $objectManager->create('Magento\Customer\Service\V1\CustomerServiceInterface'); + $this->_service = $objectManager->create('Magento\Customer\Service\V1\CustomerMetadataServiceInterface'); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testGetCustomerAttributeMetadata() + { + // Expect these attributes to exist but do not check the value + $expectAttrsWOutVals = array('updated_at', 'created_at', 'password_hash'); + + // Expect these attributes to exist and check the value - values come from _files/customer.php + $expectAttrsWithVals = array( + 'entity_id' => '1', + 'entity_type_id' => '1', + 'attribute_set_id' => '1', + 'website_id' => '1', + 'store_id' => '1', + 'group_id' => '1', + 'disable_auto_group_change' => '0', + 'firstname' => 'Firstname', + 'lastname' => 'Lastname', + 'email' => 'customer@example.com', + 'default_billing' => '1', + 'default_shipping' => '1', + ); + + $customer = $this->_customerService->getCustomer(1); + $this->assertNotNull($customer); + + $attributes = $customer->getAttributes(); + $this->assertNotEmpty($attributes); + + foreach ($attributes as $attributeCode => $attributeValue) { + $this->assertNotNull($attributeCode); + $this->assertNotNull($attributeValue); + $attributeMetadata = $this->_service->getCustomerAttributeMetadata($attributeCode); + $attrMetadataCode = $attributeMetadata->getAttributeCode(); + $this->assertSame($attributeCode, $attrMetadataCode); + if (($key = array_search($attrMetadataCode, $expectAttrsWOutVals)) !== false) { + unset($expectAttrsWOutVals[$key]); + } else { + $this->assertArrayHasKey($attrMetadataCode, $expectAttrsWithVals); + $this->assertSame( + $expectAttrsWithVals[$attrMetadataCode], + $attributeValue, + "Failed for $attrMetadataCode" + ); + unset($expectAttrsWithVals[$attrMetadataCode]); + } + } + $this->assertEmpty($expectAttrsWOutVals); + $this->assertEmpty($expectAttrsWithVals); + } + + public function testAttributeMetadataCached() + { + $firstCallMetadata = $this->_service->getAddressAttributeMetadata('firstname'); + $secondCallMetadata = $this->_service->getAddressAttributeMetadata('firstname'); + + $this->assertSame($firstCallMetadata, $secondCallMetadata); + + } + + public function testGetAddressAttributeMetadata() + { + $vatValidMetadata = $this->_service->getAddressAttributeMetadata('vat_is_valid'); + + $this->assertNotNull($vatValidMetadata); + $this->assertEquals('vat_is_valid', $vatValidMetadata->getAttributeCode()); + $this->assertEquals('text', $vatValidMetadata->getFrontendInput()); + $this->assertEquals('VAT number validity', $vatValidMetadata->getStoreLabel()); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..5395bf9aacffc51fb4dd91a467a06769187be376 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php @@ -0,0 +1,596 @@ +<?php + +namespace Magento\Customer\Service\V1; +use Magento\Customer\Service\Entity\V1\Exception; +use Magento\Customer\Service\V1; + +/** + * Integration test for service layer \Magento\Customer\Service\CustomerV1 + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * + * @SuppressWarnings(PHPMD.TooManyMethods) + * @SuppressWarnings(PHPMD.ExcessivePublicCount) + */ +class CustomerServiceTest extends \PHPUnit_Framework_TestCase +{ + /** @var CustomerServiceInterface */ + private $_service; + + /** @var CustomerAccountServiceInterface Needed for password checking */ + private $_accountService; + + /** @var \Magento\ObjectManager */ + private $_objectManager; + + /** @var \Magento\Customer\Service\V1\Dto\Address[] */ + private $_expectedAddresses; + + /** @var \Magento\Customer\Service\V1\Dto\AddressBuilder */ + private $_addressBuilder; + + /** @var \Magento\Customer\Service\V1\Dto\CustomerBuilder */ + private $_customerBuilder; + + protected function setUp() + { + $this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->_service = $this->_objectManager->create('Magento\Customer\Service\V1\CustomerServiceInterface'); + $this->_accountService = $this->_objectManager + ->create('Magento\Customer\Service\V1\CustomerAccountServiceInterface'); + + $this->_addressBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\AddressBuilder'); + $this->_customerBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\CustomerBuilder'); + + $this->_addressBuilder->setId(1) + ->setCountryId('US') + ->setCustomerId(1) + ->setDefaultBilling(true) + ->setDefaultShipping(true) + ->setPostcode('75477') + ->setRegion(new V1\Dto\Region([ + 'region_code' => 'AL', + 'region' => 'Alabama', + 'region_id' => 1 + ])) + ->setStreet(['Green str, 67']) + ->setTelephone('3468676') + ->setCity('CityM') + ->setFirstname('John') + ->setLastname('Smith'); + $address = $this->_addressBuilder->create(); + + /* XXX: would it be better to have a clear method for this? */ + $this->_addressBuilder->setId(2) + ->setCountryId('US') + ->setCustomerId(1) + ->setDefaultBilling(false) + ->setDefaultShipping(false) + ->setPostcode('47676') + ->setRegion(new V1\Dto\Region([ + 'region_code' => 'AL', + 'region' => 'Alabama', + 'region_id' => 1 + ])) + ->setStreet(['Black str, 48']) + ->setCity('CityX') + ->setTelephone('3234676') + ->setFirstname('John') + ->setLastname('Smith'); + $address2 = $this->_addressBuilder->create(); + + $this->_expectedAddresses = [$address, $address2]; + } + + /** + * @param mixed $custId + * @dataProvider invalidCustomerIdsDataProvider + * @expectedException Exception + * @expectedExceptionMessage customerId + */ + public function testInvalidCustomerIds($custId) + { + $this->_service->getCustomer($custId); + } + + public function invalidCustomerIdsDataProvider() + { + return array( + array('ab'), + array(' '), + array(-1), + array(0), + array(' 1234'), + array('-1'), + array('0'), + ); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testGetCustomerCached() + { + $firstCall = $this->_service->getCustomer(1); + $secondCall = $this->_service->getCustomer(1); + + $this->assertSame($firstCall, $secondCall); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoAppIsolation enabled + */ + public function testGetCustomer() + { + // _files/customer.php sets the customer id to 1 + $customer = $this->_service->getCustomer(1); + + // All these expected values come from _files/customer.php fixture + $this->assertEquals(1, $customer->getCustomerId()); + $this->assertEquals('customer@example.com', $customer->getEmail()); + $this->assertEquals('Firstname', $customer->getFirstname()); + $this->assertEquals('Lastname', $customer->getLastname()); + } + + /** + * @expectedException Exception + * @expectedExceptionMessage No customer with customerId 1 exists. + */ + public function testGetCustomerNotExist() + { + // No fixture, so customer with id 1 shouldn't exist, exception should be thrown + $this->_service->getCustomer(1); + } + + /** + * @magentoAppArea frontend + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testSaveCustomer() + { + $existingCustId = 1; + + $email = 'savecustomer@example.com'; + $firstName = 'Firstsave'; + $lastname = 'Lastsave'; + + $customerBefore = $this->_service->getCustomer($existingCustId); + + $customerData = array_merge($customerBefore->__toArray(), array( + 'id' => 1, + 'email' => $email, + 'firstname' => $firstName, + 'lastname' => $lastname, + 'created_in' => 'Admin', + 'password' => 'notsaved' + )); + $this->_customerBuilder->populateWithArray($customerData); + $modifiedCustomer = $this->_customerBuilder->create(); + + $returnedCustomerId = $this->_service->saveCustomer($modifiedCustomer, 'aPassword'); + $this->assertEquals($existingCustId, $returnedCustomerId); + $customerAfter = $this->_service->getCustomer($existingCustId); + $this->assertEquals($email, $customerAfter->getEmail()); + $this->assertEquals($firstName, $customerAfter->getFirstname()); + $this->assertEquals($lastname, $customerAfter->getLastname()); + $this->assertEquals('Admin', $customerAfter->getAttribute('created_in')); + $this->_accountService->authenticate( + $customerAfter->getEmail(), + 'aPassword', + true + ); + $attributesBefore = $customerBefore->getAttributes(); + $attributesAfter = $customerAfter->getAttributes(); + // ignore 'updated_at' + unset($attributesBefore['updated_at']); + unset($attributesAfter['updated_at']); + $inBeforeOnly = array_diff_assoc($attributesBefore, $attributesAfter); + $inAfterOnly = array_diff_assoc($attributesAfter, $attributesBefore); + $expectedInBefore = array( + 'firstname', + 'lastname', + 'email', + 'password_hash', + ); + $this->assertEquals($expectedInBefore, array_keys($inBeforeOnly)); + $this->assertContains('created_in', array_keys($inAfterOnly)); + $this->assertContains('firstname', array_keys($inAfterOnly)); + $this->assertContains('lastname', array_keys($inAfterOnly)); + $this->assertContains('email', array_keys($inAfterOnly)); + $this->assertContains('password_hash', array_keys($inAfterOnly)); + } + + /** + * @magentoAppArea frontend + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testSaveCustomerWithoutChangingPassword() + { + $existingCustId = 1; + + $email = 'savecustomer@example.com'; + $firstName = 'Firstsave'; + $lastName = 'Lastsave'; + + $customerBefore = $this->_service->getCustomer($existingCustId); + $customerData = array_merge($customerBefore->__toArray(), + [ + 'id' => 1, + 'email' => $email, + 'firstname' => $firstName, + 'lastname' => $lastName, + 'created_in' => 'Admin' + ] + ); + $this->_customerBuilder->populateWithArray($customerData); + $modifiedCustomer = $this->_customerBuilder->create(); + + $returnedCustomerId = $this->_service->saveCustomer($modifiedCustomer); + $this->assertEquals($existingCustId, $returnedCustomerId); + $customerAfter = $this->_service->getCustomer($existingCustId); + $this->assertEquals($email, $customerAfter->getEmail()); + $this->assertEquals($firstName, $customerAfter->getFirstname()); + $this->assertEquals($lastName, $customerAfter->getLastname()); + $this->assertEquals('Admin', $customerAfter->getAttribute('created_in')); + $this->_accountService->authenticate( + $customerAfter->getEmail(), + 'password', + true + ); + $attributesBefore = $customerBefore->getAttributes(); + $attributesAfter = $customerAfter->getAttributes(); + // ignore 'updated_at' + unset($attributesBefore['updated_at']); + unset($attributesAfter['updated_at']); + $inBeforeOnly = array_diff_assoc($attributesBefore, $attributesAfter); + $inAfterOnly = array_diff_assoc($attributesAfter, $attributesBefore); + $expectedInBefore = array( + 'firstname', + 'lastname', + 'email', + ); + sort($expectedInBefore); + $actualInBeforeOnly = array_keys($inBeforeOnly); + sort($actualInBeforeOnly); + $this->assertEquals($expectedInBefore, $actualInBeforeOnly); + $expectedInAfter = array( + 'firstname', + 'lastname', + 'email', + 'created_in', + ); + sort($expectedInAfter); + $actualInAfterOnly = array_keys($inAfterOnly); + sort($actualInAfterOnly); + $this->assertEquals($expectedInAfter, $actualInAfterOnly); + } + + /** + * @magentoAppArea frontend + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testSaveCustomerPasswordCannotSetThroughAttributeSetting() + { + $existingCustId = 1; + + $email = 'savecustomer@example.com'; + $firstName = 'Firstsave'; + $lastName = 'Lastsave'; + + $customerBefore = $this->_service->getCustomer($existingCustId); + $customerData = array_merge($customerBefore->__toArray(), + [ + 'id' => 1, + 'email' => $email, + 'firstname' => $firstName, + 'lastname' => $lastName, + 'created_in' => 'Admin', + 'password' => 'aPassword' + ] + ); + $this->_customerBuilder->populateWithArray($customerData); + $modifiedCustomer = $this->_customerBuilder->create(); + + $returnedCustomerId = $this->_service->saveCustomer($modifiedCustomer); + $this->assertEquals($existingCustId, $returnedCustomerId); + $customerAfter = $this->_service->getCustomer($existingCustId); + $this->assertEquals($email, $customerAfter->getEmail()); + $this->assertEquals($firstName, $customerAfter->getFirstname()); + $this->assertEquals($lastName, $customerAfter->getLastname()); + $this->assertEquals('Admin', $customerAfter->getAttribute('created_in')); + $this->_accountService->authenticate( + $customerAfter->getEmail(), + 'password', + true + ); + $attributesBefore = $customerBefore->getAttributes(); + $attributesAfter = $customerAfter->getAttributes(); + // ignore 'updated_at' + unset($attributesBefore['updated_at']); + unset($attributesAfter['updated_at']); + $inBeforeOnly = array_diff_assoc($attributesBefore, $attributesAfter); + $inAfterOnly = array_diff_assoc($attributesAfter, $attributesBefore); + $expectedInBefore = array( + 'firstname', + 'lastname', + 'email', + ); + sort($expectedInBefore); + $actualInBeforeOnly = array_keys($inBeforeOnly); + sort($actualInBeforeOnly); + $this->assertEquals($expectedInBefore, $actualInBeforeOnly); + $expectedInAfter = array( + 'firstname', + 'lastname', + 'email', + 'created_in', + ); + sort($expectedInAfter); + $actualInAfterOnly = array_keys($inAfterOnly); + sort($actualInAfterOnly); + $this->assertEquals($expectedInAfter, $actualInAfterOnly); + } + + /** + * @magentoDbIsolation enabled + * @expectedException \Magento\Validator\ValidatorException + * @expectedExceptionMessage Please correct this email address + */ + public function testSaveCustomerException() + { + $customerData = [ + 'id' => 1, + 'password' => 'aPassword' + ]; + $this->_customerBuilder->populateWithArray($customerData); + $customerEntity = $this->_customerBuilder->create(); + + try { + $this->_service->saveCustomer($customerEntity); + } catch (Exception $e) { + $this->assertEquals('There were one or more errors validating the customer object.', $e->getMessage()); + $this->assertEquals(Exception::CODE_VALIDATION_FAILED, $e->getCode()); + throw $e->getPrevious(); + } + } + + /** + * @magentoAppArea frontend + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testSaveNonexistingCustomer() + { + $existingCustId = 1; + $existingCustomer = $this->_service->getCustomer($existingCustId); + + $newCustId = 2; + $email = 'savecustomer@example.com'; + $firstName = 'Firstsave'; + $lastName = 'Lastsave'; + $customerData = array_merge($existingCustomer->__toArray(), + [ + 'id' => $newCustId, + 'email' => $email, + 'firstname' => $firstName, + 'lastname' => $lastName, + 'created_in' => 'Admin' + ] + ); + $this->_customerBuilder->populateWithArray($customerData); + $customerEntity = $this->_customerBuilder->create(); + + $customerId = $this->_service->saveCustomer($customerEntity, 'aPassword'); + $this->assertEquals($newCustId, $customerId); + $customerAfter = $this->_service->getCustomer($customerId); + $this->assertEquals($email, $customerAfter->getEmail()); + $this->assertEquals($firstName, $customerAfter->getFirstname()); + $this->assertEquals($lastName, $customerAfter->getLastname()); + $this->assertEquals('Admin', $customerAfter->getAttribute('created_in')); + $this->_accountService->authenticate( + $customerAfter->getEmail(), + 'aPassword', + true + ); + $attributesBefore = $existingCustomer->getAttributes(); + $attributesAfter = $customerAfter->getAttributes(); + // ignore 'updated_at' + unset($attributesBefore['updated_at']); + unset($attributesAfter['updated_at']); + unset($attributesAfter['reward_update_notification']); + unset($attributesAfter['reward_warning_notification']); + $inBeforeOnly = array_diff_assoc($attributesBefore, $attributesAfter); + $inAfterOnly = array_diff_assoc($attributesAfter, $attributesBefore); + $expectedInBefore = array( + 'firstname', + 'lastname', + 'email', + 'entity_id', + 'password_hash', + ); + sort($expectedInBefore); + $actualInBeforeOnly = array_keys($inBeforeOnly); + sort($actualInBeforeOnly); + $this->assertEquals($expectedInBefore, $actualInBeforeOnly); + $expectedInAfter = array( + 'firstname', + 'lastname', + 'email', + 'entity_id', + 'created_in', + 'password_hash', + ); + sort($expectedInAfter); + $actualInAfterOnly = array_keys($inAfterOnly); + sort($actualInAfterOnly); + $this->assertEquals($expectedInAfter, $actualInAfterOnly); + } + + /** + * @magentoDbIsolation enabled + */ + public function testSaveCustomerInServiceVsInModel() + { + $email = 'email@example.com'; + $email2 = 'email2@example.com'; + $firstname = 'Tester'; + $lastname = 'McTest'; + $groupId = 1; + $password = 'aPassword'; + + /** @var \Magento\Customer\Model\Customer $customerModel */ + $customerModel = $this->_objectManager->create('Magento\Customer\Model\CustomerFactory') + ->create(); + $customerModel->setEmail($email) + ->setFirstname($firstname) + ->setLastname($lastname) + ->setGroupId($groupId) + ->setPassword($password); + $customerModel->save(); + /** @var \Magento\Customer\Model\Customer $customerModel */ + $savedModel = $this->_objectManager->create('Magento\Customer\Model\CustomerFactory') + ->create() + ->load($customerModel->getId()); + $dataInModel = $savedModel->getData(); + + $this->_customerBuilder->setEmail($email2) + ->setFirstname($firstname) + ->setLastname($lastname) + ->setGroupId($groupId); + $newCustomerEntity = $this->_customerBuilder->create(); + $customerId = $this->_service->saveCustomer($newCustomerEntity, $password); + $this->assertNotNull($customerId); + $savedCustomer = $this->_service->getCustomer($customerId); + $dataInService = $savedCustomer->getAttributes(); + foreach ($dataInModel as $key => $value) { + if (!in_array( + $key, + array('created_at', 'updated_at', 'email', 'is_active', 'entity_id', 'password_hash', + 'attribute_set_id') + )) { + if (is_null($value)) { + $this->assertArrayNotHasKey($key, $dataInService); + } else { + $this->assertEquals($value, $dataInService[$key], 'Failed asserting value for '. $key); + } + } + } + $this->assertArrayNotHasKey('is_active', $dataInService); + $this->assertNotNull($dataInService['created_at']); + $this->assertNotNull($dataInService['updated_at']); + $this->assertNotNull($dataInService['entity_id']); + $this->assertNotNull($dataInService['password_hash']); + $this->assertEquals($email2, $dataInService['email']); + } + + /** + * @magentoDbIsolation enabled + */ + public function testSaveNewCustomer() + { + $email = 'email@example.com'; + $storeId = 1; + $firstname = 'Tester'; + $lastname = 'McTest'; + $groupId = 1; + + $this->_customerBuilder->setStoreId($storeId) + ->setEmail($email) + ->setFirstname($firstname) + ->setLastname($lastname) + ->setGroupId($groupId); + $newCustomerEntity = $this->_customerBuilder->create(); + $customerId = $this->_service->saveCustomer($newCustomerEntity, 'aPassword'); + $this->assertNotNull($customerId); + $savedCustomer = $this->_service->getCustomer($customerId); + $this->assertEquals($email, $savedCustomer->getEmail()); + $this->assertEquals($storeId, $savedCustomer->getStoreId()); + $this->assertEquals($firstname, $savedCustomer->getFirstname()); + $this->assertEquals($lastname, $savedCustomer->getLastname()); + $this->assertEquals($groupId, $savedCustomer->getGroupId()); + $this->assertTrue(!$savedCustomer->getSuffix()); + } + + /** + * @magentoAppArea frontend + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testSaveNewCustomerFromClone() + { + $email = 'savecustomer@example.com'; + $firstName = 'Firstsave'; + $lastname = 'Lastsave'; + + $existingCustId = 1; + $existingCustomer = $this->_service->getCustomer($existingCustId); + $customerData = array_merge($existingCustomer->__toArray(), + [ + 'email' => $email, + 'firstname' => $firstName, + 'lastname' => $lastname, + 'created_in' => 'Admin' + ] + ); + $this->_customerBuilder->populateWithArray($customerData); + $customerEntity = $this->_customerBuilder->create(); + + $customerId = $this->_service->saveCustomer($customerEntity, 'aPassword'); + $this->assertNotEmpty($customerId); + $customer = $this->_service->getCustomer($customerId); + $this->assertEquals($email, $customer->getEmail()); + $this->assertEquals($firstName, $customer->getFirstname()); + $this->assertEquals($lastname, $customer->getLastname()); + $this->assertEquals('Admin', $customer->getAttribute('created_in')); + $this->_accountService->authenticate( + $customer->getEmail(), + 'aPassword', + true + ); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + */ + public function testSaveCustomerRpToken() + { + $this->_customerBuilder->populateWithArray(array_merge($this->_service->getCustomer(1)->__toArray(), [ + 'rp_token' => 'token', + 'rp_token_created_at' => '2013-11-05' + ])); + $customer = $this->_customerBuilder->create(); + $this->_service->saveCustomer($customer); + + // Empty current reset password token i.e. invalidate it + $this->_customerBuilder->populateWithArray(array_merge($this->_service->getCustomer(1)->__toArray(), [ + 'rp_token' => null, + 'rp_token_created_at' => null + ])); + $this->_customerBuilder->setConfirmation(null); + $customer = $this->_customerBuilder->create(); + + $this->_service->saveCustomer($customer, 'password'); + + $customer = $this->_service->getCustomer(1); + $this->assertEquals('Firstname', $customer->getFirstname()); + $this->assertNull($customer->getAttribute('rp_token')); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/customer.php b/dev/tests/integration/testsuite/Magento/Customer/_files/customer.php index f640fe7342733a8ee264195aa8b77cfeeb168e25..3f29b8530339b22410dfc7cde2fa339a84d2ca57 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/_files/customer.php +++ b/dev/tests/integration/testsuite/Magento/Customer/_files/customer.php @@ -28,9 +28,9 @@ $customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\Customer\Model\Customer'); $customer ->setWebsiteId(1) - ->setEntityId(1) + ->setId(1) ->setEntityTypeId(1) - ->setAttributeSetId(0) + ->setAttributeSetId(1) ->setEmail('customer@example.com') ->setPassword('password') ->setGroupId(1) diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_address.php b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_address.php index 451fa32fb5708a02cddd55b8f60c3e2f5c269dab..5b8aac69eed224d42fd5a53c3fe877546cb2a040 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_address.php +++ b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_address.php @@ -31,13 +31,15 @@ $customerAddress->isObjectNew(true); $customerAddress->setCustomerId(1) ->setData(array( 'entity_id' => 1, + 'attribute_set_id' => 2, 'telephone' => 3468676, 'postcode' => 75477, - 'country_id' => 'AL', + 'country_id' => 'US', 'city' => 'CityM', 'street' => 'Green str, 67', 'lastname' => 'Smith', 'firstname' => 'John', - 'parent_id' => 1 + 'parent_id' => 1, + 'region_id' => 1 )); $customerAddress->save(); diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_two_addresses.php b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_two_addresses.php index de427f9497dc51f08b1311a3b77e6e9ee4a772c3..5ac194c7aec2905a2817f7c8ca62ce046ec3384b 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_two_addresses.php +++ b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_two_addresses.php @@ -33,13 +33,15 @@ $customerAddress->isObjectNew(true); $customerAddress->setCustomerId(1) ->setData(array( 'entity_id' => 2, + 'attribute_set_id' => 2, 'telephone' => 3234676, 'postcode' => 47676, - 'country_id' => 'AL', + 'country_id' => 'US', 'city' => 'CityX', 'street' => 'Black str, 48', 'lastname' => 'Smith', 'firstname' => 'John', - 'parent_id' => 1 + 'parent_id' => 1, + 'region_id' => 1 )); $customerAddress->save(); diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/inactive_customer.php b/dev/tests/integration/testsuite/Magento/Customer/_files/inactive_customer.php new file mode 100644 index 0000000000000000000000000000000000000000..ebddc5f3b74907a51cc05fa8d30193d1762cfc3d --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Customer/_files/inactive_customer.php @@ -0,0 +1,44 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento_Customer + * @subpackage integration_tests + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +$customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Customer\Model\Customer'); +$customer + ->setWebsiteId(1) + ->setId(1) + ->setConfirmation($customer->getRandomConfirmationKey()) + ->setEntityTypeId(1) + ->setAttributeSetId(0) + ->setEmail('customer@needAconfirmation.com') + ->setPassword('password') + ->setGroupId(1) + ->setStoreId(1) + ->setFirstname('Firstname') + ->setLastname('Lastname') + ->setDefaultBilling(1) + ->setDefaultShipping(1); +$customer->isObjectNew(true); +$customer->save(); diff --git a/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/ObserverTest.php b/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/ObserverTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e2b940346ae30f63b015e8f6651d0dd206593af8 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/ObserverTest.php @@ -0,0 +1,51 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\GoogleShopping\Model; + +class ObserverTest extends \PHPUnit_Framework_TestCase +{ + /** + * @magentoDataFixture Magento/GoogleShopping/Model/_files/flag_expired.php + */ + public function testCheckSynchronizationOperationsWithExpiredFlag() + { + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + + /** @var \Magento\AdminNotification\Model\Inbox $inbox */ + $inbox = $objectManager->create('Magento\AdminNotification\Model\Inbox'); + $notice = $inbox->loadLatestNotice(); + $this->assertNotContains('Google Shopping', (string)$notice->getTitle()); + + /** @var \Magento\GoogleShopping\Model\Observer $observer */ + $observer = $objectManager->get('Magento\GoogleShopping\Model\Observer'); + $dummyEventData = $this->getMock('\Magento\Event\Observer', array(), array(), '', false); + $result = $observer->checkSynchronizationOperations($dummyEventData); + + $this->assertSame($observer, $result); + + $notice = $inbox->loadLatestNotice(); + $this->assertContains('Google Shopping', (string)$notice->getTitle()); + } +} diff --git a/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/_files/flag_expired.php b/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/_files/flag_expired.php new file mode 100644 index 0000000000000000000000000000000000000000..971394ce5241b3fec21b750fa2b9aa83560da063 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/_files/flag_expired.php @@ -0,0 +1,38 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Expired flag for the google shopping synchronization + */ +$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + + /** @var $flag \Magento\GoogleShopping\Model\Flag */ +$flag = $objectManager->create('Magento\GoogleShopping\Model\Flag'); +$flag->lock(); + +/** @var $flagResource \Magento\Core\Model\Resource\Flag */ +$flagResource = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Core\Model\Resource\Flag'); +$flag->setLastUpdate(date('Y-m-d H:i:s', time() - \Magento\GoogleShopping\Model\Flag::FLAG_TTL - 1)); +$flagResource->save($flag); diff --git a/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php b/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php index 4a5b37614b1428fd71bbaecb0d81d7b7bb78bf8a..2b36d5f27cf157c9ae8b545834af90b10bf9afd7 100644 --- a/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php +++ b/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php @@ -70,6 +70,19 @@ class UserTest extends \PHPUnit_Framework_TestCase $crud->testCrud(); } + /** + * @magentoDataFixture Magento/User/_files/dummy_user.php + */ + public function testCreatedOnUpdate() + { + $this->_model->loadByUsername('user_created_date'); + $this->assertEquals('2010-01-06 00:00:00', $this->_model->getCreated()); + //reload to update lognum record + $this->_model->getResource()->recordLogin($this->_model); + $this->_model->reload(); + $this->assertEquals('2010-01-06 00:00:00', $this->_model->getCreated()); + } + /** * Ensure that an exception is not thrown, if the user does not exist */ diff --git a/dev/tests/integration/testsuite/Magento/User/_files/dummy_user.php b/dev/tests/integration/testsuite/Magento/User/_files/dummy_user.php index 37a4a1f9140213c7f20ae71d7ea864eeafb8fc1e..5be6390a35eba12bb520e70acdc427f0787dfe2a 100644 --- a/dev/tests/integration/testsuite/Magento/User/_files/dummy_user.php +++ b/dev/tests/integration/testsuite/Magento/User/_files/dummy_user.php @@ -38,3 +38,20 @@ $user->setFirstname('Dummy') ->setUsername('dummy_username') ->setPassword('dummy_password1') ->save(); + + +\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Core\Model\App') + ->loadArea(\Magento\Backend\App\Area\FrontNameResolver::AREA_CODE); +$user = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\User\Model\User'); +$user->setFirstname('CreateDate') + ->setLastname('User 2') + ->setEmail('dummy2@dummy.com') + ->setUsername('user_created_date') + ->setPassword('dummy_password2') + ->save(); +$user = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\User\Model\User'); +$user->loadByUsername('user_created_date'); +$user->setCreated('2010-01-06 00:00:00'); +$user->save(); \ No newline at end of file diff --git a/dev/tests/js/jsTestDriverOrder.php b/dev/tests/js/jsTestDriverOrder.php index e55724a1c6f3ee2dbad2375be5190877862ce65a..7fe3e7f813902dfa98532a645f5c611c8c6b1be9 100644 --- a/dev/tests/js/jsTestDriverOrder.php +++ b/dev/tests/js/jsTestDriverOrder.php @@ -32,7 +32,7 @@ return array( '/pub/lib/jquery/jquery.js', '/pub/lib/jquery/jquery-ui.js', '/pub/lib/jquery/jquery.cookie.js', - '/pub/lib/head.load.min.js', + '/pub/lib/headjs/head.load.min.js', '/pub/lib/mage/mage.js', '/pub/lib/mage/decorate.js', '/pub/lib/jquery/jquery.validate.js', diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/Files.php b/dev/tests/static/framework/Magento/TestFramework/Utility/Files.php index 49d9b988868eb162186aa603123fe9e1a8da4aec..ec14f402d8db33904934beda634e93fb09b2ad12 100644 --- a/dev/tests/static/framework/Magento/TestFramework/Utility/Files.php +++ b/dev/tests/static/framework/Magento/TestFramework/Utility/Files.php @@ -47,17 +47,25 @@ class Files protected $_path = ''; /** - * Setter/Getter for an instance of self + * Setter for an instance of self + * + * Also can unset the current instance, if no arguments are specified + * + * @param Files|null $instance + */ + public static function setInstance(Files $instance = null) + { + self::$_instance = $instance; + } + + /** + * Getter for an instance of self * - * @param \Magento\TestFramework\Utility\Files $instance * @return \Magento\TestFramework\Utility\Files * @throws \Exception when there is no instance set */ - public static function init(\Magento\TestFramework\Utility\Files $instance = null) + public static function init() { - if ($instance) { - self::$_instance = $instance; - } if (!self::$_instance) { throw new \Exception('Instance is not set yet.'); } @@ -633,8 +641,9 @@ class Files /** * Use realpath() instead of file_exists() to avoid incorrect work on Windows because of case insensitivity * of file names + * Note that realpath() automatically changes directory separator to the OS-native */ - if (realpath($fullPath) == $fullPath) { + if (realpath($fullPath) == str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $fullPath)) { $fileContent = file_get_contents($fullPath); if (strpos($fileContent, 'namespace ' . $namespace) !== false && (strpos($fileContent, 'class ' . $className) !== false || @@ -715,4 +724,39 @@ class Files return self::$_cache[$key]; } + + /** + * Read all text files by specified glob pattern and combine them into an array of valid files/directories + * + * The Magento root path is prepended to all (non-empty) entries + * + * @param string $globPattern + * @return array + * @throws \Exception if any of the patterns don't return any result + */ + public static function readLists($globPattern) + { + $patterns = array(); + foreach (glob($globPattern) as $list) { + $patterns = array_merge($patterns, file($list, FILE_IGNORE_NEW_LINES)); + } + + // Expand glob patterns + $result = array(); + foreach ($patterns as $pattern) { + if (0 === strpos($pattern, '#')) { + continue; + } + /** + * Note that glob() for directories will be returned as is, + * but passing directory is supported by the tools (phpcpd, phpmd, phpcs) + */ + $files = glob(self::init()->getPathToSource() . '/' . $pattern, GLOB_BRACE); + if (empty($files)) { + throw new \Exception("The glob() pattern '{$pattern}' didn't return any result."); + } + $result = array_merge($result, $files); + } + return $result; + } } diff --git a/dev/tests/static/framework/bootstrap.php b/dev/tests/static/framework/bootstrap.php index 336db8defe5e60219ef18ede6ee281b93c8f220e..17c46092271893331a1bc1634d0c2a75908f1365 100644 --- a/dev/tests/static/framework/bootstrap.php +++ b/dev/tests/static/framework/bootstrap.php @@ -32,7 +32,7 @@ require BP . '/app/autoload.php'; dirname(__DIR__) . '/testsuite', BP . '/lib', )); -\Magento\TestFramework\Utility\Files::init(new \Magento\TestFramework\Utility\Files(BP)); +\Magento\TestFramework\Utility\Files::setInstance(new \Magento\TestFramework\Utility\Files(BP)); function tool_autoloader($className) { diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FilesTest.php b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FilesTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a55af184b5cefb0b02e331e85fb95c3c3cc89cc2 --- /dev/null +++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FilesTest.php @@ -0,0 +1,83 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\TestFramework\Utility; + +class FilesTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var string + */ + private static $baseDir; + + public static function setUpBeforeClass() + { + self::$baseDir = __DIR__ . '/_files/foo'; + Files::setInstance(new Files(self::$baseDir)); + } + + public static function tearDownAfterClass() + { + Files::setInstance(); + } + + public function testReadLists() + { + $result = Files::init()->readLists(__DIR__ . '/_files/*good.txt'); + + // the braces + $this->assertContains(self::$baseDir . '/one.txt', $result); + $this->assertContains(self::$baseDir . '/two.txt', $result); + + // directory is returned as-is, without expanding contents recursively + $this->assertContains(self::$baseDir . '/bar', $result); + + // the * wildcard + $this->assertContains(self::$baseDir . '/baz/one.txt', $result); + $this->assertContains(self::$baseDir . '/baz/two.txt', $result); + } + + public function testReadListsWrongPattern() + { + $this->assertSame(array(), Files::init()->readLists(__DIR__ . '/_files/no_good.txt')); + } + + /** + * @expectedException \Exception + * @expectedExceptionMessage The glob() pattern 'bar/unknown' didn't return any result. + */ + public function testReadListsCorruptedDir() + { + Files::init()->readLists(__DIR__ . '/_files/list_corrupted_dir.txt'); + } + + /** + * @expectedException \Exception + * @expectedExceptionMessage The glob() pattern 'unknown.txt' didn't return any result. + */ + public function testReadListsCorruptedFile() + { + Files::init()->readLists(__DIR__ . '/_files/list_corrupted_file.txt'); + } +} diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/one.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/one.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/recursive/one.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/recursive/one.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/recursive/two.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/recursive/two.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/two.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/two.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/baz/one.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/baz/one.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/baz/two.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/baz/two.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/one.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/one.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/two.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/two.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_dir.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_dir.txt new file mode 100644 index 0000000000000000000000000000000000000000..547500b58830b01accba1ca756bacf0ec6acecd9 --- /dev/null +++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_dir.txt @@ -0,0 +1,2 @@ +one.txt +bar/unknown diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_file.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_file.txt new file mode 100644 index 0000000000000000000000000000000000000000..290ae97cdbc16c8de15adb307cb18933a01644df --- /dev/null +++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_file.txt @@ -0,0 +1,3 @@ +one.txt +two.txt +unknown.txt diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_good.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_good.txt new file mode 100644 index 0000000000000000000000000000000000000000..f7681982e34d1b23cf9d7758176d22d3676c4d40 --- /dev/null +++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_good.txt @@ -0,0 +1,4 @@ +# comments are ignored +{one,two}.txt +bar +baz/*.txt diff --git a/dev/tests/static/testsuite/Magento/Test/Js/LiveCodeTest.php b/dev/tests/static/testsuite/Magento/Test/Js/LiveCodeTest.php index af0e3a74d3d4397a3df75faac31417d54cafc550..030df32fe46f03499fe879e9bb8950fc54a53ec6 100644 --- a/dev/tests/static/testsuite/Magento/Test/Js/LiveCodeTest.php +++ b/dev/tests/static/testsuite/Magento/Test/Js/LiveCodeTest.php @@ -24,11 +24,17 @@ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ +namespace Magento\Test\Js; + /** - * JSHint static code analysis tests for javascript files + * Duplicating the same namespace in the "use" below is a workaround to comply with + * \Magento\Test\Integrity\ClassesTest::testClassReferences() */ -namespace Magento\Test\Js; +use Magento\TestFramework\Utility\Files, Magento\TestFramework\Utility\AggregateInvoker; +/** + * JSHint static code analysis tests for javascript files + */ class LiveCodeTest extends \PHPUnit_Framework_TestCase { /** @@ -72,14 +78,14 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase */ public static function setUpBeforeClass() { - $reportDir = \Magento\TestFramework\Utility\Files::init()->getPathToSource() . '/dev/tests/static/report'; + $reportDir = Files::init()->getPathToSource() . '/dev/tests/static/report'; if (!is_dir($reportDir)) { mkdir($reportDir, 0777); } self::$_reportFile = $reportDir . '/js_report.txt'; @unlink(self::$_reportFile); - $whiteList = self::_readLists(__DIR__ . '/_files/whitelist/*.txt'); - $blackList = self::_readLists(__DIR__ . '/_files/blacklist/*.txt'); + $whiteList = Files::readLists(__DIR__ . '/_files/whitelist/*.txt'); + $blackList = Files::readLists(__DIR__ . '/_files/blacklist/*.txt'); foreach ($blackList as $listFiles) { self::$_blackListJsFiles = array_merge(self::$_blackListJsFiles, self::_scanJsFile($listFiles)); } @@ -95,7 +101,7 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase public function testCodeJsHint() { - $invoker = new \Magento\TestFramework\Utility\AggregateInvoker($this); + $invoker = new AggregateInvoker($this); $invoker( /** * @param string $filename @@ -128,25 +134,4 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase }; return array_map($map, self::$_whiteListJsFiles); } - - /** - * Read all text files by specified glob pattern and combine them into an array of valid files/directories - * - * The Magento root path is prepended to all (non-empty) entries - * - * @param string $globPattern - * @return array - */ - protected static function _readLists($globPattern) - { - $result = array(); - foreach (glob($globPattern) as $list) { - $result = array_merge($result, file($list)); - } - $map = function ($value) { - return trim($value) ? - \Magento\TestFramework\Utility\Files::init()->getPathToSource() . '/' . trim($value) : ''; - }; - return array_filter(array_map($map, $result), 'file_exists'); - } } diff --git a/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/core.txt b/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/core.txt index 9ac33494f34e4ec91b5d08ef639eb8df3e012ee6..0b919ec4ec732569496d5bcf66342b1a951b29de 100644 --- a/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/core.txt +++ b/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/core.txt @@ -1,20 +1,20 @@ -pub/lib/head.load.min.js -pub/lib/mage/adminhtml -pub/lib/mage/backend/editablemultiselect.js -pub/lib/mage/captcha.js -pub/lib/mage/directpost.js -pub/lib/mage/jquery-no-conflict.js -app/code/Magento/Theme/view/frontend/menu.js -app/code/Magento/Checkout/view/frontend/multishipping/payment.js -app/code/Magento/Checkout/view/frontend/onepage/accordion.js -app/code/Magento/Checkout/view/frontend/opcheckout.js +app/code/Magento/Backend/view/adminhtml/variables.js app/code/Magento/Captcha/view/frontend/onepage.js app/code/Magento/Catalog/view/adminhtml/catalog/category/edit.js -app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/configure.js app/code/Magento/Catalog/view/adminhtml/catalog/product.js -app/code/Magento/Adminhtml/view/adminhtml/rules.js +app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/configure.js +app/code/Magento/Checkout/view/frontend/js/accordion.js +app/code/Magento/Checkout/view/frontend/js/opcheckout.js +app/code/Magento/Checkout/view/frontend/js/payment.js +app/code/Magento/Rule/view/adminhtml/rules.js app/code/Magento/Sales/view/adminhtml/order/create/giftmessage.js app/code/Magento/Sales/view/adminhtml/order/create/scripts.js app/code/Magento/Sales/view/adminhtml/order/giftoptions_tooltip.js app/code/Magento/Sales/view/adminhtml/order/shipment/packaging.js -app/code/Magento/Adminhtml/view/adminhtml/variables.js +app/code/Magento/Theme/view/frontend/menu.js +pub/lib/mage/adminhtml +pub/lib/mage/backend/editablemultiselect.js +pub/lib/mage/captcha.js +pub/lib/mage/directpost.js +pub/lib/mage/flex.js +pub/lib/mage/jquery-no-conflict.js diff --git a/dev/tests/static/testsuite/Magento/Test/Js/_files/whitelist/core.txt b/dev/tests/static/testsuite/Magento/Test/Js/_files/whitelist/core.txt index 54c56692c82c8416a15da9b65f59f79b1ffcd994..c7a5d925e00bf631001e419c07b3bd8600bd49ee 100644 --- a/dev/tests/static/testsuite/Magento/Test/Js/_files/whitelist/core.txt +++ b/dev/tests/static/testsuite/Magento/Test/Js/_files/whitelist/core.txt @@ -1,21 +1,20 @@ -pub/lib/mage -app/code/Magento/Install +app/code/Magento/Authorizenet +app/code/Magento/Bundle +app/code/Magento/Captcha app/code/Magento/Catalog -app/code/Magento/Newsletter -app/code/Magento/Theme -app/code/Magento/PageCache app/code/Magento/CatalogSearch app/code/Magento/Checkout -app/code/Magento/Captcha app/code/Magento/Customer app/code/Magento/Downloadable -app/code/Magento/Persistent -app/code/Magento/Wishlist -app/code/Magento/Bundle -app/code/Magento/Adminhtml +app/code/Magento/GiftMessage +app/code/Magento/Install +app/code/Magento/Newsletter +app/code/Magento/PageCache +app/code/Magento/Paygate app/code/Magento/Payment app/code/Magento/Paypal -app/code/Magento/GiftMessage +app/code/Magento/Persistent app/code/Magento/Sales -app/code/Magento/Authorizenet -app/code/Magento/Paygate +app/code/Magento/Theme +app/code/Magento/Wishlist +pub/lib/mage diff --git a/dev/tests/static/testsuite/Magento/Test/Php/LiveCodeTest.php b/dev/tests/static/testsuite/Magento/Test/Php/LiveCodeTest.php index 95c82d9f89c1aac2ab036b63d9abf63f8314ff2e..e72132c4f240e86cba057cc80b6f4995c96d4f5c 100644 --- a/dev/tests/static/testsuite/Magento/Test/Php/LiveCodeTest.php +++ b/dev/tests/static/testsuite/Magento/Test/Php/LiveCodeTest.php @@ -24,11 +24,12 @@ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ +namespace Magento\Test\Php; +use Magento\TestFramework\Utility; + /** * Set of tests for static code analysis, e.g. code style, code complexity, copy paste detecting, etc. */ -namespace Magento\Test\Php; - class LiveCodeTest extends \PHPUnit_Framework_TestCase { /** @@ -48,7 +49,7 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase public static function setUpBeforeClass() { - self::$_reportDir = \Magento\TestFramework\Utility\Files::init()->getPathToSource() + self::$_reportDir = Utility\Files::init()->getPathToSource() . '/dev/tests/static/report'; if (!is_dir(self::$_reportDir)) { mkdir(self::$_reportDir, 0777); @@ -61,8 +62,8 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase if ($type != '' && !preg_match('/\/$/', $type)) { $type = $type . '/'; } - self::$_whiteList = self::_readLists(__DIR__ . '/_files/' . $type . 'whitelist/*.txt'); - self::$_blackList = self::_readLists(__DIR__ . '/_files/' . $type . 'blacklist/*.txt'); + self::$_whiteList = Utility\Files::readLists(__DIR__ . '/_files/' . $type . 'whitelist/*.txt'); + self::$_blackList = Utility\Files::readLists(__DIR__ . '/_files/' . $type . 'blacklist/*.txt'); } /** @@ -158,39 +159,4 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase "PHP Copy/Paste Detector has found error(s): See detailed report in $reportFile" ); } - - /** - * Read all text files by specified glob pattern and combine them into an array of valid files/directories - * - * The Magento root path is prepended to all (non-empty) entries - * - * @param string $globPattern - * @return array - * @throws \Exception if any of the patterns don't return any result - */ - protected static function _readLists($globPattern) - { - $patterns = array(); - foreach (glob($globPattern) as $list) { - $patterns = array_merge($patterns, file($list, FILE_IGNORE_NEW_LINES)); - } - - // Expand glob patterns - $result = array(); - foreach ($patterns as $pattern) { - if (0 === strpos($pattern, '#')) { - continue; - } - /** - * Note that glob() for directories will be returned as is, - * but passing directory is supported by the tools (phpcpd, phpmd, phpcs) - */ - $files = glob(\Magento\TestFramework\Utility\Files::init()->getPathToSource() . '/' . $pattern, GLOB_BRACE); - if (empty($files)) { - throw new \Exception("The glob() pattern '{$pattern}' didn't return any result."); - } - $result = array_merge($result, $files); - } - return $result; - } } diff --git a/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt b/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt index 630aa0f424b20bb2c9b36adeddf457b066d9e79f..c0726a3247d5fc48f27d086667365198300136d0 100644 --- a/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt +++ b/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt @@ -50,6 +50,7 @@ Magento/Cron/Model/Config/Backend/Product Magento/Customer/Block/Account/Dashboard Magento/Customer/Block/Adminhtml/Edit/Tab Magento/Customer/Model/Config/Backend/Show +Magento/Customer/Model/Metadata Magento/DesignEditor/Block/Adminhtml/Editor/Tools/Code Magento/DesignEditor/Block/Adminhtml/Theme/Selector/Tab Magento/DesignEditor/Model/Url diff --git a/dev/tests/unit/testsuite/Magento/Authorizenet/Model/Directpost/ObserverTest.php b/dev/tests/unit/testsuite/Magento/Authorizenet/Model/Directpost/ObserverTest.php new file mode 100644 index 0000000000000000000000000000000000000000..75c3ec36c007c0176b545eaf9ddf765f20cac404 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Authorizenet/Model/Directpost/ObserverTest.php @@ -0,0 +1,110 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Authorizenet\Model\Directpost; + +class ObserverTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Observer + */ + protected $model; + + /** + * @var \Magento\Core\Model\Registry|\PHPUnit_Framework_MockObject_MockObject + */ + protected $coreRegistry; + + /** + * @var \Magento\Core\Helper\Data|\PHPUnit_Framework_MockObject_MockObject + */ + protected $coreData; + + protected function setUp() + { + $helper = new \Magento\TestFramework\Helper\ObjectManager($this); + $store = $this->getMock('Magento\Core\Model\Store', [], [], '', false); + $this->coreRegistry = $this->getMock('Magento\Core\Model\Registry', []); + $storeManager = $this->getMockForAbstractClass('Magento\Core\Model\StoreManagerInterface'); + $storeManager->expects($this->any())->method('getStore')->will($this->returnValue($store)); + $payment = $this->getMock('Magento\Authorizenet\Model\Directpost', null, [], '', false); + $this->coreData = $this->getMock('Magento\Core\Helper\Data', [], [], '', false); + $this->model = $helper->getObject('Magento\Authorizenet\Model\Directpost\Observer', [ + 'coreRegistry' => $this->coreRegistry, + 'storeManager' => $storeManager, + 'payment' => $payment, + 'coreData' => $this->coreData + ]); + } + + public function testAddAdditionalFieldsToResponseFrontend() + { + $directpostRequest = $this->getMock('Magento\Authorizenet\Model\Directpost\Request', []); + $order = $this->getMock('Magento\Sales\Model\Order', [], [], '', false); + + $methodInstance = $this->getMock('Magento\Authorizenet\Model\Directpost', [], [], '', false); + $methodInstance->expects($this->once()) + ->method('generateRequestFromOrder') + ->with($this->identicalTo($order)) + ->will($this->returnValue($directpostRequest)); + + $payment = $this->getMock('Magento\Sales\Model\Order\Payment', [ + 'getMethodInstance', + '__wakeup' + ], [], '', false); + $payment->expects($this->once())->method('getMethodInstance')->will($this->returnValue($methodInstance)); + $payment->setMethod('authorizenet_directpost'); + + $order->expects($this->once())->method('getId')->will($this->returnValue(1)); + $order->expects($this->atLeastOnce())->method('getPayment')->will($this->returnValue($payment)); + + + $this->coreRegistry->expects($this->once()) + ->method('registry') + ->with('directpost_order') + ->will($this->returnValue($order)); + + $request = new \Magento\Object(); + $response = $this->getMock('Magento\App\Response\Http', [], [], '', false); + $controller = $this->getMock('Magento\Checkout\Controller\Action', [ + 'getRequest', + 'getResponse' + ], [], '', false); + $controller->expects($this->once())->method('getRequest')->will($this->returnValue($request)); + $controller->expects($this->once())->method('getResponse')->will($this->returnValue($response)); + $observer = new \Magento\Event\Observer(['event' => new \Magento\Object(['controller_action' => $controller])]); + + $this->coreData->expects($this->once()) + ->method('jsonEncode') + ->with(self::logicalNot(self::isEmpty())) + ->will($this->returnValue('encoded response')); + $response->expects($this->once()) + ->method('clearHeader') + ->with('Location'); + $response->expects($this->once()) + ->method('setBody') + ->with('encoded response'); + $this->model->addAdditionalFieldsToResponseFrontend($observer); + } +} diff --git a/dev/tests/unit/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/CurrencyTest.php b/dev/tests/unit/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/CurrencyTest.php index f200d7e4f51bf1b0c65edddac499c1628b1537ea..1a5d32cdc07a9b86d9335812cb49261be4bf6a1c 100644 --- a/dev/tests/unit/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/CurrencyTest.php +++ b/dev/tests/unit/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/CurrencyTest.php @@ -59,6 +59,11 @@ class CurrencyTest extends \PHPUnit_Framework_TestCase */ protected $_requestMock; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $_currencyMock; + /** * @var \Magento\Object */ @@ -80,6 +85,21 @@ class CurrencyTest extends \PHPUnit_Framework_TestCase ->method('getIndex') ->will($this->returnValue('columnIndex')); + $this->_currencyMock = $this->getMock('Magento\Directory\Model\Currency', array(), array(), '', false); + $this->_currencyMock->expects($this->any()) + ->method('load') + ->will($this->returnSelf()); + $currencyFactoryMock = $this->getMock( + 'Magento\Directory\Model\CurrencyFactory', + array('create'), + array(), + '', + false + ); + $currencyFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_currencyMock)); + $this->_row = new \Magento\Object(array('columnIndex' => '10')); $helper = new \Magento\TestFramework\Helper\ObjectManager($this); @@ -87,7 +107,8 @@ class CurrencyTest extends \PHPUnit_Framework_TestCase 'storeManager' => $this->_storeManagerMock, 'locale' => $this->_localeMock, 'currencyLocator' => $this->_curLocatorMock, - 'request' => $this->_requestMock + 'request' => $this->_requestMock, + 'currencyFactory' => $currencyFactoryMock ) ); @@ -111,17 +132,9 @@ class CurrencyTest extends \PHPUnit_Framework_TestCase */ public function testRenderWithDefaultCurrency() { - $currencyMock = $this->getMock('Magento\Directory\Model\Currency', array(), array(), '', false); - $currencyMock->expects($this->once())->method('getRate')->with('defaultCurrency') + $this->_currencyMock->expects($this->once())->method('getRate')->with('defaultCurrency') ->will($this->returnValue(1.5)); - $storeMock = $this->getMock('Magento\Core\Model\Store', array(), array(), '', false); - $storeMock->expects($this->once())->method('getBaseCurrency')->will($this->returnValue($currencyMock)); - - $this->_storeManagerMock->expects($this->once()) - ->method('getStore') - ->will($this->returnValue($storeMock)); - $this->_curLocatorMock->expects($this->any()) ->method('getDefaultCurrency') ->with($this->_requestMock) diff --git a/dev/tests/unit/testsuite/Magento/Customer/Model/ConverterTest.php b/dev/tests/unit/testsuite/Magento/Customer/Model/ConverterTest.php new file mode 100644 index 0000000000000000000000000000000000000000..542059b9ce3f31ca851d6b3431ff36098e9aeeb6 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Model/ConverterTest.php @@ -0,0 +1,154 @@ +<?php +/** + * Unit test for converter \Magento\Customer\Model\Converter + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Model; + +class ConverterTest extends \PHPUnit_Framework_TestCase +{ + public function testCreateCustomerFromModel() + { + $customerModelMock = + $this->getMockBuilder('Magento\Customer\Model\Customer') + ->disableOriginalConstructor() + ->setMethods( + array( + 'getId', + 'getFirstname', + 'getLastname', + 'getEmail', + 'getAttributes', + 'getData', + '__wakeup', + ) + ) + ->getMock(); + + $attributeModelMock = + $this->getMockBuilder('\Magento\Customer\Model\Attribute') + ->disableOriginalConstructor() + ->getMock(); + + $attributeModelMock + ->expects($this->at(0)) + ->method('getAttributeCode') + ->will($this->returnValue('attribute_code')); + + $attributeModelMock + ->expects($this->at(1)) + ->method('getAttributeCode') + ->will($this->returnValue('attribute_code2')); + + $attributeModelMock + ->expects($this->at(2)) + ->method('getAttributeCode') + ->will($this->returnValue('attribute_code3')); + + $this->_mockReturnValue( + $customerModelMock, + array( + 'getId' => 1, + 'getFirstname' => 'Tess', + 'getLastname' => 'Tester', + 'getEmail' => 'ttester@example.com', + 'getAttributes' => [$attributeModelMock, $attributeModelMock, $attributeModelMock], + ) + ); + + $map = [ + ['attribute_code', null, 'attributeValue'], + ['attribute_code2', null, 'attributeValue2'], + ['attribute_code3', null, null], + ]; + $customerModelMock + ->expects($this->any()) + ->method('getData') + ->will($this->returnValueMap($map)); + + $customerBuilder = new \Magento\Customer\Service\V1\Dto\CustomerBuilder(); + $customerFactory = $this->getMockBuilder('Magento\Customer\Model\CustomerFactory') + ->disableOriginalConstructor() + ->getMock(); + + $converter = new Converter($customerBuilder, $customerFactory); + $customerDto = $converter->createCustomerFromModel($customerModelMock); + + $customerBuilder = new \Magento\Customer\Service\V1\Dto\CustomerBuilder(); + $customerData = [ + 'firstname' => 'Tess', + 'email' => 'ttester@example.com', + 'lastname' => 'Tester', + 'id' => 1, + 'attribute_code' => 'attributeValue', + 'attribute_code2' => 'attributeValue2' + ]; + // There will be no attribute_code3: it has a value of null, so the converter will drop it + $customerBuilder->populateWithArray($customerData); + $expectedCustomerDto = $customerBuilder->create(); + + $this->assertEquals($expectedCustomerDto, $customerDto); + } + + /** + * @dataProvider createCustomerFromModelBadParamDataProvider + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage customer model is invalid + */ + public function testCreateCustomerFromModelBadParam($param) + { + $customerBuilder = $this->getMockBuilder('Magento\Customer\Service\V1\Dto\CustomerBuilder') + ->disableOriginalConstructor() + ->getMock(); + + $customerFactory = $this->getMockBuilder('Magento\Customer\Model\CustomerFactory') + ->disableOriginalConstructor() + ->getMock(); + + $converter = new Converter($customerBuilder, $customerFactory); + $converter->createCustomerFromModel($param); + } + + public function createCustomerFromModelBadParamDataProvider() + { + return [ + [null], + ['a string'], + [5], + [new \Magento\Object()], + ]; + } + + /** + * @param \PHPUnit_Framework_MockObject_MockObject $mock + * @param array $valueMap + */ + private function _mockReturnValue($mock, $valueMap) + { + foreach ($valueMap as $method => $value) { + $mock->expects($this->any()) + ->method($method) + ->will($this->returnValue($value)); + } + } +} diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/CustomerTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/CustomerTest.php index 6410d0b3e205e7ca752bab2ff981373330088849..065658c71339e57b0147327c95ec52d870549e80 100644 --- a/dev/tests/unit/testsuite/Magento/Customer/Service/CustomerTest.php +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/CustomerTest.php @@ -79,6 +79,7 @@ class CustomerTest extends \PHPUnit_Framework_TestCase ) ->disableOriginalConstructor() ->getMock(); + $this->_customerFactory->expects($this->any()) ->method('create') ->will($this->returnValue($this->_customer)); diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..87f0cd6fefca1af04b779d768a2d1154591e59d6 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php @@ -0,0 +1,1030 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1; + +/** + * \Magento\Customer\Service\V1\CustomerAccountService + * + * @SuppressWarnings(PHPMD.TooManyMethods) + * @SuppressWarnings(PHPMD.ExcessivePublicCount) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class CustomerAccountServiceTest extends \PHPUnit_Framework_TestCase +{ + + const STREET = 'Parmer'; + const CITY = 'Albuquerque'; + const POSTCODE = '90014'; + const TELEPHONE = '7143556767'; + const REGION = 'Alabama'; + const REGION_ID = 1; + const COUNTRY_ID = 'US'; + + /** Sample values for testing */ + const ID = 1; + const FIRSTNAME = 'Jane'; + const LASTNAME = 'Doe'; + const NAME = 'J'; + const EMAIL = 'janedoe@example.com'; + const EMAIL_CONFIRMATION_KEY = 'blj487lkjs4confirmation_key'; + const PASSWORD = 'password'; + const ATTRIBUTE_CODE = 'random_attr_code'; + const ATTRIBUTE_VALUE = 'random_attr_value'; + const WEBSITE_ID = 1; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\CustomerFactory + */ + private $_customerFactoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\AddressFactory + */ + private $_addressFactoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Customer + */ + private $_customerModelMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Attribute + */ + private $_attributeModelMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\CustomerMetadataServiceInterface + */ + private $_eavMetadataServiceMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Event\ManagerInterface + */ + private $_eventManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\StoreManagerInterface + */ + private $_storeManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Math\Random + */ + private $_mathRandomMock; + + /** + * @var \Magento\Customer\Model\Converter + */ + private $_converter; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\Store + */ + private $_storeMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\AddressBuilder + */ + private $_addressBuilder; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\CustomerBuilder + */ + private $_customerBuilder; + + private $_validator; + + private $_customerServiceMock; + + private $_customerAddressServiceMock; + + public function setUp() + { + $this->_customerFactoryMock = $this->getMockBuilder('Magento\Customer\Model\CustomerFactory') + ->disableOriginalConstructor() + ->setMethods(array('create')) + ->getMock(); + + $this->_customerModelMock = $this->getMockBuilder('Magento\Customer\Model\Customer') + ->disableOriginalConstructor() + ->setMethods( + array( + 'getId', + 'getFirstname', + 'getLastname', + 'getName', + 'getEmail', + 'getAttributes', + 'getConfirmation', + 'setConfirmation', + 'save', + 'load', + '__wakeup', + 'authenticate', + 'getData', + 'getDefaultBilling', + 'getDefaultShipping', + 'getDefaultShippingAddress', + 'getDefaultBillingAddress', + 'getStoreId', + 'getAddressById', + 'getAddresses', + 'getAddressItemById', + 'getParentId', + 'isConfirmationRequired', + 'addAddress', + 'loadByEmail', + 'sendNewAccountEmail', + 'setFirstname', + 'setLastname', + 'setEmail', + 'setPassword', + 'setData', + 'setWebsiteId', + 'getAttributeSetId', + 'setAttributeSetId', + 'validate', + 'getRpToken', + 'setRpToken', + 'setRpTokenCreatedAt', + 'isResetPasswordLinkTokenExpired', + 'changeResetPasswordLinkToken', + 'sendPasswordResetConfirmationEmail', + ) + ) + ->getMock(); + + $this->_addressFactoryMock = $this->getMockBuilder('Magento\Customer\Model\AddressFactory') + ->disableOriginalConstructor() + ->setMethods(array('create')) + ->getMock(); + + $this->_eavMetadataServiceMock = + $this->getMockBuilder('Magento\Customer\Service\Eav\AttributeMetadataServiceV1Interface') + ->disableOriginalConstructor() + ->getMock(); + + $this->_eventManagerMock = + $this->getMockBuilder('\Magento\Event\ManagerInterface') + ->disableOriginalConstructor() + ->getMock(); + + $this->_attributeModelMock = + $this->getMockBuilder('\Magento\Customer\Model\Attribute') + ->disableOriginalConstructor() + ->getMock(); + + $this->_attributeModelMock + ->expects($this->any()) + ->method('getAttributeCode') + ->will($this->returnValue(self::ATTRIBUTE_CODE)); + + $this->_customerModelMock + ->expects($this->any()) + ->method('getData') + ->with($this->equalTo(self::ATTRIBUTE_CODE)) + ->will($this->returnValue(self::ATTRIBUTE_VALUE)); + + $this->_customerModelMock + ->expects($this->any()) + ->method('validate') + ->will($this->returnValue(TRUE)); + + $this->_setupStoreMock(); + + $this->_mathRandomMock = $this->getMockBuilder('\Magento\Math\Random') + ->disableOriginalConstructor() + ->getMock(); + + $this->_validator = $this->getMockBuilder('\Magento\Customer\Model\Metadata\Validator') + ->disableOriginalConstructor() + ->getMock(); + + $this->_addressBuilder = new Dto\AddressBuilder( + new Dto\RegionBuilder()); + + $this->_customerBuilder = new Dto\CustomerBuilder(); + + $customerBuilder = new Dto\CustomerBuilder(); + + $this->_converter = new \Magento\Customer\Model\Converter($customerBuilder, $this->_customerFactoryMock); + + $this->_customerServiceMock = $this->getMockBuilder('\Magento\Customer\Service\V1\CustomerService') + ->disableOriginalConstructor() + ->getMock(); + + $this->_customerAddressServiceMock = + $this->getMockBuilder('\Magento\Customer\Service\V1\CustomerAddressService') + ->disableOriginalConstructor() + ->getMock(); + } + + + public function testActivateAccount() + { + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'getConfirmation' => self::EMAIL_CONFIRMATION_KEY, + 'getAttributes' => array(), + ) + ); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + // Assertions + $this->_customerModelMock->expects($this->once()) + ->method('save'); + $this->_customerModelMock->expects($this->once()) + ->method('setConfirmation') + ->with($this->isNull()); + + $customerService = $this->_createService(); + + $customer = $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY); + + $this->assertEquals(self::ID, $customer->getCustomerId()); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + */ + public function testActivateAccountAlreadyActive() + { + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'getConfirmation' => null, + 'getAttributes' => array() + ) + ); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + // Assertions + $this->_customerModelMock->expects($this->never()) + ->method('save'); + $this->_customerModelMock->expects($this->never()) + ->method('setConfirmation'); + + $customerService = $this->_createService(); + + $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionMessage No customer with customerId 1 exists. + */ + public function testActivateAccountDoesntExist() + { + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => 0, + ) + ); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + // Assertions + $this->_customerModelMock->expects($this->never()) + ->method('save'); + $this->_customerModelMock->expects($this->never()) + ->method('setConfirmation'); + + $customerService = $this->_createService(); + + $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionMessage DB was down + */ + public function testActivateAccountLoadError() + { + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->throwException(new \Exception('DB was down'))); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => 0, + ) + ); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + // Assertions + $this->_customerModelMock->expects($this->never()) + ->method('save'); + $this->_customerModelMock->expects($this->never()) + ->method('setConfirmation'); + + $customerService = $this->_createService(); + + $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY); + } + + /** + * @expectedException \Magento\Core\Exception + * @expectedExceptionMessage Wrong confirmation key + */ + public function testActivateAccountBadKey() + { + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'getConfirmation' => self::EMAIL_CONFIRMATION_KEY . 'BAD', + ) + ); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + // Assertions + $this->_customerModelMock->expects($this->never()) + ->method('save'); + $this->_customerModelMock->expects($this->never()) + ->method('setConfirmation'); + + $customerService = $this->_createService(); + + $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY); + } + + /** + * @expectedException \Magento\Core\Exception + * @expectedExceptionMessage Failed to confirm customer account + */ + public function testActivateAccountSaveFailed() + { + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'getConfirmation' => self::EMAIL_CONFIRMATION_KEY, + ) + ); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + // Assertions/Mocking + $this->_customerModelMock->expects($this->once()) + ->method('save') + ->will($this->throwException(new \Exception('DB is down'))); + $this->_customerModelMock->expects($this->once()) + ->method('setConfirmation'); + + $customerService = $this->_createService(); + + $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY); + } + + public function testLoginAccount() + { + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'authenticate' => true, + 'load' => $this->_customerModelMock, + 'getAttributes' => array() + ) + ); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $customer = $customerService->authenticate(self::EMAIL, self::PASSWORD, self::WEBSITE_ID); + + $this->assertEquals(self::ID, $customer->getCustomerId()); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionMessage exception message + */ + public function testLoginAccountWithException() + { + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'load' => $this->_customerModelMock, + ) + ); + + $this->_customerModelMock->expects($this->any()) + ->method('authenticate') + ->will($this->throwException(new \Magento\Core\Exception('exception message') )); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $customerService->authenticate(self::EMAIL, self::PASSWORD, self::WEBSITE_ID); + } + + public function testValidateResetPasswordLinkToken() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => false, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $customerService->validateResetPasswordLinkToken(self::ID, $resetToken); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED + * @expectedExceptionMessage Your password reset link has expired. + */ + public function testValidateResetPasswordLinkTokenExpired() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => true, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $customerService->validateResetPasswordLinkToken(self::ID, $resetToken); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED + * @expectedExceptionMessage Your password reset link has expired. + */ + public function testValidateResetPasswordLinkTokenInvalid() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $invalidToken = $resetToken . 'extra_stuff'; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => false, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $customerService->validateResetPasswordLinkToken(self::ID, $invalidToken); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_CUSTOMER_ID + * @expectedExceptionMessage No customer with customerId 1 exists + */ + public function testValidateResetPasswordLinkTokenWrongUser() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => 0, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => false, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $customerService->validateResetPasswordLinkToken(1, $resetToken); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_RESET_TOKEN + * @expectedExceptionMessage Invalid password reset token + */ + public function testValidateResetPasswordLinkTokenNull() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => 0, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => false, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $customerService->validateResetPasswordLinkToken(null, null); + } + + public function testSendPasswordResetLink() + { + $email = 'foo@example.com'; + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'setWebsiteId' => $this->_customerModelMock, + 'loadByEmail' => $this->_customerModelMock, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_customerModelMock->expects($this->once()) + ->method('sendPasswordResetConfirmationEmail'); + + $customerService = $this->_createService(); + + $customerService->sendPasswordResetLink($email, self::WEBSITE_ID); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_EMAIL_NOT_FOUND + * @expectedExceptionMessage No customer found for the provided email and website ID + */ + public function testSendPasswordResetLinkBadEmailOrWebsite() + { + $email = 'foo@example.com'; + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => 0, + 'setWebsiteId' => $this->_customerModelMock, + 'loadByEmail' => $this->_customerModelMock, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_customerModelMock->expects($this->never()) + ->method('sendPasswordResetConfirmationEmail'); + + $customerService = $this->_createService(); + + $customerService->sendPasswordResetLink($email, 0); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_UNKNOWN + * @expectedExceptionMessage Invalid transactional email code: 0 + */ + public function testSendPasswordResetLinkSendException() + { + $email = 'foo@example.com'; + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'setWebsiteId' => $this->_customerModelMock, + 'loadByEmail' => $this->_customerModelMock, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_customerModelMock->expects($this->once()) + ->method('sendPasswordResetConfirmationEmail') + ->will($this->throwException(new \Magento\Core\Exception(__('Invalid transactional email code: %1', 0)))); + + $customerService = $this->_createService(); + + $customerService->sendPasswordResetLink($email, self::WEBSITE_ID); + } + + public function testResetPassword() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $password = 'password_secret'; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => false, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_customerModelMock->expects($this->once()) + ->method('setRpToken') + ->with(null) + ->will($this->returnSelf()); + $this->_customerModelMock->expects($this->once()) + ->method('setRpTokenCreatedAt') + ->with(null) + ->will($this->returnSelf()); + $this->_customerModelMock->expects($this->once()) + ->method('setPassword') + ->with($password) + ->will($this->returnSelf()); + + $customerService = $this->_createService(); + + $customerService->resetPassword(self::ID, $password, $resetToken); + } + + public function testResetPasswordShortPassword() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $password = ''; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => false, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_customerModelMock->expects($this->once()) + ->method('setRpToken') + ->with(null) + ->will($this->returnSelf()); + $this->_customerModelMock->expects($this->once()) + ->method('setRpTokenCreatedAt') + ->with(null) + ->will($this->returnSelf()); + $this->_customerModelMock->expects($this->once()) + ->method('setPassword') + ->with($password) + ->will($this->returnSelf()); + + $customerService = $this->_createService(); + + $customerService->resetPassword(self::ID, $password, $resetToken); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED + * @expectedExceptionMessage Your password reset link has expired. + */ + public function testResetPasswordTokenExpired() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $password = 'password_secret'; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => true, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_customerModelMock->expects($this->never()) + ->method('setRpToken'); + $this->_customerModelMock->expects($this->never()) + ->method('setRpTokenCreatedAt'); + $this->_customerModelMock->expects($this->never()) + ->method('setPassword'); + + $customerService = $this->_createService(); + + $customerService->resetPassword(self::ID, $password, $resetToken); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED + * @expectedExceptionMessage Your password reset link has expired. + */ + public function testResetPasswordTokenInvalid() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $invalidToken = $resetToken . 'invalid'; + $password = 'password_secret'; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => false, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_customerModelMock->expects($this->never()) + ->method('setRpToken'); + $this->_customerModelMock->expects($this->never()) + ->method('setRpTokenCreatedAt'); + $this->_customerModelMock->expects($this->never()) + ->method('setPassword'); + + $customerService = $this->_createService(); + + $customerService->resetPassword(self::ID, $password, $invalidToken); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_CUSTOMER_ID + * @expectedExceptionMessage No customer with customerId 4200 exists + */ + public function testResetPasswordTokenWrongUser() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $password = 'password_secret'; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => 0, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => false, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_customerModelMock->expects($this->never()) + ->method('setRpToken'); + $this->_customerModelMock->expects($this->never()) + ->method('setRpTokenCreatedAt'); + $this->_customerModelMock->expects($this->never()) + ->method('setPassword'); + + $customerService = $this->_createService(); + + $customerService->resetPassword(4200, $password, $resetToken); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_RESET_TOKEN + * @expectedExceptionMessage Invalid password reset token + */ + public function testResetPasswordTokenInvalidUserId() + { + $resetToken = 'lsdj579slkj5987slkj595lkj'; + $password = 'password_secret'; + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => 0, + 'load' => $this->_customerModelMock, + 'getRpToken' => $resetToken, + 'isResetPasswordLinkTokenExpired' => false, + ) + ); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_customerModelMock->expects($this->never()) + ->method('setRpToken'); + $this->_customerModelMock->expects($this->never()) + ->method('setRpTokenCreatedAt'); + $this->_customerModelMock->expects($this->never()) + ->method('setPassword'); + + $customerService = $this->_createService(); + + $customerService->resetPassword(0, $password, $resetToken); + } + + + public function testSendConfirmation() + { + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(55)); + $this->_customerModelMock->expects($this->once()) + ->method('setWebsiteId') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('isConfirmationRequired') + ->will($this->returnValue(true)); + $this->_customerModelMock->expects($this->any()) + ->method('getConfirmation') + ->will($this->returnValue('123abc')); + + $customerService = $this->_createService(); + $customerService->sendConfirmation('email'); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_EMAIL_NOT_FOUND + */ + public function testSendConfirmationNoEmail() + { + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->once()) + ->method('getId') + ->will($this->returnValue(0)); + $this->_customerModelMock->expects($this->once()) + ->method('setWebsiteId') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + $customerService->sendConfirmation('email'); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_CONFIRMATION_NOT_NEEDED + */ + public function testSendConfirmationNotNeeded() + { + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->once()) + ->method('getId') + ->will($this->returnValue(55)); + $this->_customerModelMock->expects($this->once()) + ->method('setWebsiteId') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + $customerService->sendConfirmation('email'); + } + + + private function _setupStoreMock() + { + $this->_storeManagerMock = + $this->getMockBuilder('\Magento\Core\Model\StoreManagerInterface') + ->disableOriginalConstructor() + ->getMock(); + + $this->_storeMock = $this->getMockBuilder('\Magento\Core\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + + $this->_storeManagerMock + ->expects($this->any()) + ->method('getStore') + ->will($this->returnValue($this->_storeMock)); + } + + + /** + * @param \PHPUnit_Framework_MockObject_MockObject $mock + * @param array $valueMap + */ + private function _mockReturnValue($mock, $valueMap) + { + foreach ($valueMap as $method => $value) { + $mock->expects($this->any()) + ->method($method) + ->will($this->returnValue($value)); + } + } + + /** + * @return CustomerAccountService + */ + private function _createService() + { + $customerService = new CustomerAccountService( + $this->_customerFactoryMock, + $this->_eventManagerMock, + $this->_storeManagerMock, + $this->_mathRandomMock, + $this->_converter, + $this->_validator, + new Dto\Response\CreateCustomerAccountResponseBuilder(), + $this->_customerServiceMock, + $this->_customerAddressServiceMock + ); + return $customerService; + } +} diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4f49ff8ff4a63a36a3955e9004117324ad66e296 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php @@ -0,0 +1,880 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1; + +/** + * \Magento\Customer\Service\V1\CustomerAddressService + * + * @SuppressWarnings(PHPMD.TooManyMethods) + * @SuppressWarnings(PHPMD.ExcessivePublicCount) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class CustomerAddressServiceTest extends \PHPUnit_Framework_TestCase +{ + + const STREET = 'Parmer'; + const CITY = 'Albuquerque'; + const POSTCODE = '90014'; + const TELEPHONE = '7143556767'; + const REGION = 'Alabama'; + const REGION_ID = 1; + const COUNTRY_ID = 'US'; + + /** Sample values for testing */ + const ID = 1; + const FIRSTNAME = 'Jane'; + const LASTNAME = 'Doe'; + const NAME = 'J'; + const EMAIL = 'janedoe@example.com'; + const EMAIL_CONFIRMATION_KEY = 'blj487lkjs4confirmation_key'; + const PASSWORD = 'password'; + const ATTRIBUTE_CODE = 'random_attr_code'; + const ATTRIBUTE_VALUE = 'random_attr_value'; + const WEBSITE_ID = 1; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\CustomerFactory + */ + private $_customerFactoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\AddressFactory + */ + private $_addressFactoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Customer + */ + private $_customerModelMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Attribute + */ + private $_attributeModelMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\CustomerMetadataServiceInterface + */ + private $_eavMetadataServiceMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Event\ManagerInterface + */ + private $_eventManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\StoreManagerInterface + */ + private $_storeManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Math\Random + */ + private $_mathRandomMock; + + /** + * @var \Magento\Customer\Model\Converter + */ + private $_converter; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\Store + */ + private $_storeMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\AddressBuilder + */ + private $_addressBuilder; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\CustomerBuilder + */ + private $_customerBuilder; + + private $_validator; + + public function setUp() + { + $this->_customerFactoryMock = $this->getMockBuilder('Magento\Customer\Model\CustomerFactory') + ->disableOriginalConstructor() + ->setMethods(array('create')) + ->getMock(); + + $this->_customerModelMock = $this->getMockBuilder('Magento\Customer\Model\Customer') + ->disableOriginalConstructor() + ->setMethods( + array( + 'getId', + 'getFirstname', + 'getLastname', + 'getName', + 'getEmail', + 'getAttributes', + 'getConfirmation', + 'setConfirmation', + 'save', + 'load', + '__wakeup', + 'authenticate', + 'getData', + 'getDefaultBilling', + 'getDefaultShipping', + 'getDefaultShippingAddress', + 'getDefaultBillingAddress', + 'getStoreId', + 'getAddressById', + 'getAddresses', + 'getAddressItemById', + 'getParentId', + 'isConfirmationRequired', + 'addAddress', + 'loadByEmail', + 'sendNewAccountEmail', + 'setFirstname', + 'setLastname', + 'setEmail', + 'setPassword', + 'setData', + 'setWebsiteId', + 'getAttributeSetId', + 'setAttributeSetId', + 'validate', + 'getRpToken', + 'setRpToken', + 'setRpTokenCreatedAt', + 'isResetPasswordLinkTokenExpired', + 'changeResetPasswordLinkToken', + 'sendPasswordResetConfirmationEmail', + ) + ) + ->getMock(); + + $this->_addressFactoryMock = $this->getMockBuilder('Magento\Customer\Model\AddressFactory') + ->disableOriginalConstructor() + ->setMethods(array('create')) + ->getMock(); + + $this->_eavMetadataServiceMock = + $this->getMockBuilder('Magento\Customer\Service\Eav\AttributeMetadataServiceV1Interface') + ->disableOriginalConstructor() + ->getMock(); + + $this->_eventManagerMock = + $this->getMockBuilder('\Magento\Event\ManagerInterface') + ->disableOriginalConstructor() + ->getMock(); + + $this->_attributeModelMock = + $this->getMockBuilder('\Magento\Customer\Model\Attribute') + ->disableOriginalConstructor() + ->getMock(); + + $this->_attributeModelMock + ->expects($this->any()) + ->method('getAttributeCode') + ->will($this->returnValue(self::ATTRIBUTE_CODE)); + + $this->_customerModelMock + ->expects($this->any()) + ->method('getData') + ->with($this->equalTo(self::ATTRIBUTE_CODE)) + ->will($this->returnValue(self::ATTRIBUTE_VALUE)); + + $this->_customerModelMock + ->expects($this->any()) + ->method('validate') + ->will($this->returnValue(TRUE)); + + $this->_setupStoreMock(); + + $this->_mathRandomMock = $this->getMockBuilder('\Magento\Math\Random') + ->disableOriginalConstructor() + ->getMock(); + + $this->_validator = $this->getMockBuilder('\Magento\Customer\Model\Metadata\Validator') + ->disableOriginalConstructor() + ->getMock(); + + $this->_addressBuilder = new Dto\AddressBuilder( + new Dto\RegionBuilder()); + + $this->_customerBuilder = new Dto\CustomerBuilder(); + + $customerBuilder = new Dto\CustomerBuilder(); + + $this->_converter = new \Magento\Customer\Model\Converter($customerBuilder, $this->_customerFactoryMock); + } + + public function testGetAddressesDefaultBilling() + { + $addressMock = $this->_createAddress(1, 'John'); + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(1)); + $this->_customerModelMock->expects($this->any()) + ->method('getDefaultBillingAddress') + ->will($this->returnValue($addressMock)); + $this->_customerModelMock->expects($this->any()) + ->method('getDefaultBilling') + ->will($this->returnValue(1)); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $customerId = 1; + $address = $customerService->getDefaultBillingAddress($customerId); + + $expected = [ + 'id' => 1, + 'default_billing' => true, + 'default_shipping' => false, + 'customer_id' => self::ID, + 'region' => new Dto\Region([ + 'region_id' => self::REGION_ID, + 'region_code' => '', + 'region' => self::REGION + ]), + 'country_id' => self::COUNTRY_ID, + 'street' => [self::STREET], + 'telephone' => self::TELEPHONE, + 'postcode' => self::POSTCODE, + 'city' => self::CITY, + 'firstname' => 'John', + 'lastname' => 'Doe', + ]; + + $this->assertEquals($expected, $address->__toArray()); + } + + public function testGetAddressesDefaultShipping() + { + $addressMock = $this->_createAddress(1, 'John'); + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(1)); + $this->_customerModelMock->expects($this->any()) + ->method('getDefaultShippingAddress') + ->will($this->returnValue($addressMock)); + $this->_customerModelMock->expects($this->any()) + ->method('getDefaultShipping') + ->will($this->returnValue(1)); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $customerId = 1; + $address = $customerService->getDefaultShippingAddress($customerId); + + $expected = [ + 'id' => 1, + 'default_shipping' => true, + 'default_billing' => false, + 'customer_id' => self::ID, + 'region' => new Dto\Region([ + 'region_id' => self::REGION_ID, + 'region_code' => '', + 'region' => self::REGION + ]), + 'country_id' => self::COUNTRY_ID, + 'street' => [self::STREET], + 'telephone' => self::TELEPHONE, + 'postcode' => self::POSTCODE, + 'city' => self::CITY, + 'firstname' => 'John', + 'lastname' => 'Doe', + ]; + + $this->assertEquals($expected, $address->__toArray()); + } + + public function testGetAddressesById() + { + $addressMock = $this->_createAddress(1, 'John'); + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(1)); + $this->_customerModelMock->expects($this->any()) + ->method('getAddressById') + ->will($this->returnValue($addressMock)); + $this->_customerModelMock->expects($this->any()) + ->method('getDefaultShipping') + ->will($this->returnValue(1)); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $customerId = 1; + $addressId = 1; + $address = $customerService->getAddressById($customerId, $addressId); + + $expected = [ + 'id' => 1, + 'default_shipping' => true, + 'default_billing' => false, + 'customer_id' => self::ID, + 'region' => new Dto\Region([ + 'region_id' => self::REGION_ID, + 'region_code' => '', + 'region' => self::REGION + ]), + 'country_id' => self::COUNTRY_ID, + 'street' => [self::STREET], + 'telephone' => self::TELEPHONE, + 'postcode' => self::POSTCODE, + 'city' => self::CITY, + 'firstname' => 'John', + 'lastname' => 'Doe', + ]; + + $this->assertEquals($expected, $address->__toArray()); + } + + public function testGetAddresses() + { + $addressMock = $this->_createAddress(1, 'John'); + $addressMock2 = $this->_createAddress(2, 'Genry'); + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(1)); + $this->_customerModelMock->expects($this->any()) + ->method('getAddresses') + ->will($this->returnValue([$addressMock, $addressMock2])); + $this->_customerModelMock->expects($this->any()) + ->method('getDefaultShipping') + ->will($this->returnValue(1)); + $this->_customerModelMock->expects($this->any()) + ->method('getDefaultBilling') + ->will($this->returnValue(2)); + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $addresses = $customerService->getAddresses(1); + + $expected = [ + [ + 'id' => 1, + 'default_shipping' => true, + 'default_billing' => false, + 'customer_id' => self::ID, + 'region' => new Dto\Region([ + 'region_id' => self::REGION_ID, + 'region_code' => '', + 'region' => self::REGION + ]), + 'country_id' => self::COUNTRY_ID, + 'street' => [self::STREET], + 'telephone' => self::TELEPHONE, + 'postcode' => self::POSTCODE, + 'city' => self::CITY, + 'firstname' => 'John', + 'lastname' => 'Doe', + ], [ + 'id' => 2, + 'default_billing' => true, + 'default_shipping' => false, + 'customer_id' => self::ID, + 'region' => new Dto\Region([ + 'region_id' => self::REGION_ID, + 'region_code' => '', + 'region' => self::REGION + ]), + 'country_id' => self::COUNTRY_ID, + 'street' => [self::STREET], + 'telephone' => self::TELEPHONE, + 'postcode' => self::POSTCODE, + 'city' => self::CITY, + 'firstname' => 'Genry', + 'lastname' => 'Doe', + ] + ]; + + $this->assertEquals($expected[0], $addresses[0]->__toArray()); + $this->assertEquals($expected[1], $addresses[1]->__toArray()); + } + + public function testSaveAddresses() + { + // Setup Customer mock + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnSelf()); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(1)); + $this->_customerModelMock->expects($this->any()) + ->method('getAddresses') + ->will($this->returnValue([])); + + // Setup address mock + $mockAddress = $this->_createAddress(1, 'John'); + $mockAddress->expects($this->once()) + ->method('save'); + $mockAddress->expects($this->any()) + ->method('setData'); + $this->_addressFactoryMock->expects($this->once()) + ->method('create') + ->will($this->returnValue($mockAddress)); + $customerService = $this->_createService(); + + $this->_addressBuilder->setFirstname('John') + ->setLastname(self::LASTNAME) + ->setRegion(new Dto\Region([ + 'region_id' => self::REGION_ID, + 'region_code' => '', + 'region' => self::REGION + ])) + ->setStreet([self::STREET]) + ->setTelephone(self::TELEPHONE) + ->setCity(self::CITY) + ->setCountryId(self::COUNTRY_ID) + ->setPostcode(self::POSTCODE); + $ids = $customerService->saveAddresses(1, [$this->_addressBuilder->create()]); + $this->assertEquals([1], $ids); + } + + public function testSaveAddressesChanges() + { + // Setup address mock + $mockAddress = $this->_createAddress(1, 'John'); + + // Setup Customer mock + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnSelf()); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(1)); + $this->_customerModelMock->expects($this->any()) + ->method('getAddressItemById') + ->with(1) + ->will($this->returnValue($mockAddress)); + + // Assert + $mockAddress->expects($this->once()) + ->method('save'); + $mockAddress->expects($this->any()) + ->method('setData'); + + $customerService = $this->_createService(); + $this->_addressBuilder->setId(1) + ->setFirstname('Jane') + ->setLastname(self::LASTNAME) + ->setRegion(new Dto\Region([ + 'region_id' => self::REGION_ID, + 'region_code' => '', + 'region' => self::REGION + ])) + ->setStreet([self::STREET]) + ->setTelephone(self::TELEPHONE) + ->setCity(self::CITY) + ->setCountryId(self::COUNTRY_ID) + ->setPostcode(self::POSTCODE); + $ids = $customerService->saveAddresses(1, [$this->_addressBuilder->create()]); + $this->assertEquals([1], $ids); + } + + public function testSaveAddressesNoAddresses() + { + // Setup Customer mock + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnSelf()); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(1)); + $customerService = $this->_createService(); + + $ids = $customerService->saveAddresses(1, []); + $this->assertEmpty($ids); + } + + public function testSaveAddressesIdSetButNotAlreadyExisting() + { + // Setup Customer mock + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnSelf()); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(1)); + $this->_customerModelMock->expects($this->any()) + ->method('getAddresses') + ->will($this->returnValue([])); + $this->_customerModelMock->expects($this->any()) + ->method('getAddressItemById') + ->with(1) + ->will($this->returnValue(null)); + + // Setup address mock + $mockAddress = $this->_createAddress(1, 'John'); + $mockAddress->expects($this->once()) + ->method('save'); + $mockAddress->expects($this->any()) + ->method('setData'); + $this->_addressFactoryMock->expects($this->once()) + ->method('create') + ->will($this->returnValue($mockAddress)); + $customerService = $this->_createService(); + + $this->_addressBuilder->setId(1) + ->setFirstname('John') + ->setLastname(self::LASTNAME) + ->setRegion(new Dto\Region([ + 'region_id' => self::REGION_ID, + 'region_code' => '', + 'region' => self::REGION + ])) + ->setStreet([self::STREET]) + ->setTelephone(self::TELEPHONE) + ->setCity(self::CITY) + ->setCountryId(self::COUNTRY_ID) + ->setPostcode(self::POSTCODE); + $ids = $customerService->saveAddresses(1, [$this->_addressBuilder->create()]); + $this->assertEquals([1], $ids); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionMessage No customer with customerId 4200 exists + */ + public function testSaveAddressesCustomerIdNotExist() + { + // Setup Customer mock + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnSelf()); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(0)); + $this->_customerModelMock->expects($this->any()) + ->method('getAddresses') + ->will($this->returnValue([])); + $this->_customerModelMock->expects($this->any()) + ->method('getAddressItemById') + ->with(1) + ->will($this->returnValue(null)); + $customerService = $this->_createService(); + $this->_addressBuilder->setFirstname('John') + ->setLastname(self::LASTNAME) + ->setRegion(new Dto\Region([ + 'region_id' => self::REGION_ID, + 'region_code' => '', + 'region' => self::REGION + ])) + ->setStreet([self::STREET]) + ->setTelephone(self::TELEPHONE) + ->setCity(self::CITY) + ->setCountryId(self::COUNTRY_ID) + ->setPostcode(self::POSTCODE); + + $failures = $customerService->saveAddresses(4200, [$this->_addressBuilder->create()]); + $this->assertEmpty($failures); + } + + public function testDeleteAddressFromCustomer() + { + // Setup address mock + $mockAddress = $this->_createAddress(1, 'John'); + $mockAddress->expects($this->any()) + ->method('getCustomerId') + ->will($this->returnValue(self::ID)); + $this->_addressFactoryMock->expects($this->once()) + ->method('create') + ->will($this->returnValue($mockAddress)); + + // verify delete is called on the mock address model + $mockAddress->expects($this->once()) + ->method('delete'); + + $customerService = $this->_createService(); + $customerService->deleteAddressFromCustomer(1, 1); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_CUSTOMER_ID_MISMATCH + */ + public function testDeleteAddressFromCustomerMismatch() + { + // Setup address mock + $mockAddress = $this->_createAddress(1, 'John', 55); + $this->_addressFactoryMock->expects($this->once()) + ->method('create') + ->will($this->returnValue($mockAddress)); + + // verify delete is called on the mock address model + $mockAddress->expects($this->never()) + ->method('delete'); + + $customerService = $this->_createService(); + $customerService->deleteAddressFromCustomer(1, 1); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_ADDRESS_NOT_FOUND + */ + public function testDeleteAddressFromCustomerBadAddrId() + { + // Setup address mock + $mockAddress = $this->_createAddress(0, ''); + $mockAddress->expects($this->any()) + ->method('getCustomerId') + ->will($this->returnValue(self::ID)); + $this->_addressFactoryMock->expects($this->once()) + ->method('create') + ->will($this->returnValue($mockAddress)); + + // verify delete is called on the mock address model + $mockAddress->expects($this->never()) + ->method('delete'); + + $customerService = $this->_createService(); + $customerService->deleteAddressFromCustomer(1, 2); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_ADDRESS_ID + */ + public function testDeleteAddressFromCustomerInvalidAddrId() + { + $customerService = $this->_createService(); + $customerService->deleteAddressFromCustomer(1, 0); + } + + + public function testSaveAddressesWithValidatorException() + { + // Setup Customer mock + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnSelf()); + $this->_customerModelMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue(1)); + $this->_customerModelMock->expects($this->any()) + ->method('getAddresses') + ->will($this->returnValue([])); + + // Setup address mock + $mockAddress = $this->getMockBuilder('Magento\Customer\Model\Address') + ->disableOriginalConstructor() + ->getMock(); + $mockAddress->expects($this->any()) + ->method('validate') + ->will($this->returnValue(['some error'])); + $this->_addressFactoryMock->expects($this->once()) + ->method('create') + ->will($this->returnValue($mockAddress)); + $customerService = $this->_createService(); + + $this->_addressBuilder->setFirstname('John') + ->setLastname(self::LASTNAME) + ->setRegion(new Dto\Region([ + 'region_id' => self::REGION_ID, + 'region_code' => '', + 'region' => self::REGION + ])) + ->setStreet([self::STREET]) + ->setTelephone(self::TELEPHONE) + ->setCity(self::CITY) + ->setCountryId(self::COUNTRY_ID) + ->setPostcode(self::POSTCODE); + try { + $customerService->saveAddresses(1, [$this->_addressBuilder->create()]); + } catch (\Magento\Customer\Service\Entity\V1\AggregateException $ae) { + $addressException = $ae->getExceptions()[0]; + $this->assertInstanceOf('\Magento\Customer\Service\Entity\V1\Exception', $addressException); + $this->assertInstanceOf('\Magento\Validator\ValidatorException', $addressException->getPrevious()); + $this->assertSame('some error', $addressException->getPrevious()->getMessage()); + return; + } + $this->fail("Expected AggregateException not caught."); + } + + + private function _setupStoreMock() + { + $this->_storeManagerMock = + $this->getMockBuilder('\Magento\Core\Model\StoreManagerInterface') + ->disableOriginalConstructor() + ->getMock(); + + $this->_storeMock = $this->getMockBuilder('\Magento\Core\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + + $this->_storeManagerMock + ->expects($this->any()) + ->method('getStore') + ->will($this->returnValue($this->_storeMock)); + } + + /** + * @return CustomerAddressService + */ + private function _createService() + { + $customerService = new CustomerAddressService( + $this->_addressFactoryMock, + $this->_converter, + new Dto\RegionBuilder(), + $this->_addressBuilder + ); + return $customerService; + } + + + /** + * Helper that returns a mock \Magento\Customer\Model\Address object. + * + * @param $addrId + * @param $firstName + * @param $customerId + * @return \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Address + */ + private function _createAddress($addrId, $firstName, $customerId = self::ID) + { + $attributes = [ + $this->_createAttribute('firstname'), + $this->_createAttribute('lastname'), + $this->_createAttribute('street'), + $this->_createAttribute('city'), + $this->_createAttribute('postcode'), + $this->_createAttribute('telephone'), + $this->_createAttribute('region_id'), + $this->_createAttribute('region'), + $this->_createAttribute('country_id'), + ]; + + $addressMock = $this->getMockBuilder('Magento\Customer\Model\Address') + ->disableOriginalConstructor() + ->setMethods( + [ + 'getId', 'hasDataChanges', 'getRegion', 'getRegionId', + 'addData', 'setData', 'setCustomerId', 'setPostIndex', + 'setFirstname', 'load', 'save', '__sleep', '__wakeup', + 'getDefaultAttributeCodes', 'getAttributes', 'getData', + 'getCustomerId', 'getParentId', 'delete', 'validate' + ] + ) + ->getMock(); + $addressMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue($addrId)); + $addressMock->expects($this->any()) + ->method('getRegion') + ->will($this->returnValue(self::REGION)); + $addressMock->expects($this->any()) + ->method('getRegionId') + ->will($this->returnValue(self::REGION_ID)); + $addressMock->expects($this->any()) + ->method('getCustomerId') + ->will($this->returnValue($customerId)); + $addressMock->expects($this->any()) + ->method('validate') + ->will($this->returnValue(true)); + + $map = [ + ['firstname', null, $firstName], + ['lastname', null, self::LASTNAME], + ['street', null, self::STREET], + ['city', null, self::CITY], + ['postcode', null, self::POSTCODE], + ['telephone', null, self::TELEPHONE], + ['region', null, self::REGION], + ['country_id', null, self::COUNTRY_ID], + ]; + + $addressMock->expects($this->any()) + ->method('getData') + ->will($this->returnValueMap($map)); + + $addressMock->expects($this->any()) + ->method('load') + ->will($this->returnSelf()); + $addressMock->expects($this->any()) + ->method('getDefaultAttributeCodes') + ->will($this->returnValue(['entity_id', 'attribute_set_id'])); + $addressMock->expects($this->any()) + ->method('getAttributes') + ->will($this->returnValue($attributes)); + return $addressMock; + } + + private function _createAttribute($attributeCode) + { + $attribute = $this->getMockBuilder('\Magento\Customer\Model\Attribute') + ->disableOriginalConstructor() + ->getMock(); + $attribute->expects($this->any()) + ->method('getAttributeCode') + ->will($this->returnValue($attributeCode)); + return $attribute; + } + +} diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ebbb52560e3a11f28cc2de57253dfe94802b7cd3 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php @@ -0,0 +1,234 @@ +<?php +/** + * \Magento\Customer\Service\Eav\CustomerMetadataService + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1; + +use Magento\Customer\Service\V1\CustomerMetadataService; +use Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata; +use Magento\Customer\Service\V1\Dto\Eav\Option; + +class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase +{ + /** Sample values for testing */ + const ATTRIBUTE_CODE = 1; + const FRONTEND_INPUT = 'frontend input'; + const INPUT_FILTER = 'input filter'; + const STORE_LABEL = 'store label'; + const VALIDATE_RULES = 'validate rules'; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Eav\Model\Config + */ + private $_eavConfigMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Eav\Model\Entity\Attribute\AbstractAttribute + */ + private $_attributeEntityMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource + */ + private $_sourceMock; + + public function setUp() + { + $this->_eavConfigMock = $this->getMockBuilder('\Magento\Eav\Model\Config') + ->disableOriginalConstructor() + ->getMock(); + + $this->_attributeEntityMock = + $this->getMockBuilder('\Magento\Eav\Model\Entity\Attribute\AbstractAttribute') + ->setMethods( + array( + 'getAttributeCode', + 'getFrontendInput', + 'getInputFilter', + 'getStoreLabel', + 'getValidateRules', + 'getSource', + '__wakeup', + ) + ) + ->disableOriginalConstructor() + ->getMock(); + + $this->_sourceMock = + $this->getMockBuilder('\Magento\Eav\Model\Entity\Attribute\Source\AbstractSource') + ->disableOriginalConstructor() + ->getMock(); + + $this->_mockReturnValue( + $this->_attributeEntityMock, + array( + 'getAttributeCode' => self::ATTRIBUTE_CODE, + 'getFrontendInput' => self::FRONTEND_INPUT, + 'getInputFilter' => self::INPUT_FILTER, + 'getStoreLabel' => self::STORE_LABEL, + 'getValidateRules' => self::VALIDATE_RULES, + ) + ); + } + + public function testGetAttributeMetadata() + { + $this->_eavConfigMock->expects($this->any()) + ->method('getAttribute') + ->will($this->returnValue($this->_attributeEntityMock)); + + $this->_attributeEntityMock->expects($this->any()) + ->method('getSource') + ->will($this->returnValue($this->_sourceMock)); + + $allOptions = array( + array( + 'label' => 'label1', + 'value' => 'value1', + ), + array( + 'label' => 'label2', + 'value' => 'value2', + ), + ); + $this->_sourceMock->expects($this->any()) + ->method('getAllOptions') + ->will($this->returnValue($allOptions)); + + $attributeColMock = $this->getMockBuilder('\\Magento\\Customer\\Model\\Resource\\Form\\Attribute\\Collection') + ->disableOriginalConstructor() + ->getMock(); + $storeManagerMock = $this->getMockBuilder('\\Magento\\Core\\Model\\StoreManager') + ->disableOriginalConstructor() + ->getMock(); + + $optionBuilder = new \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder(); + + $attributeMetadataBuilder = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder(); + + $service = new CustomerMetadataService($this->_eavConfigMock, $attributeColMock, $storeManagerMock, + $optionBuilder, $attributeMetadataBuilder); + + $attributeMetadata = $service->getAttributeMetadata('entityCode', 'attributeId'); + $this->assertEquals(self::ATTRIBUTE_CODE, $attributeMetadata->getAttributeCode()); + $this->assertEquals(self::FRONTEND_INPUT, $attributeMetadata->getFrontendInput()); + $this->assertEquals(self::INPUT_FILTER, $attributeMetadata->getInputFilter()); + $this->assertEquals(self::STORE_LABEL, $attributeMetadata->getStoreLabel()); + $this->assertEquals(self::VALIDATE_RULES, $attributeMetadata->getValidationRules()); + + $options = $attributeMetadata->getOptions(); + $this->assertNotEquals(array(), $options); + $this->assertEquals('label1', $options['label1']->getLabel()); + $this->assertEquals('value1', $options['label1']->getValue()); + $this->assertEquals('label2', $options['label2']->getLabel()); + $this->assertEquals('value2', $options['label2']->getValue()); + } + + public function testGetAttributeMetadataWithoutOptions() + { + $this->_eavConfigMock->expects($this->any()) + ->method('getAttribute') + ->will($this->returnValue($this->_attributeEntityMock)); + + $this->_attributeEntityMock->expects($this->any()) + ->method('getSource') + ->will($this->returnValue($this->_sourceMock)); + + $this->_sourceMock->expects($this->any()) + ->method('getAllOptions') + ->will($this->returnValue(array())); + + $attributeColMock = $this->getMockBuilder('\\Magento\\Customer\\Model\\Resource\\Form\\Attribute\\Collection') + ->disableOriginalConstructor() + ->getMock(); + $storeManagerMock = $this->getMockBuilder('\\Magento\\Core\\Model\\StoreManager') + ->disableOriginalConstructor() + ->getMock(); + + $attributeMetadataBuilder = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder(); + + $optionBuilder = new \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder(); + + $service = new CustomerMetadataService($this->_eavConfigMock, $attributeColMock, $storeManagerMock, + $optionBuilder, $attributeMetadataBuilder); + + $attributeMetadata = $service->getAttributeMetadata('entityCode', 'attributeId'); + $this->assertEquals(self::ATTRIBUTE_CODE, $attributeMetadata->getAttributeCode()); + $this->assertEquals(self::FRONTEND_INPUT, $attributeMetadata->getFrontendInput()); + $this->assertEquals(self::INPUT_FILTER, $attributeMetadata->getInputFilter()); + $this->assertEquals(self::STORE_LABEL, $attributeMetadata->getStoreLabel()); + $this->assertEquals(self::VALIDATE_RULES, $attributeMetadata->getValidationRules()); + + $options = $attributeMetadata->getOptions(); + $this->assertEquals(0, count($options)); + } + + public function testGetAttributeMetadataWithoutSource() + { + $this->_eavConfigMock->expects($this->any()) + ->method('getAttribute') + ->will($this->returnValue($this->_attributeEntityMock)); + + $this->_attributeEntityMock->expects($this->any()) + ->method('getSource') + ->will($this->throwException(new \Exception('exception message'))); + + $attributeColMock = $this->getMockBuilder('\\Magento\\Customer\\Model\\Resource\\Form\\Attribute\\Collection') + ->disableOriginalConstructor() + ->getMock(); + $storeManagerMock = $this->getMockBuilder('\\Magento\\Core\\Model\\StoreManager') + ->disableOriginalConstructor() + ->getMock(); + + $optionBuilder = new \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder(); + + $attributeMetadataBuilder = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder(); + + $service = new CustomerMetadataService($this->_eavConfigMock, $attributeColMock, $storeManagerMock, + $optionBuilder, $attributeMetadataBuilder); + + $attributeMetadata = $service->getAttributeMetadata('entityCode', 'attributeId'); + $this->assertEquals(self::ATTRIBUTE_CODE, $attributeMetadata->getAttributeCode()); + $this->assertEquals(self::FRONTEND_INPUT, $attributeMetadata->getFrontendInput()); + $this->assertEquals(self::INPUT_FILTER, $attributeMetadata->getInputFilter()); + $this->assertEquals(self::STORE_LABEL, $attributeMetadata->getStoreLabel()); + $this->assertEquals(self::VALIDATE_RULES, $attributeMetadata->getValidationRules()); + + $options = $attributeMetadata->getOptions(); + $this->assertEquals(0, count($options)); + } + + /** + * @param \PHPUnit_Framework_MockObject_MockObject $mock + * @param array $valueMap + */ + private function _mockReturnValue($mock, $valueMap) + { + foreach ($valueMap as $method => $value) { + $mock->expects($this->any()) + ->method($method) + ->will($this->returnValue($value)); + } + } +} diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6a8d7cb856fa5dc103d959f78ec8817f82c6ef39 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php @@ -0,0 +1,471 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1; + +/** + * \Magento\Customer\Service\V1\CustomerService + * + * @SuppressWarnings(PHPMD.TooManyMethods) + * @SuppressWarnings(PHPMD.ExcessivePublicCount) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class CustomerServiceTest extends \PHPUnit_Framework_TestCase +{ + const STREET = 'Parmer'; + const CITY = 'Albuquerque'; + const POSTCODE = '90014'; + const TELEPHONE = '7143556767'; + const REGION = 'Alabama'; + const REGION_ID = 1; + const COUNTRY_ID = 'US'; + + /** Sample values for testing */ + const ID = 1; + const FIRSTNAME = 'Jane'; + const LASTNAME = 'Doe'; + const NAME = 'J'; + const EMAIL = 'janedoe@example.com'; + const EMAIL_CONFIRMATION_KEY = 'blj487lkjs4confirmation_key'; + const PASSWORD = 'password'; + const ATTRIBUTE_CODE = 'random_attr_code'; + const ATTRIBUTE_VALUE = 'random_attr_value'; + const WEBSITE_ID = 1; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\CustomerFactory + */ + private $_customerFactoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\AddressFactory + */ + private $_addressFactoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Customer + */ + private $_customerModelMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Attribute + */ + private $_attributeModelMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\CustomerMetadataServiceInterface + */ + private $_eavMetadataServiceMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Event\ManagerInterface + */ + private $_eventManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\StoreManagerInterface + */ + private $_storeManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Math\Random + */ + private $_mathRandomMock; + + /** + * @var \Magento\Customer\Model\Converter + */ + private $_converter; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\Store + */ + private $_storeMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\AddressBuilder + */ + private $_addressBuilder; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\CustomerBuilder + */ + private $_customerBuilder; + + private $_validator; + + public function setUp() + { + $this->_customerFactoryMock = $this->getMockBuilder('Magento\Customer\Model\CustomerFactory') + ->disableOriginalConstructor() + ->setMethods(array('create')) + ->getMock(); + + $this->_customerModelMock = $this->getMockBuilder('Magento\Customer\Model\Customer') + ->disableOriginalConstructor() + ->setMethods( + array( + 'getId', + 'getFirstname', + 'getLastname', + 'getName', + 'getEmail', + 'getAttributes', + 'getConfirmation', + 'setConfirmation', + 'save', + 'load', + '__wakeup', + 'authenticate', + 'getData', + 'getDefaultBilling', + 'getDefaultShipping', + 'getDefaultShippingAddress', + 'getDefaultBillingAddress', + 'getStoreId', + 'getAddressById', + 'getAddresses', + 'getAddressItemById', + 'getParentId', + 'isConfirmationRequired', + 'addAddress', + 'loadByEmail', + 'sendNewAccountEmail', + 'setFirstname', + 'setLastname', + 'setEmail', + 'setPassword', + 'setData', + 'setWebsiteId', + 'getAttributeSetId', + 'setAttributeSetId', + 'validate', + 'getRpToken', + 'setRpToken', + 'setRpTokenCreatedAt', + 'isResetPasswordLinkTokenExpired', + 'changeResetPasswordLinkToken', + 'sendPasswordResetConfirmationEmail', + ) + ) + ->getMock(); + + $this->_addressFactoryMock = $this->getMockBuilder('Magento\Customer\Model\AddressFactory') + ->disableOriginalConstructor() + ->setMethods(array('create')) + ->getMock(); + + $this->_eavMetadataServiceMock = + $this->getMockBuilder('Magento\Customer\Service\Eav\AttributeMetadataServiceV1Interface') + ->disableOriginalConstructor() + ->getMock(); + + $this->_eventManagerMock = + $this->getMockBuilder('\Magento\Event\ManagerInterface') + ->disableOriginalConstructor() + ->getMock(); + + $this->_attributeModelMock = + $this->getMockBuilder('\Magento\Customer\Model\Attribute') + ->disableOriginalConstructor() + ->getMock(); + + $this->_attributeModelMock + ->expects($this->any()) + ->method('getAttributeCode') + ->will($this->returnValue(self::ATTRIBUTE_CODE)); + + $this->_customerModelMock + ->expects($this->any()) + ->method('getData') + ->with($this->equalTo(self::ATTRIBUTE_CODE)) + ->will($this->returnValue(self::ATTRIBUTE_VALUE)); + + $this->_customerModelMock + ->expects($this->any()) + ->method('validate') + ->will($this->returnValue(TRUE)); + + $this->_setupStoreMock(); + + $this->_mathRandomMock = $this->getMockBuilder('\Magento\Math\Random') + ->disableOriginalConstructor() + ->getMock(); + + $this->_validator = $this->getMockBuilder('\Magento\Customer\Model\Metadata\Validator') + ->disableOriginalConstructor() + ->getMock(); + + $this->_addressBuilder = new Dto\AddressBuilder( + new Dto\RegionBuilder()); + + $this->_customerBuilder = new Dto\CustomerBuilder(); + + $customerBuilder = new Dto\CustomerBuilder(); + + $this->_converter = new \Magento\Customer\Model\Converter($customerBuilder, $this->_customerFactoryMock); + } + + public function testGetCustomer() + { + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'getFirstname' => self::FIRSTNAME, + 'getLastname' => self::LASTNAME, + 'getName' => self::NAME, + 'getEmail' => self::EMAIL, + 'getAttributes' => array($this->_attributeModelMock), + ) + ); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $customerService = $this->_createService(); + + $actualCustomer = $customerService->getCustomer(self::ID); + $this->assertEquals(self::ID, $actualCustomer->getCustomerId(), 'customer id does not match'); + $this->assertEquals(self::FIRSTNAME, $actualCustomer->getFirstName()); + $this->assertEquals(self::LASTNAME, $actualCustomer->getLastName()); + $this->assertEquals(self::EMAIL, $actualCustomer->getEmail()); + $this->assertEquals(4, count($actualCustomer->getAttributes())); + $attribute = $actualCustomer->getAttribute(self::ATTRIBUTE_CODE); + $this->assertEquals(self::ATTRIBUTE_VALUE, $attribute); + } + + public function testGetCustomerCached() + { + $this->_customerModelMock->expects($this->any()) + ->method('load') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'getFirstname' => self::FIRSTNAME, + 'getLastname' => self::LASTNAME, + 'getName' => self::NAME, + 'getEmail' => self::EMAIL, + 'getAttributes' => array($this->_attributeModelMock), + ) + ); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + $service = $this->_createService(); + + $firstCall = $service->getCustomer(self::ID); + $secondCall = $service->getCustomer(1); + + $this->assertSame($firstCall, $secondCall); + } + + public function testSaveCustomer() + { + $customerData = [ + 'customer_id' => self::ID, + 'email' => self::EMAIL, + 'firstname' => self::FIRSTNAME, + 'lastname' => self::LASTNAME, + 'create_in' => 'Admin', + 'password' => 'password' + ]; + $this->_customerBuilder->populateWithArray($customerData); + $customerEntity = $this->_customerBuilder->create(); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + 'load' => $this->_customerModelMock, + ) + ); + + // verify + $this->_customerModelMock->expects($this->atLeastOnce()) + ->method('setData'); + + $customerService = $this->_createService(); + + $this->assertEquals(self::ID, $customerService->saveCustomer($customerEntity)); + } + + public function testSaveNonexistingCustomer() + { + $customerData = [ + 'customer_id' => self::ID, + 'email' => self::EMAIL, + 'firstname' => self::FIRSTNAME, + 'lastname' => self::LASTNAME, + 'create_in' => 'Admin', + 'password' => 'password' + ]; + $this->_customerBuilder->populateWithArray($customerData); + $customerEntity = $this->_customerBuilder->create(); + + $this->_customerFactoryMock->expects($this->atLeastOnce()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => '2', + ) + ); + + // verify + $this->_customerModelMock->expects($this->atLeastOnce()) + ->method('setData'); + + $customerService = $this->_createService(); + + $this->assertEquals(2, $customerService->saveCustomer($customerEntity)); + } + + public function testSaveNewCustomer() + { + $customerData = [ + 'email' => self::EMAIL, + 'firstname' => self::FIRSTNAME, + 'lastname' => self::LASTNAME, + 'create_in' => 'Admin', + 'password' => 'password' + ]; + $this->_customerBuilder->populateWithArray($customerData); + $customerEntity = $this->_customerBuilder->create(); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + ) + ); + + // verify + $this->_customerModelMock->expects($this->atLeastOnce()) + ->method('setData'); + + $customerService = $this->_createService(); + + $this->assertEquals(self::ID, $customerService->saveCustomer($customerEntity)); + } + + /** + * @expectedException \Magento\Customer\Service\Entity\V1\Exception + * @expectedExceptionMessage exception message + */ + public function testSaveCustomerWithException() + { + $customerData = [ + 'email' => self::EMAIL, + 'firstname' => self::FIRSTNAME, + 'lastname' => self::LASTNAME, + 'create_in' => 'Admin', + 'password' => 'password' + ]; + $this->_customerBuilder->populateWithArray($customerData); + $customerEntity = $this->_customerBuilder->create(); + + $this->_customerFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->_customerModelMock)); + + $this->_mockReturnValue( + $this->_customerModelMock, + array( + 'getId' => self::ID, + ) + ); + + $this->_customerModelMock->expects($this->once()) + ->method('save') + ->will($this->throwException(new \Exception('exception message'))); + + // verify + $customerService = $this->_createService(); + + $customerService->saveCustomer($customerEntity); + } + + /** + * @param \PHPUnit_Framework_MockObject_MockObject $mock + * @param array $valueMap + */ + private function _mockReturnValue($mock, $valueMap) + { + foreach ($valueMap as $method => $value) { + $mock->expects($this->any()) + ->method($method) + ->will($this->returnValue($value)); + } + } + + /** + * @return CustomerService + */ + private function _createService() + { + $customerService = new CustomerService( + $this->_converter + ); + return $customerService; + } + + private function _setupStoreMock() + { + $this->_storeManagerMock = + $this->getMockBuilder('\Magento\Core\Model\StoreManagerInterface') + ->disableOriginalConstructor() + ->getMock(); + + $this->_storeMock = $this->getMockBuilder('\Magento\Core\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + + $this->_storeManagerMock + ->expects($this->any()) + ->method('getStore') + ->will($this->returnValue($this->_storeMock)); + } + +} diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/AddressTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/AddressTest.php new file mode 100644 index 0000000000000000000000000000000000000000..1f58ade0380aa89fcdf35509af1787b7daec28ef --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/AddressTest.php @@ -0,0 +1,218 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1\Dto; + +use Magento\Customer\Service\V1\Dto\Address; +use Magento\Customer\Service\V1\Dto\AddressBuilder; + +class AddressTest extends \PHPUnit_Framework_TestCase +{ + /** Sample values for testing */ + const ID = 14; + const IS_SHIPPING = true; + const IS_BILLING = false; + const COMPANY = 'Company Name'; + const FAX = '(555) 555-5555'; + const MIDDLENAME = 'Mid'; + const PREFIX = 'Mr.'; + const SUFFIX = 'Esq.'; + const VAT_ID = 'S45'; + const FIRSTNAME = 'Jane'; + const LASTNAME = 'Doe'; + const STREET_LINE_0 = '7700 W Parmer Ln'; + const CITY = 'Austin'; + const COUNTRY_CODE = 'US'; + const POSTCODE = '78620'; + const TELEPHONE = '5125125125'; + const REGION = 'Texas'; + + protected $_expectedValues = [ + 'id' => 14, + 'default_shipping' => true, + 'default_billing' => false, + 'company' => 'Company Name', + 'fax' => '(555) 555-5555', + 'middlename' => 'Mid', + 'prefix' => 'Mr.', + 'suffix' => 'Esq.', + 'vat_id' => 'S45', + 'firstname' => 'Jane', + 'lastname' => 'Doe', + 'street' => ['7700 W Parmer Ln'], + 'city' => 'Austin', + 'country_id' => 'US', + 'postcode' => '78620', + 'telephone' => '5125125125', + 'region_id' => 0, + 'region' => 'Texas', + ]; + + /** + * @var \Magento\Customer\Service\V1\Dto\AddressBuilder + */ + protected $_addressBuilder; + + protected function setUp() + { + $this->_addressBuilder = new \Magento\Customer\Service\V1\Dto\AddressBuilder( + new \Magento\Customer\Service\V1\Dto\RegionBuilder() + ); + } + + public function testMinimalAddress() + { + $this->_fillMinimumRequiredFields($this->_addressBuilder); + $this->_assertMinimumRequiredFields($this->_addressBuilder->create()); + } + + public function testCopyAndModify() + { + /** @var \Magento\Customer\Service\V1\Dto\Address $origAddress */ + $origAddress = $this->getMockBuilder('\Magento\Customer\Service\V1\Dto\Address') + ->disableOriginalConstructor() + ->getMock(); + $this->_mockReturnValue($origAddress, array( + 'getFirstname' => $this->_expectedValues['firstname'], + 'getLastname' => $this->_expectedValues['lastname'], + 'getStreet' => $this->_expectedValues['street'], + 'getCity' => $this->_expectedValues['city'], + 'getCountryId' => $this->_expectedValues['country_id'], + 'getRegion' => new \Magento\Customer\Service\V1\Dto\Region(['region' => 'Texas', 'region_code' => '']), + 'getPostcode' => $this->_expectedValues['postcode'], + 'getTelephone' => $this->_expectedValues['telephone'], + )); + + $this->_assertMinimumRequiredFields($origAddress); + } + + public function testFullAddress() + { + $this->_fillAllFields($this->_addressBuilder); + $address = $this->_addressBuilder->create(); + + $this->_assertMinimumRequiredFields($address); + $this->assertEquals($this->_expectedValues['id'], $address->getId()); + $this->assertEquals($this->_expectedValues['default_shipping'], $address->isDefaultShipping()); + $this->assertEquals($this->_expectedValues['default_billing'], $address->isDefaultBilling()); + $this->assertEquals($this->_expectedValues['company'], $address->getCompany()); + $this->assertEquals($this->_expectedValues['fax'], $address->getFax()); + $this->assertEquals($this->_expectedValues['middlename'], $address->getMiddlename()); + $this->assertEquals($this->_expectedValues['prefix'], $address->getPrefix()); + $this->assertEquals($this->_expectedValues['suffix'], $address->getSuffix()); + $this->assertEquals($this->_expectedValues['vat_id'], $address->getVatId()); + } + + public function testSetStreet() + { + $this->_fillMinimumRequiredFields($this->_addressBuilder); + $tmpAddress = $this->_addressBuilder->create(); + $street = $tmpAddress->getStreet(); + $street[] = 'Line_1'; + $this->_addressBuilder->populate($tmpAddress); + $this->_addressBuilder->setStreet($street); + + $address = $this->_addressBuilder->create(); + $this->_assertMinimumRequiredFields($address); + $this->assertEquals('Line_1', $address->getStreet()[1]); + } + + public function testGetAttributes() + { + $this->_fillAllFields($this->_addressBuilder); + $expected = $this->_expectedValues; + unset($expected['id']); + unset($expected['default_billing']); + unset($expected['default_shipping']); + $this->assertEquals($expected, $this->_addressBuilder->create()->getAttributes()); + } + + /** + * @param \PHPUnit_Framework_MockObject_MockObject $mock + * @param array $valueMap + */ + private function _mockReturnValue($mock, $valueMap) + { + foreach ($valueMap as $method => $value) { + $mock->expects($this->any()) + ->method($method) + ->will($this->returnValue($value)); + } + } + + /** + * @param AddressBuilder $address + */ + private function _fillMinimumRequiredFields($addressBuilder) + { + $addressBuilder->setFirstname($this->_expectedValues['firstname']); + $addressBuilder->setLastname($this->_expectedValues['lastname']); + $addressBuilder->setStreet($this->_expectedValues['street']); + $addressBuilder->setCity($this->_expectedValues['city']); + $addressBuilder->setCountryId($this->_expectedValues['country_id']); + $addressBuilder->setRegion( + new \Magento\Customer\Service\V1\Dto\Region(['region' => $this->_expectedValues['region'], + 'region_code' => '']) + ); + $addressBuilder->setPostcode($this->_expectedValues['postcode']); + $addressBuilder->setTelephone($this->_expectedValues['telephone']); + } + + /** + * @param Address $address + */ + private function _fillAllFields($addressBuilder) + { + $this->_fillMinimumRequiredFields($addressBuilder); + + $addressBuilder->setId($this->_expectedValues['id']); + $addressBuilder->setSuffix($this->_expectedValues['suffix']); + $addressBuilder->setMiddlename($this->_expectedValues['middlename']); + $addressBuilder->setPrefix($this->_expectedValues['prefix']); + $addressBuilder->setVatId($this->_expectedValues['vat_id']); + $addressBuilder->setDefaultShipping($this->_expectedValues['default_shipping']); + $addressBuilder->setDefaultBilling($this->_expectedValues['default_billing']); + $addressBuilder->setCompany($this->_expectedValues['company']); + $addressBuilder->setFax($this->_expectedValues['fax']); + } + + /** + * @param Address $address + */ + private function _assertMinimumRequiredFields($address) + { + $this->assertEquals($this->_expectedValues['firstname'], $address->getFirstname()); + $this->assertEquals($this->_expectedValues['lastname'], $address->getLastname()); + $this->assertEquals($this->_expectedValues['street'][0], $address->getStreet()[0]); + $this->assertEquals($this->_expectedValues['city'], $address->getCity()); + $this->assertEquals($this->_expectedValues['country_id'], $address->getCountryId()); + $this->assertEquals( + new \Magento\Customer\Service\V1\Dto\Region(['region' => $this->_expectedValues['region'], + 'region_code' => '']), + $address->getRegion() + ); + $this->assertEquals($this->_expectedValues['postcode'], $address->getPostcode()); + $this->assertEquals($this->_expectedValues['telephone'], $address->getTelephone()); + } +} diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/CustomerTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/CustomerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..138774bf6fcab0c245ef156a348029a524741d60 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/CustomerTest.php @@ -0,0 +1,156 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1\Dto; + +/** + * Customer + * + * @package Magento\Customer\Service\Entity\V1 + */ +class CustomerTest extends \PHPUnit_Framework_TestCase +{ + const CONFIRMATION = 'a4fg7h893e39d'; + const CREATED_AT = '2013-11-05'; + const STORE_NAME = 'Store Name'; + const DOB = '1970-01-01'; + const GENDER = 'Male'; + const GROUP_ID = 1; + const MIDDLENAME = 'A'; + const PREFIX = 'Mr.'; + const STORE_ID = 1; + const SUFFIX = 'Esq.'; + const TAXVAT = '12'; + const WEBSITE_ID = 1; + + /** Sample values for testing */ + const ID = 1; + const FIRSTNAME = 'Jane'; + const LASTNAME = 'Doe'; + const NAME = 'J'; + const EMAIL = 'janedoe@example.com'; + const ATTRIBUTE_CODE = 'attribute_code'; + const ATTRIBUTE_VALUE = 'attribute_value'; + + public function testSetters() + { + $customerData = $this->_createCustomerData(); + $customerBuilder = new \Magento\Customer\Service\V1\Dto\CustomerBuilder(); + $customerBuilder->populateWithArray($customerData); + + /** @var Customer $customer */ + $customer = $customerBuilder->create(); + + $this->assertEquals(self::ID, $customer->getCustomerId()); + $this->assertEquals(self::FIRSTNAME, $customer->getFirstname()); + $this->assertEquals(self::LASTNAME, $customer->getLastname()); + $this->assertEquals(self::EMAIL, $customer->getEmail()); + $this->assertEquals(self::CONFIRMATION, $customer->getConfirmation()); + $this->assertEquals(self::CREATED_AT, $customer->getCreatedAt()); + $this->assertEquals(self::STORE_NAME, $customer->getCreatedIn()); + $this->assertEquals(self::DOB, $customer->getDob()); + $this->assertEquals(self::GENDER, $customer->getGender()); + $this->assertEquals(self::GROUP_ID, $customer->getGroupId()); + $this->assertEquals(self::MIDDLENAME, $customer->getMiddlename()); + $this->assertEquals(self::PREFIX, $customer->getPrefix()); + $this->assertEquals(self::STORE_ID, $customer->getStoreId()); + $this->assertEquals(self::SUFFIX, $customer->getSuffix()); + $this->assertEquals(self::TAXVAT, $customer->getTaxvat()); + $this->assertEquals(self::WEBSITE_ID, $customer->getWebsiteId()); + $attribute = $customer->getAttribute(self::ATTRIBUTE_CODE); + $this->assertEquals(self::ATTRIBUTE_VALUE, $attribute); + } + + public function testGetAttributeNotExist() + { + $customerData = $this->_createCustomerData(); + $customerBuilder = new \Magento\Customer\Service\V1\Dto\CustomerBuilder(); + $customerBuilder->populateWithArray($customerData); + /** @var Customer $customer */ + $customer = $customerBuilder->create(); + + $this->assertNull($customer->getAttribute('A non existing attribute code')); + } + + public function testGetAttributes() + { + $customerData = $this->_createCustomerData(); + /** @var CustomerBuilder $customerBuilder */ + $customerBuilder = new \Magento\Customer\Service\V1\Dto\CustomerBuilder(); + $customerBuilder->populateWithArray($customerData); + /** @var Customer $customer */ + $customer = $customerBuilder->create(); + + $actualAttributes = $customer->getAttributes(); + $this->assertEquals( + [ + 'confirmation' => self::CONFIRMATION, + 'created_at' => self::CREATED_AT, + 'created_in' => self::STORE_NAME, + 'dob' => self::DOB, + 'email' => self::EMAIL, + 'firstname' => self::FIRSTNAME, + 'gender' => self::GENDER, + 'group_id' => self::GROUP_ID, + 'lastname' => self::LASTNAME, + 'middlename' => self::MIDDLENAME, + 'prefix' => self::PREFIX, + 'store_id' => self::STORE_ID, + 'suffix' => self::SUFFIX, + 'taxvat' => self::TAXVAT, + 'website_id' => self::WEBSITE_ID, + self::ATTRIBUTE_CODE => self::ATTRIBUTE_VALUE, + ], + $actualAttributes + ); + } + + /** + * Create customer using setters. + * + * @return CustomerBuilder + */ + private function _createCustomerData() + { + return [ + self::ATTRIBUTE_CODE => self::ATTRIBUTE_VALUE, + 'id' => self::ID, + 'firstname' => self::FIRSTNAME, + 'lastname' => self::LASTNAME, + 'email' => self::EMAIL, + 'confirmation' => self::CONFIRMATION, + 'created_at' => self::CREATED_AT, + 'created_in' => self::STORE_NAME, + 'dob' => self::DOB, + 'gender' => self::GENDER, + 'group_id' => self::GROUP_ID, + 'middlename' => self::MIDDLENAME, + 'prefix' => self::PREFIX, + 'store_id' => self::STORE_ID, + 'suffix' => self::SUFFIX, + 'taxvat' => self::TAXVAT, + 'website_id' => self::WEBSITE_ID + ]; + } +} diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4ae711b6411471726ace54858a548664a8e389a7 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataTest.php @@ -0,0 +1,58 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1\Dto\Eav; + +class AttributeMetadataTest extends \PHPUnit_Framework_TestCase +{ + /** + * Constants for testing + */ + const ATTRIBUTE_CODE = 'ATTRIBUTE_CODE'; + const FRONT_END_INPUT = 'FRONT_END_INPUT'; + const INPUT_FILTER = 'INPUT_FILTER'; + const STORE_LABEL = 'STORE_LABEL'; + const VALIDATION_RULES = 'VALIDATION_RULES'; + + public function testConstructorAndGetters() + { + $options = array('OPTION_ONE', 'OPTION_TWO'); + + $attributeMetadata = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata([ + 'attribute_code' => self::ATTRIBUTE_CODE, + 'front_end_input' => self::FRONT_END_INPUT, + 'input_filter' => self::INPUT_FILTER, + 'store_label' => self::STORE_LABEL, + 'validation_rules' => self::VALIDATION_RULES, + 'options' => $options + ]); + + $this->assertSame(self::ATTRIBUTE_CODE, $attributeMetadata->getAttributeCode()); + $this->assertSame(self::FRONT_END_INPUT, $attributeMetadata->getFrontendInput()); + $this->assertSame(self::INPUT_FILTER, $attributeMetadata->getInputFilter()); + $this->assertSame(self::STORE_LABEL, $attributeMetadata->getStoreLabel()); + $this->assertSame(self::VALIDATION_RULES, $attributeMetadata->getValidationRules()); + $this->assertSame($options, $attributeMetadata->getOptions()); + } +} diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeTest.php new file mode 100644 index 0000000000000000000000000000000000000000..808a9b563e16dac0a4a670b3f55cccbcf58b1bd9 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeTest.php @@ -0,0 +1,43 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1\Dto\Eav; + +class AttributeTest extends \PHPUnit_Framework_TestCase +{ + const ATTRIBUTE_CODE = 'ATTRIBUTE_CODE'; + + const VALUE = 'VALUE'; + + public function testConstructorAndGetters() + { + $attribute = new \Magento\Customer\Service\V1\Dto\Eav\Attribute([ + 'attribute_code' => self::ATTRIBUTE_CODE, + 'value' => self::VALUE + ]); + + $this->assertSame(self::ATTRIBUTE_CODE, $attribute->getAttributeCode()); + $this->assertSame(self::VALUE, $attribute->getValue()); + } +} diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/OptionTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/OptionTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4b63e285dd70ddddf70de5471cbc02143a87bb29 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/OptionTest.php @@ -0,0 +1,43 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Customer\Service\V1\Dto\Eav; + +class OptionTest extends \PHPUnit_Framework_TestCase +{ + const LABEL = 'LABEL'; + + const VALUE = 'VALUE'; + + public function testConstructorAndGetters() + { + $option = new \Magento\Customer\Service\V1\Dto\Eav\Option([ + 'label' => self::LABEL, + 'value' => self::VALUE + ]); + + $this->assertSame(self::LABEL, $option->getLabel()); + $this->assertSame(self::VALUE, $option->getValue()); + } +} diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/RegionTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/RegionTest.php new file mode 100644 index 0000000000000000000000000000000000000000..bb323654fdd3c059e4adc0395db656a55fec42dd --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/RegionTest.php @@ -0,0 +1,44 @@ +<?php +/** + * Test \Magento\Customer\Service\Entity\V1\Region + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Customer\Service\V1\Dto; + +use Magento\Customer\Service\V1\Dto\Region; + +class RegionTest extends \PHPUnit_Framework_TestCase +{ + public function testRegion() + { + $region = new Region([ + 'region' => 'Alabama', + 'region_code' => 'AL', + 'region_id' => 1 + ]); + + $this->assertEquals(1, $region->getRegionId()); + $this->assertEquals('AL', $region->getRegionCode()); + $this->assertEquals('Alabama', $region->getRegion()); + } +} diff --git a/dev/tests/unit/testsuite/Magento/Directory/Model/Currency/DefaultLocatorTest.php b/dev/tests/unit/testsuite/Magento/Directory/Model/Currency/DefaultLocatorTest.php index 1f032999678e9a2726ce7322a8125d344ab4e3b1..e647fae51ccb933c6f956905203b91b1fe2891ee 100644 --- a/dev/tests/unit/testsuite/Magento/Directory/Model/Currency/DefaultLocatorTest.php +++ b/dev/tests/unit/testsuite/Magento/Directory/Model/Currency/DefaultLocatorTest.php @@ -55,9 +55,8 @@ class DefaultLocatorTest extends \PHPUnit_Framework_TestCase public function testGetDefaultCurrencyReturnDefaultStoreDefaultCurrencyIfNoStoreIsSpecified() { - $storeMock = $this->getMock('Magento\Core\Model\Store', array(), array(), '', false); - $storeMock->expects($this->once())->method('getBaseCurrencyCode')->will($this->returnValue('storeCurrency')); - $this->_appMock->expects($this->once())->method('getStore')->will($this->returnValue($storeMock)); + $this->_appMock->expects($this->once())->method('getBaseCurrencyCode') + ->will($this->returnValue('storeCurrency')); $this->assertEquals('storeCurrency', $this->_model->getDefaultCurrency($this->_requestMock)); } diff --git a/dev/tests/unit/testsuite/Magento/Image/Adapter/Gd2Test.php b/dev/tests/unit/testsuite/Magento/Image/Adapter/Gd2Test.php new file mode 100644 index 0000000000000000000000000000000000000000..51f061dd3ff1b12a48ee915ee87ec2f1ecec9ea8 --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Image/Adapter/Gd2Test.php @@ -0,0 +1,172 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Image\Adapter; + +use \Magento\TestFramework\Helper\ObjectManager; + +/** + * Mocking crucial for this adapter global functions + */ + +/** + * @param $paramName + * @throws \InvalidArgumentException + * @return string + */ +function ini_get($paramName) +{ + if ('memory_limit' == $paramName) { + return Gd2Test::$memoryLimit; + } + + throw new \InvalidArgumentException('Unexpected parameter ' . $paramName); +} + +/** + * @param $file + * @return mixed + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ +function getimagesize($file) +{ + return Gd2Test::$imageData; +} + +/** + * @param $real + * @return int + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ +function memory_get_usage($real) +{ + return 1000000; +} + +/** + * @param $callable + * @param $param + * @return bool + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ +function call_user_func($callable, $param) +{ + return false; +} + +/** + * \Magento\Image\Adapter\Gd2 class test + */ +class Gd2Test extends \PHPUnit_Framework_TestCase +{ + /** + * Value to mock ini_get('memory_limit') + * + * @var string + */ + public static $memoryLimit; + + /** + * @var array simulation of getimagesize() + */ + public static $imageData = array(); + + /** + * Adapter for testing + * @var \Magento\Image\Adapter\Gd2 + */ + protected $adapter; + + /** + * @var \Magento\TestFramework\Helper\ObjectManager + */ + protected $objectManager; + + /** + * Setup testing object + */ + public function setUp() + { + $this->objectManager = new ObjectManager($this); + $this->adapter = $this->objectManager->getObject('\Magento\Image\Adapter\Gd2'); + } + + /** + * Test parent class + */ + public function testParentClass() + { + $this->assertInstanceOf('\Magento\Image\Adapter\AbstractAdapter', $this->adapter); + } + + /** + * Test open() method + * + * @param $fileData array + * @param $exception string|bool|null + * @param $limit string + * @dataProvider filesProvider + */ + public function testOpen($fileData, $exception, $limit) + { + self::$memoryLimit = $limit; + self::$imageData = $fileData; + + if (!empty($exception)) { + $this->setExpectedException($exception); + } + + $this->adapter->open('file'); + } + + public function filesProvider() + { + $smallFile = array( + 0 => 480, + 1 => 320, + 2 => 2, + 3 => 'width="480" height="320"', + 'bits' => 8, + 'channels' => 3, + 'mime' => 'image/jpeg', + ); + + $bigFile = array( + 0 => 3579, + 1 => 2398, + 2 => 2, + 3 => 'width="3579" height="2398"', + 'bits' => 8, + 'channels' => 3, + 'mime' => 'image/jpeg', + ); + + return array( + 'positive_M' => array($smallFile, false, '2M'), + 'positive_KB' => array($smallFile, false, '2048KB'), + 'negative_bytes' => array($bigFile, 'OverflowException', '2048000') + ); + } +} diff --git a/dev/tests/unit/testsuite/Magento/Paypal/Block/Express/ReviewTest.php b/dev/tests/unit/testsuite/Magento/Paypal/Block/Express/ReviewTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8297f11cba7c4d89de2470fdbaf41cc269ea53ae --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Paypal/Block/Express/ReviewTest.php @@ -0,0 +1,75 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +namespace Magento\Paypal\Block\Express; + +class ReviewTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\App\Request\Http|\PHPUnit_Framework_MockObject_MockObject + */ + protected $request; + + /** + * @var \Magento\View\Url|\PHPUnit_Framework_MockObject_MockObject + */ + protected $viewUrl; + + /** + * @var Review + */ + protected $model; + + protected function setUp() + { + $helper = new \Magento\TestFramework\Helper\ObjectManager($this); + $this->request = $this->getMock('Magento\App\Request\Http', [], [], '', false); + $this->viewUrl = $this->getMock('Magento\View\Url', [], [], '', false); + $this->model = $helper->getObject( + 'Magento\Paypal\Block\Express\Review', + ['request' => $this->request, 'viewUrl' => $this->viewUrl] + ); + } + + /** + * @param bool $isSecure + * @dataProvider getViewFileUrlDataProvider + */ + public function testGetViewFileUrl($isSecure) + { + $this->request->expects($this->once())->method('isSecure')->will($this->returnValue($isSecure)); + $this->viewUrl->expects($this->once()) + ->method('getViewFileUrl') + ->with('some file', $this->callback(function ($value) use ($isSecure) { + return isset($value['_secure']) && $value['_secure'] === $isSecure; + })) + ->will($this->returnValue('result url')); + $this->assertEquals('result url', $this->model->getViewFileUrl('some file')); + } + + public function getViewFileUrlDataProvider() + { + return [[true], [false]]; + } +} diff --git a/lib/3Dsecure/CentinelClient.php b/lib/3Dsecure/CentinelClient.php index d37c0d70d427f14b920b7f1bd679a9aeb76ce861..c2f19380cbe2e4c34e2fe89ec120d068e97b351a 100644 --- a/lib/3Dsecure/CentinelClient.php +++ b/lib/3Dsecure/CentinelClient.php @@ -92,7 +92,7 @@ curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); // Execute the request. diff --git a/lib/Magento/App/Response/Http/FileFactory.php b/lib/Magento/App/Response/Http/FileFactory.php index d7f720a7c24306755cb39525d3436cd721589ece..f48a1538713ccaeb9de06e4c8aaa50c76ec64fac 100644 --- a/lib/Magento/App/Response/Http/FileFactory.php +++ b/lib/Magento/App/Response/Http/FileFactory.php @@ -55,6 +55,7 @@ class FileFactory * @param string $fileName * @param string|array $content set to null to avoid starting output, $contentLength should be set explicitly in * that case + * @param string $baseDir * @param string $contentType * @param int $contentLength explicit content length, if strlen($content) isn't applicable * @throws \Exception @@ -65,9 +66,14 @@ class FileFactory * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExitExpression) */ - public function create($fileName, $content, $contentType = 'application/octet-stream', $contentLength = null) - { - $dir = $this->_filesystem->getDirectoryWrite(\Magento\Filesystem::VAR_DIR); + public function create( + $fileName, + $content, + $baseDir = \Magento\Filesystem::ROOT, + $contentType = 'application/octet-stream', + $contentLength = null + ) { + $dir = $this->_filesystem->getDirectoryWrite($baseDir); $isFile = false; $file = null; if (is_array($content)) { diff --git a/lib/Magento/Convert/Object.php b/lib/Magento/Convert/Object.php index 5133fb7790668713fc117a11a90dd707ee4cbe30..488407282a75503ec5fbef13a0b8d91a672387e3 100644 --- a/lib/Magento/Convert/Object.php +++ b/lib/Magento/Convert/Object.php @@ -97,4 +97,74 @@ class Object return $result; } + /** + * Converts the list of objects into an array of the form: [ [ 'label' => <id>, 'value' => <value> ], ... ]. + * + * + * The <id> and <value> values are taken from the objects in the list using the $idField and $valueField + * parameters, which can be either the name of the field to use, or a closure. + * + * @param array $items + * @param string|callable $idField + * @param string|callable $valueField + * + * @return array + */ + public function toOptionArray(array $items, $idField, $valueField) + { + $options = []; + foreach ($items as $item) { + $options[] = ['value' => $this->_invokeGetter($item, $idField), + 'label' => $this->_invokeGetter($item, $valueField)]; + } + return $options; + } + + /** + * Converts the list of objects into an array of the form: [ <id> => <value>, ... ]. + * + * + * The <id> and <value> values are taken from the objects in the list using the $idField and $valueField parameters, + * which can be either the name of the field to use, or a closure. + * + * @param array $items + * @param string|callable $idField + * @param string|callable $valueField + * + * @return array + */ + public function toOptionHash(array $items, $idField, $valueField) + { + $options = []; + foreach ($items as $item) { + $options[$this->_invokeGetter($item, $idField)] = $this->_invokeGetter($item, $valueField); + } + return $options; + } + + /** + * Returns the value of the property represented by $field on the $item object. + * + * + * When $field is a closure, the $item parameter is passed to the $field method, otherwise the $field is assumed + * to be a property name, and the associated get method is invoked on the $item instead. + * + * @param mixed $item + * @param string|callable $field + * + * @return mixed + */ + protected function _invokeGetter($item, $field) + { + if (is_callable($field)) { + // if $field is a closure, use that on the item + return $field($item); + } else { + // otherwise, turn it into a call to the item's getter method + $methodName = 'get' . str_replace(' ', '', ucwords(str_replace('_', ' ', $field))); + return $item->$methodName(); + } + } + + } diff --git a/lib/Magento/HTTP/Adapter/Curl.php b/lib/Magento/HTTP/Adapter/Curl.php index 01b622342b554e3cd0612db6b87bf075e2e93b88..d59754edd440831200334ce5abfc9f81dcc9ee44 100644 --- a/lib/Magento/HTTP/Adapter/Curl.php +++ b/lib/Magento/HTTP/Adapter/Curl.php @@ -85,10 +85,10 @@ class Curl implements \Zend_Http_Client_Adapter_Interface curl_setopt($this->_getResource(), $option, $value); } - $verifyPeer = isset($this->_config['verifypeer']) ? $this->_config['verifypeer'] : 0; + $verifyPeer = isset($this->_config['verifypeer']) ? $this->_config['verifypeer'] : true; curl_setopt($this->_getResource(), CURLOPT_SSL_VERIFYPEER, $verifyPeer); - $verifyHost = isset($this->_config['verifyhost']) ? $this->_config['verifyhost'] : 0; + $verifyHost = isset($this->_config['verifyhost']) ? $this->_config['verifyhost'] : 2; curl_setopt($this->_getResource(), CURLOPT_SSL_VERIFYHOST, $verifyHost); foreach ($this->_config as $param => $curlOption) { diff --git a/lib/Magento/Image/Adapter/Gd2.php b/lib/Magento/Image/Adapter/Gd2.php index a02472f3dc6f1f2de50f58ce7b7a26bff017ab4e..91d72e8b0c7b1d36843da28c4dd38e960d0122ad 100644 --- a/lib/Magento/Image/Adapter/Gd2.php +++ b/lib/Magento/Image/Adapter/Gd2.php @@ -60,15 +60,77 @@ class Gd2 extends \Magento\Image\Adapter\AbstractAdapter * Open image for processing * * @param string $filename + * @throws \OverflowException */ public function open($filename) { $this->_fileName = $filename; $this->getMimeType(); $this->_getFileAttributes(); + if ($this->_isMemoryLimitReached()) { + throw new \OverflowException('Memory limit has been reached.'); + } $this->_imageHandler = call_user_func($this->_getCallback('create'), $this->_fileName); } + /** + * Checks whether memory limit is reached. + * + * @return bool + */ + protected function _isMemoryLimitReached() + { + $limit = $this->_convertToByte(ini_get('memory_limit')); + $requiredMemory = $this->_getImageNeedMemorySize($this->_fileName); + return (memory_get_usage(true) + $requiredMemory) > $limit; + } + + /** + * Get image needed memory size + * + * @param string $file + * @return float|int + */ + protected function _getImageNeedMemorySize($file) + { + $imageInfo = getimagesize($file); + if (!isset($imageInfo[0]) || !isset($imageInfo[1])) { + return 0; + } + if (!isset($imageInfo['channels'])) { + // if there is no info about this parameter lets set it for maximum + $imageInfo['channels'] = 4; + } + if (!isset($imageInfo['bits'])) { + // if there is no info about this parameter lets set it for maximum + $imageInfo['bits'] = 8; + } + + return round( + ($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65 + ); + } + + /** + * Converts memory value (e.g. 64M, 129KB) to bytes. + * Case insensitive value might be used. + * + * @param string $memoryValue + * @return int + */ + protected function _convertToByte($memoryValue) + { + if (stripos($memoryValue, 'G') !== false) { + return (int)$memoryValue * pow(1024, 3); + } elseif (stripos($memoryValue, 'M') !== false) { + return (int)$memoryValue * 1024 * 1024; + } elseif (stripos($memoryValue, 'KB') !== false) { + return (int)$memoryValue * 1024; + } + + return (int)$memoryValue; + } + /** * Save image to specific path. * If some folders of path does not exist they will be created @@ -96,9 +158,12 @@ class Gd2 extends \Magento\Image\Adapter\AbstractAdapter imagecopy( $newImage, $this->_imageHandler, - 0, 0, - 0, 0, - $this->_imageSrcWidth, $this->_imageSrcHeight + 0, + 0, + 0, + 0, + $this->_imageSrcWidth, + $this->_imageSrcHeight ); $this->_imageHandler = $newImage; } diff --git a/lib/Magento/Oauth/Helper/Request.php b/lib/Magento/Oauth/Helper/Request.php index 46414b13e98a7d9a797da88ae5f7eb8411c1cfed..86bb41f6749a7713a4ccd27c11c03f9ee80816bd 100644 --- a/lib/Magento/Oauth/Helper/Request.php +++ b/lib/Magento/Oauth/Helper/Request.php @@ -280,4 +280,4 @@ class Request $response->setHttpResponseCode($responseCode); return array('oauth_problem' => $errorMsg); } -} \ No newline at end of file +} diff --git a/lib/Magento/Object/Copy.php b/lib/Magento/Object/Copy.php index cdda521e19354ae4964190bcf53aaff02f4dd439..bd37410260e6b8740116dfc44fbe73c281916fb9 100644 --- a/lib/Magento/Object/Copy.php +++ b/lib/Magento/Object/Copy.php @@ -104,6 +104,42 @@ class Copy return $target; } + /** + * Get data from object|array to object|array containing fields + * from fieldset matching an aspect. + * + * @param string $fieldset + * @param string $aspect a field name + * @param array|\Magento\Object $source + * @param string $root + * @return array $data + */ + public function getDataFromFieldset($fieldset, $aspect, $source, $root='global') + { + if (!(is_array($source) || $source instanceof \Magento\Object)) { + return null; + } + $fields = $this->_fieldsetConfig->getFieldset($fieldset, $root); + if (is_null($fields)) { + return null; + } + + $data = array(); + foreach ($fields as $code => $node) { + if (empty($node[$aspect])) { + continue; + } + + $value = $this->_getFieldsetFieldValue($source, $code); + + $targetCode = (string)$node[$aspect]; + $targetCode = $targetCode == '*' ? $code : $targetCode; + $data[$targetCode] = $value; + } + + return $data; + } + /** * Check if source and target are valid input for converting using fieldset * diff --git a/lib/Magento/Service/Entity/AbstractDto.php b/lib/Magento/Service/Entity/AbstractDto.php new file mode 100644 index 0000000000000000000000000000000000000000..27e19a2fba85a44bfb5a92f2dcaffce146d23d32 --- /dev/null +++ b/lib/Magento/Service/Entity/AbstractDto.php @@ -0,0 +1,63 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Service\Entity; + +abstract class AbstractDto +{ + /** + * @var array + */ + protected $_data; + + /** + * Initialize internal storage + * + * @param array $data + */ + public function __construct(array $data) + { + $this->_data = $data; + } + + /** + * Retrieves a value from the data array if set, or null otherwise. + * + * @param string $key + * @return mixed|null + */ + protected function _get($key) + { + return isset($this->_data[$key]) ? $this->_data[$key]: null; + } + + /** + * Return DTO data in array format. + * + * @return \ArrayAccess + */ + public function __toArray() + { + return $this->_data; + } +} diff --git a/lib/Magento/Service/Entity/AbstractDtoBuilder.php b/lib/Magento/Service/Entity/AbstractDtoBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..4116091276708a999da66616817c8075ca178300 --- /dev/null +++ b/lib/Magento/Service/Entity/AbstractDtoBuilder.php @@ -0,0 +1,111 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +namespace Magento\Service\Entity; + +abstract class AbstractDtoBuilder +{ + /** + * @var array + */ + protected $_data; + + /** + * Initialize internal storage + */ + public function __construct() + { + $this->_data = array(); + } + + /** + * Populates the fields with an existing entity. + * + * @param \Magento\Service\Entity\AbstractDto $prototype the prototype to base on + * @return $this + */ + public function populate(\Magento\Service\Entity\AbstractDto $prototype) + { + $this->_data = array(); + foreach (get_class_methods(get_class($prototype)) as $method) { + if (substr($method, 0, 3) === 'get') { + $originalDataName = lcfirst(substr($method, 3)); + $dataName = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $originalDataName)); + + if ($dataName === 'attribute' || $dataName === 'attributes') { + continue; + } else { + $value = $prototype->$method(); + if ($value !== null) { + $this->_data[$dataName] = $prototype->$method(); + } + } + } elseif (substr($method, 0, 2) == 'is') { + $originalDataName = lcfirst(substr($method, 2)); + $dataName = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $originalDataName)); + + $this->_data[$dataName] = $prototype->$method(); + } + } + + return $this; + } + + /** + * Populates the fields with data from the array. + * + * @param array $data + */ + public function populateWithArray(array $data) + { + $this->_data = $data; + + return $this; + } + + /** + * Builds the entity. + * + * @return AbstractDto + */ + public function create() + { + $dtoType = substr(get_class($this), 0, -7); + $retObj = new $dtoType($this->_data); + $this->_data = array(); + return $retObj; + } + + /** + * @param string $key + * @param mixed $value + * + * @return AbstractDto + */ + protected function _set($key, $value) + { + $this->_data[$key] = $value; + return $this; + } + +} diff --git a/lib/Magento/View/Element/AbstractBlock.php b/lib/Magento/View/Element/AbstractBlock.php index ded193b6b700a939b145401a981ea2420790ea5c..e9c7d5c78081c3c48ed6c10d95722af8edc9a3ec 100644 --- a/lib/Magento/View/Element/AbstractBlock.php +++ b/lib/Magento/View/Element/AbstractBlock.php @@ -687,6 +687,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface public function getViewFileUrl($file = null, array $params = array()) { try { + $params = array_merge(['_secure' => $this->getRequest()->isSecure()], $params); return $this->_viewUrl->getViewFileUrl($file, $params); } catch (\Magento\Exception $e) { diff --git a/lib/Magento/View/Element/Text/ListText.php b/lib/Magento/View/Element/Text/ListText.php index ec156b6e88e40e441dfd3c32d0dc6fdeb08874a2..7b768abd51210669d125e4b2bd56989a9c530d30 100644 --- a/lib/Magento/View/Element/Text/ListText.php +++ b/lib/Magento/View/Element/Text/ListText.php @@ -42,7 +42,7 @@ class ListText extends \Magento\View\Element\Text $layout = $this->getLayout(); foreach ($this->getChildNames() as $child) { - $this->addText($layout->renderElement($child)); + $this->addText($layout->renderElement($child, false)); } return parent::_toHtml(); diff --git a/pub/lib/dnd.js b/pub/lib/dnd.js new file mode 100644 index 0000000000000000000000000000000000000000..1e1c5386cb0c8cc8d8c3bccf43d3caad95dc0401 --- /dev/null +++ b/pub/lib/dnd.js @@ -0,0 +1,664 @@ +// webkitdragdrop.js v1.0, Mon May 15 2010 +// +// Copyright (c) 2010 Tommaso Buvoli (http://www.tommasobuvoli.com) +// No Extra Libraries are required, simply download this file, add it to your pages! +// +// To See this library in action, grab an ipad and head over to http://www.gotproject.com +// webkitdragdrop is freely distributable under the terms of an MIT-style license. + + +//Description +// Because this library was designed to run without requiring any other libraries, several basic helper functions were implemented +// 6 helper functions in this webkit_tools class have been taked directly from Prototype 1.6.1 (http://prototypejs.org/) (c) 2005-2009 Sam Stephenson + +var webkit_tools = +{ + //$ function - simply a more robust getElementById + + $:function(e) + { + if(typeof(e) == 'string') + { + return document.getElementById(e); + } + return e; + }, + + //extend function - copies the values of b into a (Shallow copy) + + extend:function(a,b) + { + for (var key in b) + { + a[key] = b[key]; + } + return a; + }, + + //empty function - used as defaut for events + + empty:function() + { + + }, + + //remove null values from an array + + compact:function(a) + { + var b = [] + var l = a.length; + for(var i = 0; i < l; i ++) + { + if(a[i] !== null) + { + b.push(a[i]); + } + } + return b; + }, + + //DESCRIPTION + // This function was taken from the internet (http://robertnyman.com/2006/04/24/get-the-rendered-style-of-an-element/) and returns + // the computed style of an element independently from the browser + //INPUT + // oELM (DOM ELEMENT) element whose style should be extracted + // strCssRule element + + getCalculatedStyle:function(oElm, strCssRule) + { + var strValue = ""; + if(document.defaultView && document.defaultView.getComputedStyle){ + strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); + } + else if(oElm.currentStyle){ + strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){ + return p1.toUpperCase(); + }); + strValue = oElm.currentStyle[strCssRule]; + } + return strValue; + }, + + //bindAsEventListener function - used to bind events + + bindAsEventListener:function(f,object) + { + var __method = f; + return function(event) { + __method.call(object, event || window.event); + }; + }, + + //cumulative offset - courtesy of Prototype (http://www.prototypejs.org) + + cumulativeOffset:function(element) + { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (element.style.position == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return {left : valueL, top : valueT}; + }, + + //getDimensions - courtesy of Prototype (http://www.prototypejs.org) + + getDimensions: function(element) + { + var display = element.style.display; + if (display != 'none' && display != null) // Safari bug + return {width: element.offsetWidth, height: element.offsetHeight}; + + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + var originalDisplay = els.display; + els.visibility = 'hidden'; + if (originalPosition != 'fixed') // Switching fixed to absolute causes issues in Safari + els.position = 'absolute'; + els.display = 'block'; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = originalDisplay; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + //hasClassName - courtesy of Prototype (http://www.prototypejs.org) + + hasClassName: function(element, className) + { + var elementClassName = element.className; + return (elementClassName.length > 0 && (elementClassName == className || + new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); + }, + + //addClassName - courtesy of Prototype (http://www.prototypejs.org) + + addClassName: function(element, className) + { + if (!this.hasClassName(element, className)) + element.className += (element.className ? ' ' : '') + className; + return element; + }, + + //removeClassName - courtesy of Prototype (http://www.prototypejs.org) + + removeClassName: function(element, className) + { + element.className = this.strip(element.className.replace(new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ')); + return element; + }, + + //strip - courtesy of Prototype (http://www.prototypejs.org) + + strip:function(s) + { + return s.replace(/^\s+/, '').replace(/\s+$/, ''); + } + +} + +//Description +// Droppable fire events when a draggable is dropped on them + +var webkit_droppables = function() +{ + this.initialize = function() + { + this.droppables = []; + this.droppableRegions = []; + } + + this.add = function(root, instance_props) + { + root = webkit_tools.$(root); + var default_props = {accept : [], hoverClass : null, onDrop : webkit_tools.empty, onOver : webkit_tools.empty, onOut : webkit_tools.empty}; + default_props = webkit_tools.extend(default_props, instance_props || {}); + this.droppables.push({r : root, p : default_props}); + } + + this.remove = function(root) + { + root = webkit_tools.$(root); + var d = this.droppables; + var i = d.length; + while(i--) + { + if(d[i].r == root) + { + d[i] = null; + this.droppables = webkit_tools.compact(d); + return true; + } + } + return false; + } + + //calculate position and size of all droppables + + this.prepare = function() + { + var d = this.droppables; + var i = d.length; + var dR = []; + var r = null; + + while(i--) + { + r = d[i].r; + if(r.style.display != 'none') + { + dR.push({i : i, size : webkit_tools.getDimensions(r), offset : webkit_tools.cumulativeOffset(r)}) + } + } + + this.droppableRegions = dR; + } + + this.finalize = function(x,y,r,e) + { + var indices = this.isOver(x,y); + var index = this.maxZIndex(indices); + var over = this.process(index,r); + if(over) + { + this.drop(index, r,e); + } + this.process(-1,r); + return over; + } + + this.check = function(x,y,r,e) + { + var indices = this.isOver(x,y); + var index = this.maxZIndex(indices); + return this.process(index,r, e); + } + + this.isOver = function(x, y) + { + var dR = this.droppableRegions; + var i = dR.length; + var active = []; + var r = 0; + var maxX = 0; + var minX = 0; + var maxY = 0; + var minY = 0; + + while(i--) + { + r = dR[i]; + + minY = r.offset.top; + maxY = minY + r.size.height; + + if((y > minY) && (y < maxY)) + { + minX = r.offset.left; + maxX = minX + r.size.width; + + if((x > minX) && (x < maxX)) + { + active.push(r.i); + } + } + } + + return active; + } + + this.maxZIndex = function(indices) + { + var d = this.droppables; + var l = indices.length; + var index = -1; + + var maxZ = -100000000; + var curZ = 0; + + while(l--) + { + curZ = parseInt(d[indices[l]].r.style.zIndex || 0); + if(curZ > maxZ) + { + maxZ = curZ; + index = indices[l]; + } + } + + return index; + } + + this.process = function(index, draggableRoot, e) + { + //only perform update if a change has occurred + if(this.lastIndex != index) + { + //remove previous + if(this.lastIndex != null) + { + var d = this.droppables[this.lastIndex] + var p = d.p; + var r = d.r; + + if(p.hoverClass) + { + webkit_tools.removeClassName(r,p.hoverClass); + } + p.onOut(draggableRoot, e); + this.lastIndex = null; + this.lastOutput = false; + } + + //add new + if(index != -1) + { + var d = this.droppables[index] + var p = d.p; + var r = d.r; + + if(this.hasClassNames(draggableRoot, p.accept)) + { + if(p.hoverClass) + { + webkit_tools.addClassName(r,p.hoverClass); + } + p.onOver(draggableRoot, e); + this.lastIndex = index; + this.lastOutput = true; + } + } + } + return this.lastOutput; + } + + this.drop = function(index, r, e) + { + if(index != -1) + { + this.droppables[index].p.onDrop(r,e); + } + } + + this.hasClassNames = function(r, names) + { + var l = names.length; + if(l == 0){return true} + while(l--) + { + if(webkit_tools.hasClassName(r,names[l])) + { + return true; + } + } + return false; + } + + this.initialize(); +} + +webkit_drop = new webkit_droppables(); + +//Description +//webkit draggable - allows users to drag elements with their hands + +var webkit_draggable = function(r, ip) +{ + this.ready = false; + this.timeout = undefined; + this.initialize = function(root, instance_props) + { + this.root = webkit_tools.$(root); + var default_props = {scroll : false, revert : false, handle : this.root, zIndex : 1000, onStart : webkit_tools.empty, onEnd : webkit_tools.empty}; + + this.p = webkit_tools.extend(default_props, instance_props || {}); + default_props.handle = webkit_tools.$(default_props.handle); + this.prepare(); + this.bindEvents(); + } + + this.prepare = function() + { + var rs = this.root.style; + + //set position + if(webkit_tools.getCalculatedStyle(this.root,'position') != 'absolute') + { + rs.position = 'relative'; + } + + //set top, right, bottom, left + rs.top = rs.top || '0px'; + rs.left = rs.left || '0px'; + rs.right = ""; + rs.bottom = ""; + + //set zindex; + rs.zIndex = rs.zIndex || '0'; + } + + this.bindEvents = function() + { + var handle = this.p.handle; + + this.ts = webkit_tools.bindAsEventListener(this.touchStart, this); + this.tm = webkit_tools.bindAsEventListener(this.touchMove, this); + this.te = webkit_tools.bindAsEventListener(this.touchEnd, this); + + handle.addEventListener("touchstart", this.ts, false); + handle.addEventListener("touchmove", this.tm, false); + handle.addEventListener("touchend", this.te, false); + } + + this.destroy = function() + { + var handle = this.p.handle; + + handle.removeEventListener("touchstart", this.ts); + handle.removeEventListener("touchmove", this.tm); + handle.removeEventListener("touchend", this.te); + } + + this.set = function(key, value) + { + this.p[key] = value; + } + + this.touchStart = function(event) + { + this.timeout = setTimeout(function () { + //prepare needed variables + var p = this.p; + var r = this.root; + var rs = r.style; + var t = event.targetTouches[0]; + + //get position of touch + touchX = t.pageX; + touchY = t.pageY; + + //set base values for position of root + rs.top = this.root.style.top || '0px'; + rs.left = this.root.style.left || '0px'; + rs.bottom = null; + rs.right = null; + + var rootP = webkit_tools.cumulativeOffset(r); + var cp = this.getPosition(); + + //save event properties + p.rx = cp.x; + p.ry = cp.y; + p.tx = touchX; + p.ty = touchY; + p.z = parseInt(this.root.style.zIndex); + + //boost zIndex + rs.zIndex = p.zIndex; + webkit_drop.prepare(); + p.onStart(r, event); + + this.ready = true; + + }.bind(this), 500); + } + + this.touchMove = function(event) + { + if ( this.ready ) { + event.preventDefault(); + event.stopPropagation(); + + //prepare needed variables + var p = this.p; + var r = this.root; + var rs = r.style; + var t = event.targetTouches[0]; + if(t == null){return} + + var curX = t.pageX; + var curY = t.pageY; + + var delX = curX - p.tx; + var delY = curY - p.ty; + + rs.webkitTransform = 'translate3d(' + (p.rx + delX) + 'px,' + (p.ry + delY) + 'px, 1px)'; + + //scroll window + if(p.scroll) + { + s = this.getScroll(curX, curY); + if((s[0] != 0) || (s[1] != 0)) + { + window.scrollTo(window.scrollX + s[0], window.scrollY + s[1]); + } + } + + //check droppables + webkit_drop.check(curX, curY, r, event); + + //save position for touchEnd + this.lastCurX = curX; + this.lastCurY = curY; + } + } + + this.touchEnd = function(event) + { + clearTimeout(this.timeout); + if ( this.ready ) { + event.preventSwipe = true; + var r = this.root; + var p = this.p; + var dropped = webkit_drop.finalize(this.lastCurX, this.lastCurY, r, event); + + if(((p.revert) && (!dropped)) || (p.revert === 'always')) + { + //revert root + var rs = r.style; + rs.webkitTransform = 'translate3d(' + p.rx + 'px,' + p.ry + 'px, 1px)'; + //rs.top = (p.ry + 'px'); + //rs.left = (p.rx + 'px'); + } + + r.style.zIndex = this.p.z; + this.p.onEnd(r, event); + this.ready = false; + } + } + + this.getPosition = function() + { + var rs = this.root.style; + return {x : parseInt(rs.left || 0), y : parseInt(rs.top || 0)} + } + + this.getScroll = function(pX, pY) + { + //read window variables + var sX = window.scrollX; + var sY = window.scrollY; + + var wX = window.innerWidth; + var wY = window.innerHeight; + + //set contants + var scroll_amount = 10; //how many pixels to scroll + var scroll_sensitivity = 100; //how many pixels from border to start scrolling from. + + var delX = 0; + var delY = 0; + + //process vertical y scroll + if(pY - sY < scroll_sensitivity) + { + delY = -scroll_amount; + } + else + if((sY + wY) - pY < scroll_sensitivity) + { + delY = scroll_amount; + } + + //process horizontal x scroll + if(pX - sX < scroll_sensitivity) + { + delX = -scroll_amount; + } + else + if((sX + wX) - pX < scroll_sensitivity) + { + delX = scroll_amount; + } + + return [delX, delY] + } + + //contructor + this.initialize(r, ip); +} + +//Description +//webkit_click class. manages click events for draggables + +var webkit_click = function(r, ip) +{ + this.initialize = function(root, instance_props) + { + var default_props = {onClick : webkit_tools.empty}; + + this.root = webkit_tools.$(root); + this.p = webkit_tools.extend(default_props, instance_props || {}); + this.bindEvents(); + } + + this.bindEvents = function() + { + var root = this.root; + + //bind events to local scope + this.ts = webkit_tools.bindAsEventListener(this.touchStart,this); + this.tm = webkit_tools.bindAsEventListener(this.touchMove,this); + this.te = webkit_tools.bindAsEventListener(this.touchEnd,this); + + //add Listeners + root.addEventListener("touchstart", this.ts, false); + root.addEventListener("touchmove", this.tm, false); + root.addEventListener("touchend", this.te, false); + + this.bound = true; + } + + this.touchStart = function() + { + this.moved = false; + if(this.bound == false) + { + this.root.addEventListener("touchmove", this.tm, false); + this.bound = true; + } + } + + this.touchMove = function() + { + this.moved = true; + this.root.removeEventListener("touchmove", this.tm); + this.bound = false; + } + + this.touchEnd = function() + {e.preventSwipe = true; + if(this.moved == false) + { + this.p.onClick(); + } + } + + this.setEvent = function(f) + { + if(typeof(f) == 'function') + { + this.p.onClick = f; + } + } + + this.unbind = function() + { + var root = this.root; + root.removeEventListener("touchstart", this.ts); + root.removeEventListener("touchmove", this.tm); + root.removeEventListener("touchend", this.te); + } + + //call constructor + this.initialize(r, ip); +} \ No newline at end of file diff --git a/pub/lib/head.load.min.js b/pub/lib/headjs/head.load.min.js similarity index 92% rename from pub/lib/head.load.min.js rename to pub/lib/headjs/head.load.min.js index 05e489381844ab02656ac16fb5d48398cf226217..e384332d8f3db84068b405fb2dde545b43e54e1a 100644 --- a/pub/lib/head.load.min.js +++ b/pub/lib/headjs/head.load.min.js @@ -1 +1,9 @@ -(function(e,t){"use strict";function y(e){if(e._done)return;e(),e._done=1}function b(e){var t=e.split("/"),n=t[t.length-1],r=n.indexOf("?");return r!=-1?n.substring(0,r):n}function w(e){var t;if(typeof e=="object")for(var n in e)e[n]&&(t={name:n,url:e[n]});else t={name:b(e),url:e};var r=l[t.name];return r&&r.url===t.url?r:(l[t.name]=t,t)}function E(e,t){if(!e)return;typeof e=="object"&&(e=[].slice.call(e));for(var n=0;n<e.length;n++)t.call(e,e[n],n)}function S(e){return Object.prototype.toString.call(e)=="[object Function]"}function x(e){e=e||l;var t;for(var n in e){if(e.hasOwnProperty(n)&&e[n].state!=g)return!1;t=!0}return t}function T(e){e.state=d,E(e.onpreload,function(e){e.call()})}function N(e,n){e.state===t&&(e.state=v,e.onpreload=[],k({src:e.url,type:"cache"},function(){T(e)}))}function C(e,t){if(e.state==g)return t&&t();if(e.state==m)return p.ready(e.name,t);if(e.state==v)return e.onpreload.push(function(){C(e,t)});e.state=m,k(e.url,function(){e.state=g,t&&t(),E(f[e.name],function(e){y(e)}),x()&&o&&E(f.ALL,function(e){y(e)})})}function k(e,t){var r=n.createElement("script");r.type="text/"+(e.type||"javascript"),r.src=e.src||e,r.async=!1,r.onreadystatechange=r.onload=function(){var e=r.readyState;!t.done&&(!e||/loaded|complete/.test(e))&&(t.done=!0,t())},(n.body||i).appendChild(r)}function L(){o||(o=!0,E(u,function(e){y(e)}))}var n=e.document,r=e.navigator,i=n.documentElement,s,o,u=[],a=[],f={},l={},c=n.createElement("script").async===!0||"MozAppearance"in n.documentElement.style||e.opera,h=e.head_conf&&e.head_conf.head||"head",p=e[h]=e[h]||function(){p.ready.apply(null,arguments)},d=1,v=2,m=3,g=4;c?p.js=function(){var e=arguments,t=e[e.length-1],n={};return S(t)||(t=null),E(e,function(r,i){r!=t&&(r=w(r),n[r.name]=r,C(r,t&&i==e.length-2?function(){x(n)&&y(t)}:null))}),p}:p.js=function(){var e=arguments,t=[].slice.call(e,1),n=t[0];return s?(n?(E(t,function(e){S(e)||N(w(e))}),C(w(e[0]),S(n)?n:function(){p.js.apply(null,t)})):C(w(e[0])),p):(a.push(function(){p.js.apply(null,e)}),p)},p.ready=function(e,t){if(e==n)return o?y(t):u.push(t),p;S(e)&&(t=e,e="ALL");if(typeof e!="string"||!S(t))return p;var r=l[e];if(r&&r.state==g||e=="ALL"&&x()&&o)return y(t),p;var i=f[e];return i?i.push(t):i=f[e]=[t],p},p.ready(n,function(){x()&&E(f.ALL,function(e){y(e)}),p.feature&&p.feature("domloaded",!0)});if(e.addEventListener)n.addEventListener("DOMContentLoaded",L,!1),e.addEventListener("load",L,!1);else if(e.attachEvent){n.attachEvent("onreadystatechange",function(){n.readyState==="complete"&&L()});var A=1;try{A=e.frameElement}catch(O){}!A&&i.doScroll&&function(){try{i.doScroll("left"),L()}catch(e){setTimeout(arguments.callee,1);return}}(),e.attachEvent("onload",L)}!n.readyState&&n.addEventListener&&(n.readyState="loading",n.addEventListener("DOMContentLoaded",handler=function(){n.removeEventListener("DOMContentLoaded",handler,!1),n.readyState="complete"},!1)),setTimeout(function(){s=!0,E(a,function(e){e()})},300)})(window); \ No newline at end of file +/*! + * HeadJS The only script in your <HEAD> + * Author Tero Piirainen (tipiirai) + * Maintainer Robert Hoffmann (itechnology) + * License MIT / http://bit.ly/mit-license + * + * http://headjs.com + */ +(function(e,t){"use strict";function y(e){if(e._done)return;e(),e._done=1}function b(e){var t=e.split("/"),n=t[t.length-1],r=n.indexOf("?");return r!=-1?n.substring(0,r):n}function w(e){var t;if(typeof e=="object")for(var n in e)e[n]&&(t={name:n,url:e[n]});else t={name:b(e),url:e};var r=l[t.name];return r&&r.url===t.url?r:(l[t.name]=t,t)}function E(e,t){if(!e)return;typeof e=="object"&&(e=[].slice.call(e));for(var n=0;n<e.length;n++)t.call(e,e[n],n)}function S(e){return Object.prototype.toString.call(e)=="[object Function]"}function x(e){e=e||l;var t;for(var n in e){if(e.hasOwnProperty(n)&&e[n].state!=g)return!1;t=!0}return t}function T(e){e.state=d,E(e.onpreload,function(e){e.call()})}function N(e,n){e.state===t&&(e.state=v,e.onpreload=[],k({src:e.url,type:"cache"},function(){T(e)}))}function C(e,t){if(e.state==g)return t&&t();if(e.state==m)return p.ready(e.name,t);if(e.state==v)return e.onpreload.push(function(){C(e,t)});e.state=m,k(e.url,function(){e.state=g,t&&t(),E(f[e.name],function(e){y(e)}),x()&&o&&E(f.ALL,function(e){y(e)})})}function k(e,t){var r=n.createElement("script");r.type="text/"+(e.type||"javascript"),r.src=e.src||e,r.async=!1,r.onreadystatechange=r.onload=function(){var e=r.readyState;!t.done&&(!e||/loaded|complete/.test(e))&&(t.done=!0,t())},(n.body||i).appendChild(r)}function L(){o||(o=!0,E(u,function(e){y(e)}))}var n=e.document,r=e.navigator,i=n.documentElement,s,o,u=[],a=[],f={},l={},c=n.createElement("script").async===!0||"MozAppearance"in n.documentElement.style||e.opera,h=e.head_conf&&e.head_conf.head||"head",p=e[h]=e[h]||function(){p.ready.apply(null,arguments)},d=1,v=2,m=3,g=4;c?p.js=function(){var e=arguments,t=e[e.length-1],n={};return S(t)||(t=null),E(e,function(r,i){r!=t&&(r=w(r),n[r.name]=r,C(r,t&&i==e.length-2?function(){x(n)&&y(t)}:null))}),p}:p.js=function(){var e=arguments,t=[].slice.call(e,1),n=t[0];return s?(n?(E(t,function(e){S(e)||N(w(e))}),C(w(e[0]),S(n)?n:function(){p.js.apply(null,t)})):C(w(e[0])),p):(a.push(function(){p.js.apply(null,e)}),p)},p.ready=function(e,t){if(e==n)return o?y(t):u.push(t),p;S(e)&&(t=e,e="ALL");if(typeof e!="string"||!S(t))return p;var r=l[e];if(r&&r.state==g||e=="ALL"&&x()&&o)return y(t),p;var i=f[e];return i?i.push(t):i=f[e]=[t],p},p.ready(n,function(){x()&&E(f.ALL,function(e){y(e)}),p.feature&&p.feature("domloaded",!0)});if(e.addEventListener)n.addEventListener("DOMContentLoaded",L,!1),e.addEventListener("load",L,!1);else if(e.attachEvent){n.attachEvent("onreadystatechange",function(){n.readyState==="complete"&&L()});var A=1;try{A=e.frameElement}catch(O){}!A&&i.doScroll&&function(){try{i.doScroll("left"),L()}catch(e){setTimeout(arguments.callee,1);return}}(),e.attachEvent("onload",L)}!n.readyState&&n.addEventListener&&(n.readyState="loading",n.addEventListener("DOMContentLoaded",handler=function(){n.removeEventListener("DOMContentLoaded",handler,!1),n.readyState="complete"},!1)),setTimeout(function(){s=!0,E(a,function(e){e()})},300)})(window); diff --git a/app/design/adminhtml/magento_backend/js/head.js b/pub/lib/headjs/head.min.js similarity index 93% rename from app/design/adminhtml/magento_backend/js/head.js rename to pub/lib/headjs/head.min.js index 67de77740949bcedf9cfcad1034ce8a90a2f5cd6..cb58a5cfb384faf5880c1f53ddb20b6fa37f6938 100644 --- a/app/design/adminhtml/magento_backend/js/head.js +++ b/pub/lib/headjs/head.min.js @@ -1,26 +1,11 @@ -/** - * Magento +/*! + * HeadJS The only script in your <HEAD> + * Author Tero Piirainen (tipiirai) + * Maintainer Robert Hoffmann (itechnology) + * License MIT / http://bit.ly/mit-license * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License (AFL 3.0) - * that is bundled with this package in the file LICENSE_AFL.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/afl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * http://headjs.com */ - (function (a, w) { function f(a) { p[p.length] = a diff --git a/app/design/adminhtml/magento_backend/js/jquery.details.js b/pub/lib/jquery/jquery.details.js similarity index 77% rename from app/design/adminhtml/magento_backend/js/jquery.details.js rename to pub/lib/jquery/jquery.details.js index 1e2ddd923b73a857b3cb3f32fa83951ec79fffdc..30ce703386614f6d1494317cf0a5b5a1bf283fcc 100644 --- a/app/design/adminhtml/magento_backend/js/jquery.details.js +++ b/pub/lib/jquery/jquery.details.js @@ -1,51 +1,4 @@ -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License (AFL 3.0) - * that is bundled with this package in the file LICENSE_AFL.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/afl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) - */ - /*! http://mths.be/details v0.0.6 by @mathias | includes http://mths.be/noselect v1.0.3 */ -Modernizr.addTest('details', function() { - var doc = document, - el = doc.createElement('details'), - fake, - root, - diff; - if (!('open' in el)) { // return early if possible; thanks @aFarkas! - return false; - } - root = doc.body || (function() { - var de = doc.documentElement; - fake = true; - return de.insertBefore(doc.createElement('body'), de.firstElementChild || de.firstChild); - }()); - el.innerHTML = '<summary>a</summary>b'; - el.style.display = 'block'; - root.appendChild(el); - diff = el.offsetHeight; - el.open = true; - diff = diff != el.offsetHeight; - root.removeChild(el); - fake && root.parentNode.removeChild(root); - return diff; -}); ;(function(document, $) { var proto = $.fn, details, @@ -167,4 +120,4 @@ Modernizr.addTest('details', function() { } -}(document, jQuery)); \ No newline at end of file +}(document, jQuery)); diff --git a/app/design/adminhtml/magento_backend/js/jquery.details.min.js b/pub/lib/jquery/jquery.details.min.js similarity index 67% rename from app/design/adminhtml/magento_backend/js/jquery.details.min.js rename to pub/lib/jquery/jquery.details.min.js index 2cb5037be2471aea12406ce00d119c4ea7bd840c..04317a021fbba47e8cdb0d0f555da84a50ac587e 100644 --- a/app/design/adminhtml/magento_backend/js/jquery.details.min.js +++ b/pub/lib/jquery/jquery.details.min.js @@ -1,25 +1,2 @@ -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License (AFL 3.0) - * that is bundled with this package in the file LICENSE_AFL.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/afl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) - */ - /*! http://mths.be/details v0.0.6 by @mathias | includes http://mths.be/noselect v1.0.3 */ -;(function(a,$){var e=$.fn,d,c=Object.prototype.toString.call(window.opera)=='[object Opera]',f=(function(k){var i=k.createElement('details'),h,g,j;if(!('open' in i)){return false}g=k.body||(function(){var l=k.documentElement;h=true;return l.insertBefore(k.createElement('body'),l.firstElementChild||l.firstChild)}());i.innerHTML='<summary>a</summary>b';i.style.display='block';g.appendChild(i);j=i.offsetHeight;i.open=true;j=j!=i.offsetHeight;g.removeChild(i);if(h){g.parentNode.removeChild(g)}return j}(a)),b=function(h,k,j,g){var i=typeof h.attr('open')=='string',l=i&&g||!i&&!g;if(l){h.removeClass('open').prop('open',false).triggerHandler('close.details');k.attr('aria-expanded',false);j.hide()}else{h.addClass('open').prop('open',true).triggerHandler('open.details');k.attr('aria-expanded',true);j.show()}};e.noSelect=function(){var g='none';return this.bind('selectstart dragstart mousedown',function(){return false}).css({MozUserSelect:g,msUserSelect:g,webkitUserSelect:g,userSelect:g})};if(f){d=e.details=function(){return this.each(function(){var h=$(this),g=$('summary',h).first();g.attr({role:'button','aria-expanded':h.prop('open')}).on('click',function(){var i=h.prop('open');g.attr('aria-expanded',!i);h.triggerHandler((i?'close':'open')+'.details')})})};d.support=f}else{d=e.details=function(){return this.each(function(){var g=$(this),i=$('summary',g).first(),h=g.children(':not(summary)'),j=g.contents(':not(summary)');if(!i.length){i=$('<summary>').text('Details').prependTo(g)}if(h.length!=j.length){j.filter(function(){return this.nodeType==3&&/[^ \t\n\f\r]/.test(this.data)}).wrap('<span>');h=g.children(':not(summary)')}b(g,i,h);i.attr('role','button').noSelect().prop('tabIndex',0).on('click',function(){i.focus();b(g,i,h,true)}).keyup(function(k){if(32==k.keyCode||(13==k.keyCode&&!c)){k.preventDefault();i.click()}})})};d.support=f}}(document,jQuery)); \ No newline at end of file +;(function(a,$){var e=$.fn,d,c=Object.prototype.toString.call(window.opera)=='[object Opera]',f=(function(k){var i=k.createElement('details'),h,g,j;if(!('open' in i)){return false}g=k.body||(function(){var l=k.documentElement;h=true;return l.insertBefore(k.createElement('body'),l.firstElementChild||l.firstChild)}());i.innerHTML='<summary>a</summary>b';i.style.display='block';g.appendChild(i);j=i.offsetHeight;i.open=true;j=j!=i.offsetHeight;g.removeChild(i);if(h){g.parentNode.removeChild(g)}return j}(a)),b=function(h,k,j,g){var i=typeof h.attr('open')=='string',l=i&&g||!i&&!g;if(l){h.removeClass('open').prop('open',false).triggerHandler('close.details');k.attr('aria-expanded',false);j.hide()}else{h.addClass('open').prop('open',true).triggerHandler('open.details');k.attr('aria-expanded',true);j.show()}};e.noSelect=function(){var g='none';return this.bind('selectstart dragstart mousedown',function(){return false}).css({MozUserSelect:g,msUserSelect:g,webkitUserSelect:g,userSelect:g})};if(f){d=e.details=function(){return this.each(function(){var h=$(this),g=$('summary',h).first();g.attr({role:'button','aria-expanded':h.prop('open')}).on('click',function(){var i=h.prop('open');g.attr('aria-expanded',!i);h.triggerHandler((i?'close':'open')+'.details')})})};d.support=f}else{d=e.details=function(){return this.each(function(){var g=$(this),i=$('summary',g).first(),h=g.children(':not(summary)'),j=g.contents(':not(summary)');if(!i.length){i=$('<summary>').text('Details').prependTo(g)}if(h.length!=j.length){j.filter(function(){return this.nodeType==3&&/[^ \t\n\f\r]/.test(this.data)}).wrap('<span>');h=g.children(':not(summary)')}b(g,i,h);i.attr('role','button').noSelect().prop('tabIndex',0).on('click',function(){i.focus();b(g,i,h,true)}).keyup(function(k){if(32==k.keyCode||(13==k.keyCode&&!c)){k.preventDefault();i.click()}})})};d.support=f}}(document,jQuery)); diff --git a/app/design/adminhtml/magento_backend/js/jquery.mousewheel.js b/pub/lib/jquery/jquery.mousewheel.js similarity index 72% rename from app/design/adminhtml/magento_backend/js/jquery.mousewheel.js rename to pub/lib/jquery/jquery.mousewheel.js index 5c3bfb61a70b16dee4c5ddfd96b5e880f8f10360..38b60951b201bedf3e1005ed49cbd1c0834d5815 100644 --- a/app/design/adminhtml/magento_backend/js/jquery.mousewheel.js +++ b/pub/lib/jquery/jquery.mousewheel.js @@ -1,26 +1,3 @@ -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License (AFL 3.0) - * that is bundled with this package in the file LICENSE_AFL.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/afl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) - */ - /*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net) * Licensed under the MIT License (LICENSE.txt). * diff --git a/pub/lib/lib/dropdown.js b/pub/lib/lib/dropdown.js deleted file mode 100644 index 13fff757a3f61ef961f4d14d50059c344a8bfc63..0000000000000000000000000000000000000000 --- a/pub/lib/lib/dropdown.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License (AFL 3.0) - * that is bundled with this package in the file LICENSE_AFL.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/afl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package js - * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) - */ -dropdown = function() { - var ele = document.getElementById("nav").getElementsByTagName("LI"); - for (var i=0; i<ele.length; i++) { - ele[i].onmouseover=function() { - this.className+=" over"; - } - ele[i].onmouseout=function() { - this.className=this.className.replace(new RegExp(" over\\b"), ""); - } - } -} -if (window.attachEvent) window.attachEvent("onload", dropdown); diff --git a/pub/lib/lib/flex.js b/pub/lib/mage/flex.js similarity index 100% rename from pub/lib/lib/flex.js rename to pub/lib/mage/flex.js diff --git a/app/design/frontend/magento_plushe/js/matchMedia.js b/pub/lib/matchMedia.js similarity index 81% rename from app/design/frontend/magento_plushe/js/matchMedia.js rename to pub/lib/matchMedia.js index 764dabd6c9a22ca6de2849180e9989498a2d413e..e91c2b97803c4387695437c00d81b82a821d0b4e 100644 --- a/app/design/frontend/magento_plushe/js/matchMedia.js +++ b/pub/lib/matchMedia.js @@ -1,25 +1,3 @@ -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License (AFL 3.0) - * that is bundled with this package in the file LICENSE_AFL.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/afl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) - */ /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */ window.matchMedia = window.matchMedia || (function( doc, undefined ) { diff --git a/pub/lib/modernizr/modernizr.2.0.6.js b/pub/lib/modernizr/modernizr.2.0.6.js new file mode 100644 index 0000000000000000000000000000000000000000..db230439e74ee5105a504c8b87c2d0bfd796b0be --- /dev/null +++ b/pub/lib/modernizr/modernizr.2.0.6.js @@ -0,0 +1,4 @@ +/* Modernizr 2.0.6 (Custom Build) | MIT & BSD + * Build: http://www.modernizr.com/download/#-csstransforms-csstransforms3d-cssclasses-prefixed-teststyles-testprop-testallprops-prefixes-domprefixes + */ +;window.Modernizr=function(a,b,c){function C(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1),d=(a+" "+o.join(c+" ")+c).split(" ");return B(d,b)}function B(a,b){for(var d in a)if(k[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function A(a,b){return!!~(""+a).indexOf(b)}function z(a,b){return typeof a===b}function y(a,b){return x(n.join(a+";")+(b||""))}function x(a){k.cssText=a}var d="2.0.6",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l,m=Object.prototype.toString,n=" -webkit- -moz- -o- -ms- -khtml- ".split(" "),o="Webkit Moz O ms Khtml".split(" "),p={},q={},r={},s=[],t=function(a,c,d,e){var f,h,j,k=b.createElement("div");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:i+(d+1),k.appendChild(j);f=["­","<style>",a,"</style>"].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},u,v={}.hasOwnProperty,w;!z(v,c)&&!z(v.call,c)?w=function(a,b){return v.call(a,b)}:w=function(a,b){return b in a&&z(a.constructor.prototype[b],c)};var D=function(a,c){var d=a.join(""),f=c.length;t(d,function(a,c){var d=b.styleSheets[b.styleSheets.length-1],g=d.cssRules&&d.cssRules[0]?d.cssRules[0].cssText:d.cssText||"",h=a.childNodes,i={};while(f--)i[h[f].id]=h[f];e.csstransforms3d=i.csstransforms3d.offsetLeft===9},f,c)}([,["@media (",n.join("transform-3d),("),i,")","{#csstransforms3d{left:9px;position:absolute}}"].join("")],[,"csstransforms3d"]);p.csstransforms=function(){return!!B(["transformProperty","WebkitTransform","MozTransform","OTransform","msTransform"])},p.csstransforms3d=function(){var a=!!B(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);a&&"webkitPerspective"in g.style&&(a=e.csstransforms3d);return a};for(var E in p)w(p,E)&&(u=E.toLowerCase(),e[u]=p[E](),s.push((e[u]?"":"no-")+u));x(""),j=l=null,e._version=d,e._prefixes=n,e._domPrefixes=o,e.testProp=function(a){return B([a])},e.testAllProps=C,e.testStyles=t,e.prefixed=function(a){return C(a,"pfx")},g.className=g.className.replace(/\bno-js\b/,"")+(f?" js "+s.join(" "):"");return e}(this,this.document); \ No newline at end of file diff --git a/pub/lib/modernizr/modernizr.details.js b/pub/lib/modernizr/modernizr.details.js new file mode 100644 index 0000000000000000000000000000000000000000..48f1c9cfe0b26de26cc947780c046ff319a37b6d --- /dev/null +++ b/pub/lib/modernizr/modernizr.details.js @@ -0,0 +1,25 @@ +// By @mathias, based on http://mths.be/axh +Modernizr.addTest('details', function() { + var doc = document, + el = doc.createElement('details'), + fake, + root, + diff; + if (!('open' in el)) { // return early if possible; thanks @aFarkas! + return false; + } + root = doc.body || (function() { + var de = doc.documentElement; + fake = true; + return de.insertBefore(doc.createElement('body'), de.firstElementChild || de.firstChild); + }()); + el.innerHTML = '<summary>a</summary>b'; + el.style.display = 'block'; + root.appendChild(el); + diff = el.offsetHeight; + el.open = true; + diff = diff != el.offsetHeight; + root.removeChild(el); + fake && root.parentNode.removeChild(root); + return diff; +}); diff --git a/pub/lib/lib/modernizr.js b/pub/lib/modernizr/modernizr.js similarity index 100% rename from pub/lib/lib/modernizr.js rename to pub/lib/modernizr/modernizr.js diff --git a/pub/lib/prototype/validation.js b/pub/lib/prototype/validation.js index 5ad144557f07ded184528d85af40bee502a86a8c..798194949ad5a55b62ba77435c130f755363792d 100644 --- a/pub/lib/prototype/validation.js +++ b/pub/lib/prototype/validation.js @@ -856,7 +856,7 @@ Validation.addAllThese([ $(prefix + '_cc_issue').advaiceContainer = $(prefix + '_start_month').advaiceContainer = $(prefix + '_start_year').advaiceContainer - = $(prefix + '_cc_type_ss_div').down('ul li.adv-container'); + = $(prefix + '_cc_type_ss_div').down('.adv-container'); var ccIssue = $(prefix + '_cc_issue').value; var ccSMonth = $(prefix + '_start_month').value; diff --git a/app/design/frontend/magento_plushe/js/selectivizr.js b/pub/lib/selectivizr.js similarity index 95% rename from app/design/frontend/magento_plushe/js/selectivizr.js rename to pub/lib/selectivizr.js index db735c5080d8c0f33ef3ae89c4fddde3720e6268..f7bd64295b5b82b889c3729adc3159437f46d19e 100644 --- a/app/design/frontend/magento_plushe/js/selectivizr.js +++ b/pub/lib/selectivizr.js @@ -1,25 +1,3 @@ -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License (AFL 3.0) - * that is bundled with this package in the file LICENSE_AFL.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/afl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) - */ /* selectivizr v1.0.2 - (c) Keith Clark, freely distributable under the terms of the MIT license. @@ -564,4 +542,4 @@ References: addEvent(win,"load", init); } }; -})(this); \ No newline at end of file +})(this);