diff --git a/.htaccess b/.htaccess index 01f8f8dd24df5bf518774b24c9843bdd0d61d73a..9f630df0ae681e1dea7bca6587f1d2e082e7a23c 100644 --- a/.htaccess +++ b/.htaccess @@ -65,13 +65,6 @@ SecFilterScanPOST Off </IfModule> -<IfModule mod_headers.c> -############################################ -## prevent clickjacking - - Header set X-Frame-Options SAMEORIGIN -</IfModule> - <IfModule mod_deflate.c> ############################################ @@ -187,4 +180,4 @@ ## If running in cluster environment, uncomment this ## http://developer.yahoo.com/performance/rules.html#etags - #FileETag none \ No newline at end of file + #FileETag none diff --git a/app/code/Magento/AdminNotification/Block/Window.php b/app/code/Magento/AdminNotification/Block/Window.php index e000fd732d0b3f8398c77da2a5f7d215c2900a4e..21db82ec373699bff183c8ee444503c3667c0100 100644 --- a/app/code/Magento/AdminNotification/Block/Window.php +++ b/app/code/Magento/AdminNotification/Block/Window.php @@ -76,7 +76,7 @@ class Window extends \Magento\Backend\Block\Template if ($this->canShow()) { $this->setHeaderText($this->escapeHtml(__('Incoming Message'))); $this->setCloseText($this->escapeHtml(__('close'))); - $this->setReadDetailsText($this->escapeHtml(__('Read details'))); + $this->setReadDetailsText($this->escapeHtml(__('Read Details'))); $this->setNoticeMessageText($this->escapeHtml($this->_getLatestItem()->getTitle())); $this->setNoticeMessageUrl($this->escapeUrl($this->_getLatestItem()->getUrl())); $this->setSeverityText('critical'); diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification.php index d1657ae076abb419e0b4f71f8c26ba27dc6a6be8..cd88e551ffec3d58a639c3859e9e146fea984026 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification.php @@ -14,26 +14,6 @@ class Notification extends \Magento\Backend\App\AbstractAction */ protected function _isAllowed() { - switch ($this->getRequest()->getActionName()) { - case 'markAsRead': - $acl = 'Magento_AdminNotification::mark_as_read'; - break; - - case 'massMarkAsRead': - $acl = 'Magento_AdminNotification::mark_as_read'; - break; - - case 'remove': - $acl = 'Magento_AdminNotification::adminnotification_remove'; - break; - - case 'massRemove': - $acl = 'Magento_AdminNotification::adminnotification_remove'; - break; - - default: - $acl = 'Magento_AdminNotification::show_list'; - } - return $this->_authorization->isAllowed($acl); + return $this->_authorization->isAllowed('Magento_AdminNotification::show_list'); } } diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsRead.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsRead.php index ee93d06fc8c629f9f47b6c90c9c1bfff68b9b5e8..bcf66825edf6bdc85f27680298c2129b2cb46d02 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsRead.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsRead.php @@ -36,4 +36,12 @@ class MarkAsRead extends \Magento\AdminNotification\Controller\Adminhtml\Notific } $this->_redirect('adminhtml/*/'); } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_AdminNotification::mark_as_read'); + } } diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsRead.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsRead.php index ac414106f9f893989c4ea870e68d32c486961704..78090163aa6a2a7f1a8637026c19aa70ffdc5b5b 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsRead.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsRead.php @@ -38,4 +38,12 @@ class MassMarkAsRead extends \Magento\AdminNotification\Controller\Adminhtml\Not } $this->_redirect('adminhtml/*/'); } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_AdminNotification::mark_as_read'); + } } diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemove.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemove.php index 41a27163baa5269e4accd0243fe08729b67331af..4b0068520ba3e0c4f69116dc9d04de411cc0783f 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemove.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemove.php @@ -33,4 +33,12 @@ class MassRemove extends \Magento\AdminNotification\Controller\Adminhtml\Notific } $this->getResponse()->setRedirect($this->_redirect->getRedirectUrl($this->getUrl('*'))); } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_AdminNotification::adminnotification_remove'); + } } diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Remove.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Remove.php index 53fc0bee4bfb89104418f3bf5b50365072dd0d72..b4fe7e0e29596d2bd81fae0ec3430e1a3f545e77 100644 --- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Remove.php +++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification/Remove.php @@ -35,4 +35,12 @@ class Remove extends \Magento\AdminNotification\Controller\Adminhtml\Notificatio } $this->_redirect('adminhtml/*/'); } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_AdminNotification::adminnotification_remove'); + } } diff --git a/app/code/Magento/AdminNotification/Model/System/Message/Baseurl.php b/app/code/Magento/AdminNotification/Model/System/Message/Baseurl.php index 8bed182bb26628f5529f18366adc1c2a62003a64..46eb6b5f887a7fefd2dd08342339a8a494ee1dfe 100644 --- a/app/code/Magento/AdminNotification/Model/System/Message/Baseurl.php +++ b/app/code/Magento/AdminNotification/Model/System/Message/Baseurl.php @@ -120,7 +120,7 @@ class Baseurl implements \Magento\Framework\Notification\MessageInterface { return __( '{{base_url}} is not recommended to use in a production environment to declare the Base Unsecure ' - . 'URL / Base Secure URL. It is highly recommended to change this value in your Magento ' + . 'URL / Base Secure URL. We highly recommend changing this value in your Magento ' . '<a href="%1">configuration</a>.', $this->_getConfigUrl() ); diff --git a/app/code/Magento/AdminNotification/Model/System/Message/Media/Synchronization/Error.php b/app/code/Magento/AdminNotification/Model/System/Message/Media/Synchronization/Error.php index 88e85643d784e118b0e75f28037aa0b2279c332f..e3cddcb68867557fb691ebbeba857903edfeb25a 100644 --- a/app/code/Magento/AdminNotification/Model/System/Message/Media/Synchronization/Error.php +++ b/app/code/Magento/AdminNotification/Model/System/Message/Media/Synchronization/Error.php @@ -34,8 +34,7 @@ class Error extends \Magento\AdminNotification\Model\System\Message\Media\Abstra public function getText() { return __( - 'One or more media files failed to be synchronized during the media storages synchronization process. ' - . 'Refer to the log file for details.' + 'We were unable to synchronize one or more media files. Please refer to the log file for details.' ); } } diff --git a/app/code/Magento/AdminNotification/Model/System/Message/Security.php b/app/code/Magento/AdminNotification/Model/System/Message/Security.php index 7462ab7c8370a941aaaaf528a5b55acec2a5a50c..2070466687ee8c03b58eb0f01692599f118e2368 100644 --- a/app/code/Magento/AdminNotification/Model/System/Message/Security.php +++ b/app/code/Magento/AdminNotification/Model/System/Message/Security.php @@ -135,8 +135,8 @@ class Security implements \Magento\Framework\Notification\MessageInterface public function getText() { return __( - 'Your web server is configured incorrectly. As a result, configuration files ' - . ' with sensitive information are accessible from the outside. Please contact your hosting provider.' + 'Your web server is set up incorrectly and allows unauthorized access to sensitive files. ' + . 'Please contact your hosting provider.' ); } diff --git a/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/Media/Synchronization/ErrorTest.php b/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/Media/Synchronization/ErrorTest.php index b51613857f2299ed0d09596f0381024d84c9efb9..f8db79f83d321a19bd80d4df14c0c4ac002d35e5 100644 --- a/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/Media/Synchronization/ErrorTest.php +++ b/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/Media/Synchronization/ErrorTest.php @@ -39,7 +39,7 @@ class ErrorTest extends \PHPUnit_Framework_TestCase public function testGetText() { - $messageText = 'One or more media files failed to be synchronized'; + $messageText = 'We were unable to synchronize one or more media files.'; $this->assertContains($messageText, (string)$this->_model->getText()); } diff --git a/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/SecurityTest.php b/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/SecurityTest.php index a6de88c77b5fdcdbfc718d3e2249024629f89201..9e1937dae500e264de99f2f150fe1400094a33d9 100644 --- a/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/SecurityTest.php +++ b/app/code/Magento/AdminNotification/Test/Unit/Model/System/Message/SecurityTest.php @@ -90,7 +90,7 @@ class SecurityTest extends \PHPUnit_Framework_TestCase public function testGetText() { - $messageStart = 'Your web server is configured incorrectly.'; + $messageStart = 'Your web server is set up incorrectly'; $this->assertStringStartsWith($messageStart, (string)$this->_messageModel->getText()); } diff --git a/app/code/Magento/Authorization/Model/Acl/AclRetriever.php b/app/code/Magento/Authorization/Model/Acl/AclRetriever.php index e31de3cde7727f6a6ed98b5795098c42d64a5ed3..b9ace2435556665553c45d6cadfe8c4b8c7afc6e 100644 --- a/app/code/Magento/Authorization/Model/Acl/AclRetriever.php +++ b/app/code/Magento/Authorization/Model/Acl/AclRetriever.php @@ -76,7 +76,7 @@ class AclRetriever $role = $this->_getUserRole($userType, $userId); if (!$role) { throw new AuthorizationException( - __('The role associated with the specified user cannot be found.') + __('We can\'t find the role for the user you wanted.') ); } $allowedResources = $this->getAllowedResourcesByRole($role->getId()); @@ -85,7 +85,10 @@ class AclRetriever } catch (\Exception $e) { $this->logger->critical($e); throw new LocalizedException( - __('Error happened while getting a list of allowed resources. Check exception log for details.') + __( + 'Something went wrong while compiling a list of allowed resources. ' + . 'You can find out more in the exceptions log.' + ) ); } return $allowedResources; diff --git a/app/code/Magento/Authorization/Test/Unit/Model/Acl/AclRetrieverTest.php b/app/code/Magento/Authorization/Test/Unit/Model/Acl/AclRetrieverTest.php index a5080fd657c5781cd2371fa740679e7109a0a995..620c3bbee68bc7bc17aaec6c9b063ac8b71be520 100644 --- a/app/code/Magento/Authorization/Test/Unit/Model/Acl/AclRetrieverTest.php +++ b/app/code/Magento/Authorization/Test/Unit/Model/Acl/AclRetrieverTest.php @@ -57,7 +57,7 @@ class AclRetrieverTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\AuthorizationException - * @expectedExceptionMessage The role associated with the specified user cannot be found. + * @expectedExceptionMessage We can't find the role for the user you wanted. */ public function testGetAllowedResourcesByUserRoleNotFound() { diff --git a/app/code/Magento/Backend/Block/Cache.php b/app/code/Magento/Backend/Block/Cache.php index a3d7113177a0d73bd74cf3799ebf4d41d780936d..bbd3fc60f4e0cd9b910e4716e2eb9701ad7698ba 100644 --- a/app/code/Magento/Backend/Block/Cache.php +++ b/app/code/Magento/Backend/Block/Cache.php @@ -27,7 +27,7 @@ class Cache extends \Magento\Backend\Block\Widget\Grid\Container ] ); - $message = __('Cache storage may contain additional data. Are you sure that you want flush it?'); + $message = __('The cache storage may contain additional data. Are you sure that you want to flush it?'); $this->buttonList->add( 'flush_system', [ diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php index 5014fd07b5319f4993da6c94bb7fc7ec8e7b3b9e..4607cd6127401989c6552d9318601d5b4a8d4089 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php @@ -57,7 +57,7 @@ class Save extends \Magento\Backend\Controller\Adminhtml\System\Account if ($password !== '') { $user->sendPasswordResetNotificationEmail(); } - $this->messageManager->addSuccess(__('The account has been saved.')); + $this->messageManager->addSuccess(__('You saved the account.')); } catch (ValidatorException $e) { $this->messageManager->addMessages($e->getMessages()); if ($e->getMessage()) { diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Delete.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Delete.php index 869f8af7923470767c96804afbd59e84266ffda8..cec54abf608784ceea036b2493ecfd3904d7917e 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Delete.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Design/Delete.php @@ -23,7 +23,7 @@ class Delete extends \Magento\Backend\Controller\Adminhtml\System\Design } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addException($e, __("Cannot delete the design change.")); + $this->messageManager->addException($e, __("You can't delete the design change.")); } } /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store.php index a6efb535ec2658ac32c0ef66f1a3472bcdeb322a..caeb74e7c9ec7176b04d4c40ac2c49eac4666a1e 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store.php @@ -113,7 +113,7 @@ class Store extends Action } catch (\Exception $e) { $this->messageManager->addException( $e, - __('We couldn\'t create a backup right now. Please try again later.') + __('We can\'t create a backup right now. Please try again later.') ); return false; } diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroup.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroup.php index 31ef91803bb1af6611af6b1724bb372445d1c003..3604948ee6bf0a021904e6a346adbb8c0b35c37e 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroup.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroup.php @@ -15,7 +15,7 @@ class DeleteGroup extends \Magento\Backend\Controller\Adminhtml\System\Store { $itemId = $this->getRequest()->getParam('item_id', null); if (!($model = $this->_objectManager->create('Magento\Store\Model\Group')->load($itemId))) { - $this->messageManager->addError(__('Unable to proceed. Please, try again.')); + $this->messageManager->addError(__('Something went wrong. Please try again.')); /** @var \Magento\Backend\Model\View\Result\Redirect $redirectResult */ $redirectResult = $this->resultRedirectFactory->create(); return $redirectResult->setPath('adminhtml/*/'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroupPost.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroupPost.php index 2ccdc47b5bdb862cd055755467c440ce32c0ea6f..fe67adeca9055e33ad77871332ffeea20b6f37aa 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroupPost.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroupPost.php @@ -21,7 +21,7 @@ class DeleteGroupPost extends \Magento\Backend\Controller\Adminhtml\System\Store $redirectResult = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); if (!($model = $this->_objectManager->create('Magento\Store\Model\Group')->load($itemId))) { - $this->messageManager->addError(__('Unable to proceed. Please, try again.')); + $this->messageManager->addError(__('Something went wrong. Please try again.')); return $redirectResult->setPath('adminhtml/*/'); } if (!$model->isCanDelete()) { @@ -35,7 +35,7 @@ class DeleteGroupPost extends \Magento\Backend\Controller\Adminhtml\System\Store try { $model->delete(); - $this->messageManager->addSuccess(__('The store has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the store.')); return $redirectResult->setPath('adminhtml/*/'); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStore.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStore.php index 65b4ec34cccfb53bf414537223c2db1c16d88424..826f8493fa0723926b8e3a81275275ac138f6a32 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStore.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStore.php @@ -15,7 +15,7 @@ class DeleteStore extends \Magento\Backend\Controller\Adminhtml\System\Store { $itemId = $this->getRequest()->getParam('item_id', null); if (!($model = $this->_objectManager->create('Magento\Store\Model\Store')->load($itemId))) { - $this->messageManager->addError(__('Unable to proceed. Please, try again.')); + $this->messageManager->addError(__('Something went wrong. Please try again.')); /** @var \Magento\Backend\Model\View\Result\Redirect $redirectResult */ $redirectResult = $this->resultRedirectFactory->create(); return $redirectResult->setPath('adminhtml/*/'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php index a5162314f5874c3e4c301fb76bd027aa9cac1ae1..c7764a1b20489c19f8689809ebf5808ce004986f 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php @@ -22,7 +22,7 @@ class DeleteStorePost extends \Magento\Backend\Controller\Adminhtml\System\Store /** @var \Magento\Backend\Model\View\Result\Redirect $redirectResult */ $redirectResult = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); if (!($model = $this->_objectManager->create('Magento\Store\Model\Store')->load($itemId))) { - $this->messageManager->addError(__('Unable to proceed. Please, try again')); + $this->messageManager->addError(__('Something went wrong. Please try again.')); return $redirectResult->setPath('adminhtml/*/'); } if (!$model->isCanDelete()) { @@ -39,7 +39,7 @@ class DeleteStorePost extends \Magento\Backend\Controller\Adminhtml\System\Store $this->_eventManager->dispatch('store_delete', ['store' => $model]); - $this->messageManager->addSuccess(__('The store view has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the store view.')); return $redirectResult->setPath('adminhtml/*/'); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsite.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsite.php index 684b10c8c2365254482154daafc3cf1dedf241fb..ea67a101763020bf9ba931b68f3e14fc2446eb73 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsite.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsite.php @@ -15,7 +15,7 @@ class DeleteWebsite extends \Magento\Backend\Controller\Adminhtml\System\Store { $itemId = $this->getRequest()->getParam('item_id', null); if (!($model = $this->_objectManager->create('Magento\Store\Model\Website')->load($itemId))) { - $this->messageManager->addError(__('Unable to proceed. Please, try again.')); + $this->messageManager->addError(__('Something went wrong. Please try again.')); /** @var \Magento\Backend\Model\View\Result\Redirect $redirectResult */ $redirectResult = $this->resultRedirectFactory->create(); return $redirectResult->setPath('adminhtml/*/'); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsitePost.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsitePost.php index ca6541bd357bf9eb5562a079e5fe32db05341570..6951bc3b3a9af1eef09520b35d79a33bc74ea719 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsitePost.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsitePost.php @@ -23,7 +23,7 @@ class DeleteWebsitePost extends \Magento\Backend\Controller\Adminhtml\System\Sto $redirectResult = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); if (!$model) { - $this->messageManager->addError(__('Unable to proceed. Please, try again')); + $this->messageManager->addError(__('Something went wrong. Please try again.')); return $redirectResult->setPath('adminhtml/*/'); } if (!$model->isCanDelete()) { @@ -37,7 +37,7 @@ class DeleteWebsitePost extends \Magento\Backend\Controller\Adminhtml\System\Sto try { $model->delete(); - $this->messageManager->addSuccess(__('The website has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the website.')); return $redirectResult->setPath('adminhtml/*/'); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditStore.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditStore.php index 23a5e5c0fd95b5ed5376ca5fa20774846f5a44e7..f6521a418f4bd2559e21b0f968ac30c604997a4d 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditStore.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/EditStore.php @@ -31,7 +31,7 @@ class EditStore extends \Magento\Backend\Controller\Adminhtml\System\Store $model = $this->_objectManager->create('Magento\Store\Model\Website'); $title = __("Web Site"); $notExists = __("The website does not exist."); - $codeBase = __('Before modifying the website code please make sure that it is not used in index.php.'); + $codeBase = __('Before modifying the website code please make sure it is not used in index.php.'); break; case 'group': $itemId = $this->getRequest()->getParam('group_id', null); @@ -45,9 +45,7 @@ class EditStore extends \Magento\Backend\Controller\Adminhtml\System\Store $model = $this->_objectManager->create('Magento\Store\Model\Store'); $title = __("Store View"); $notExists = __("Store view doesn't exist"); - $codeBase = __( - 'Before modifying the store view code please make sure that it is not used in index.php.' - ); + $codeBase = __('Before modifying the store view code please make sure it is not used in index.php.'); break; default: break; diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php index a1bcca38c9c39f8608b28dcf216290e3b84532e8..7f2152e1e89c81c5789c93f01886753537e9f127 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/Save.php @@ -37,7 +37,7 @@ class Save extends \Magento\Backend\Controller\Adminhtml\System\Store } $websiteModel->save(); - $this->messageManager->addSuccess(__('The website has been saved.')); + $this->messageManager->addSuccess(__('You saved the website.')); break; case 'group': @@ -55,7 +55,7 @@ class Save extends \Magento\Backend\Controller\Adminhtml\System\Store $this->_eventManager->dispatch('store_group_save', ['group' => $groupModel]); - $this->messageManager->addSuccess(__('The store has been saved.')); + $this->messageManager->addSuccess(__('You saved the store.')); break; case 'store': @@ -82,7 +82,7 @@ class Save extends \Magento\Backend\Controller\Adminhtml\System\Store $this->_eventManager->dispatch($eventName, ['store' => $storeModel]); - $this->messageManager->addSuccess(__('The store view has been saved')); + $this->messageManager->addSuccess(__('You saved the store view.')); break; default: $redirectResult->setPath('adminhtml/*/'); @@ -96,7 +96,7 @@ class Save extends \Magento\Backend\Controller\Adminhtml\System\Store } catch (\Exception $e) { $this->messageManager->addException( $e, - __('An error occurred while saving. Please review the error log.') + __('Something went wrong while saving. Please review the error log.') ); $this->_getSession()->setPostData($postData); } diff --git a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/System/Account/SaveTest.php b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/System/Account/SaveTest.php index 97300a8bf58b3cd3b12a6abad43945beb75de53c..b63c4f1e1a5ad33a38144569dba89dcda1892fa7 100644 --- a/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/System/Account/SaveTest.php +++ b/app/code/Magento/Backend/Test/Unit/Controller/Adminhtml/System/Account/SaveTest.php @@ -136,7 +136,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase \Magento\Backend\Block\System\Account\Edit\Form::IDENTITY_VERIFICATION_PASSWORD_FIELD => 'current_password', ]; - $testedMessage = 'The account has been saved.'; + $testedMessage = 'You saved the account.'; $this->_authSessionMock->expects($this->any())->method('getUser')->will($this->returnValue($this->_userMock)); diff --git a/app/code/Magento/Backend/etc/adminhtml/di.xml b/app/code/Magento/Backend/etc/adminhtml/di.xml index 553d30e85541f36dbd0a50834d1d146d99b84d5d..cccd487a9f5662ca3ee4ec187ecb4a4942ce8f9e 100644 --- a/app/code/Magento/Backend/etc/adminhtml/di.xml +++ b/app/code/Magento/Backend/etc/adminhtml/di.xml @@ -122,4 +122,9 @@ </argument> </arguments> </type> + <type name="Magento\Framework\App\Response\XFrameOptPlugin"> + <arguments> + <argument name="xFrameOpt" xsi:type="const">Magento\Framework\App\Response\XFrameOptPlugin::BACKEND_X_FRAME_OPT</argument> + </arguments> + </type> </config> diff --git a/app/code/Magento/Backend/etc/adminhtml/system.xml b/app/code/Magento/Backend/etc/adminhtml/system.xml index 614c5a507892140d30e0e691d5270bd09052d6f3..858101e90267aa01b8fc0f75d82447955297ef10 100644 --- a/app/code/Magento/Backend/etc/adminhtml/system.xml +++ b/app/code/Magento/Backend/etc/adminhtml/system.xml @@ -180,7 +180,7 @@ <group id="translate_inline" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Translate Inline</label> <field id="active" translate="label" type="select" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1"> - <label>Enabled for Frontend</label> + <label>Enabled for Storefront</label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> <backend_model>Magento\Config\Model\Config\Backend\Translate</backend_model> </field> @@ -188,7 +188,7 @@ <label>Enabled for Admin</label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> <backend_model>Magento\Config\Model\Config\Backend\Translate</backend_model> - <comment>Translate, blocks and other output caches should be disabled for both frontend and admin inline translations.</comment> + <comment>Translate, blocks and other output caches should be disabled for both Storefront and Admin inline translations.</comment> </field> </group> <group id="js" translate="label" type="text" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="1"> @@ -253,6 +253,10 @@ <label>European Union Countries</label> <source_model>Magento\Directory\Model\Config\Source\Country</source_model> </field> + <field id="destinations" translate="label" type="multiselect" sortOrder="40" showInDefault="1" showInWebsite="0" showInStore="0"> + <label>Top destinations</label> + <source_model>Magento\Directory\Model\Config\Source\Country</source_model> + </field> </group> <group id="locale" translate="label" type="text" sortOrder="8" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Locale Options</label> @@ -406,7 +410,7 @@ <depends> <field id="use_custom_path">1</field> </depends> - <comment>You will have to log in after you save your custom admin path.</comment> + <comment>You will have to sign in after you save your custom admin path.</comment> </field> </group> <group id="security" translate="label" type="text" sortOrder="35" showInDefault="1" showInWebsite="0" showInStore="0"> @@ -509,10 +513,10 @@ <comment>May be empty or start with {{secure_base_url}}, or {{unsecure_base_url}} placeholder.</comment> </field> <field id="use_in_frontend" translate="label" type="select" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="1"> - <label>Use Secure URLs in Frontend</label> + <label>Use Secure URLs on Storefront</label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> <backend_model>Magento\Config\Model\Config\Backend\Secure</backend_model> - <comment>Enter https protocol to use Secure URLs in Frontend.</comment> + <comment>Enter https protocol to use Secure URLs on Storefront.</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> @@ -552,7 +556,7 @@ <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> </field> <field id="use_frontend_sid" translate="label comment" type="select" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="0"> - <label>Use SID on Frontend</label> + <label>Use SID on Storefront</label> <comment>Allows customers to stay logged in when switching between different stores.</comment> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> </field> diff --git a/app/code/Magento/Backend/view/adminhtml/templates/widget/grid/extended.phtml b/app/code/Magento/Backend/view/adminhtml/templates/widget/grid/extended.phtml index c9ca42066628c32e5246453f02b9a1ff57137ce6..a094fbf83e81dea3ea2b74c600c258e2bfabcab2 100644 --- a/app/code/Magento/Backend/view/adminhtml/templates/widget/grid/extended.phtml +++ b/app/code/Magento/Backend/view/adminhtml/templates/widget/grid/extended.phtml @@ -116,7 +116,7 @@ $numColumns = sizeof($block->getColumns()); <?php echo __('of %1', '<span>' . $block->getCollection()->getLastPageNumber() . '</span>') ?> </label> <?php if ($_curPage < $_lastPage): ?> - <button href="#" + <button type="button" title="<?php echo __('Next page') ?>" class="action-next" onclick="<?php echo $block->getJsObjectName() ?>.setPage('<?php echo($_curPage + 1) ?>');return false;"> diff --git a/app/code/Magento/Backend/view/adminhtml/templates/widget/tabs.phtml b/app/code/Magento/Backend/view/adminhtml/templates/widget/tabs.phtml index 2b5d4b4b35892e66d774ebee5ba58ee99f54ad30..89f5dc34a428b5a121600c4074d3e42f848a4117 100644 --- a/app/code/Magento/Backend/view/adminhtml/templates/widget/tabs.phtml +++ b/app/code/Magento/Backend/view/adminhtml/templates/widget/tabs.phtml @@ -43,7 +43,7 @@ <span class="admin__page-nav-item-message _error"> <span class="admin__page-nav-item-message-icon"></span> <span class="admin__page-nav-item-message-tooltip"> - <?php echo __('This tab contains invalid data. Please solve the problem before saving.'); ?> + <?php echo __('This tab contains invalid data. Please resolve this before saving.'); ?> </span> </span> <span class="admin__page-nav-item-message-loader"> diff --git a/app/code/Magento/Backend/view/adminhtml/templates/widget/tabshoriz.phtml b/app/code/Magento/Backend/view/adminhtml/templates/widget/tabshoriz.phtml index 1c9a6437041b4cc505d0725751bf588a3e825365..45e939d58d561869f4eb5956727553fc4bc1ace8 100644 --- a/app/code/Magento/Backend/view/adminhtml/templates/widget/tabshoriz.phtml +++ b/app/code/Magento/Backend/view/adminhtml/templates/widget/tabshoriz.phtml @@ -21,7 +21,7 @@ <a href="<?php echo $_tabHref?>" id="<?php echo $block->getTabId($_tab) ?>" title="<?php echo $block->getTabTitle($_tab) ?>" class="<?php $_tabClass ?>" data-tab-type="<?php $_tabType ?>"> <span> <span class="changed" title="<?php echo __('The information in this tab has been changed.') ?>"></span> - <span class="error" title="<?php echo __('This tab contains invalid data. Please solve the problem before saving.') ?>"></span> + <span class="error" title="<?php echo __('This tab contains invalid data. Please resolve this before saving.') ?>"></span> <span class="loader" title="<?php echo __('Loading...') ?>"></span> <?php echo $block->getTabLabel($_tab) ?> </span> diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php index 3597571146444fc2d43d330908913623dcbb1500..abe181923cab8c0324fd809f4cafb84961c3a990 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php @@ -60,12 +60,12 @@ class Create extends \Magento\Backup\Controller\Adminhtml\Index __( 'You need more permissions to activate maintenance mode right now.' ) . ' ' . __( - 'To continue with the backup, you need to either deselect ' . - '"Put store on the maintenance mode" or update your permissions.' + 'To create the backup, please deselect ' + . '"Put store into maintenance mode" or update your permissions.' ) ); $backupManager->setErrorMessage( - __("Something went wrong putting your store into maintenance mode.") + __("Something went wrong while putting your store into maintenance mode.") ); return $this->getResponse()->representJson($response->toJson()); } @@ -92,7 +92,7 @@ class Create extends \Magento\Backup\Controller\Adminhtml\Index $errorMessage = __('You need more permissions to create a backup.'); } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->info($e->getMessage()); - $errorMessage = __('Something went wrong creating the backup.'); + $errorMessage = __('We can\'t create the backup right now.'); } if (!empty($errorMessage)) { diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php index cfef7d14a15a18282cc5744579994e30dc7a7406..9980008a84c36cf330f134b95735a3ca088a5e92 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php @@ -26,7 +26,7 @@ class MassDelete extends \Magento\Backup\Controller\Adminhtml\Index $resultData->setDeleteResult([]); $this->_coreRegistry->register('backup_manager', $resultData); - $deleteFailMessage = __('We couldn\'t delete one or more backups.'); + $deleteFailMessage = __('We can\'t delete one or more backups.'); try { $allBackupsDeleted = true; @@ -49,7 +49,7 @@ class MassDelete extends \Magento\Backup\Controller\Adminhtml\Index $resultData->setIsSuccess(true); if ($allBackupsDeleted) { - $this->messageManager->addSuccess(__('The selected backup(s) has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the selected backup(s).')); } else { throw new \Exception($deleteFailMessage); } diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php index d797caeebfb4d9ca9f2f93a1a1cf93d22b79798c..ccc74f6d9ef5a959a47b6da89c2afad72cfbf394 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php @@ -84,12 +84,12 @@ class Rollback extends \Magento\Backup\Controller\Adminhtml\Index __( 'You need more permissions to activate maintenance mode right now.' ) . ' ' . __( - 'To continue with the rollback, you need to either deselect ' . - '"Put store on the maintenance mode" or update your permissions.' + 'To complete the rollback, please deselect ' + . '"Put store into maintenance mode" or update your permissions.' ) ); $backupManager->setErrorMessage( - __('Something went wrong putting your store into maintenance mode.') + __('Something went wrong while putting your store into maintenance mode.') ); return $this->getResponse()->representJson($response->toJson()); } @@ -120,17 +120,17 @@ class Rollback extends \Magento\Backup\Controller\Adminhtml\Index $response->setRedirectUrl($this->getUrl('*')); } catch (\Magento\Framework\Backup\Exception\CantLoadSnapshot $e) { - $errorMsg = __('The backup file was not found.'); + $errorMsg = __('We can\'t find the backup file.'); } catch (\Magento\Framework\Backup\Exception\FtpConnectionFailed $e) { - $errorMsg = __('We couldn\'t connect to the FTP.'); + $errorMsg = __('We can\'t connect to the FTP right now.'); } catch (\Magento\Framework\Backup\Exception\FtpValidationFailed $e) { - $errorMsg = __('Failed to validate FTP'); + $errorMsg = __('Failed to validate FTP.'); } catch (\Magento\Framework\Backup\Exception\NotEnoughPermissions $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->info($e->getMessage()); - $errorMsg = __('Not enough permissions to perform rollback.'); + $errorMsg = __('You need more permissions to perform a rollback.'); } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->info($e->getMessage()); - $errorMsg = __('Failed to rollback'); + $errorMsg = __('Failed to rollback.'); } if (!empty($errorMsg)) { diff --git a/app/code/Magento/Backup/Helper/Data.php b/app/code/Magento/Backup/Helper/Data.php index 5d00bd24aa7ecaecd9846214c06a3950147582c6..cc70c3eb28b73188c285a004cec235b287ffe6a2 100644 --- a/app/code/Magento/Backup/Helper/Data.php +++ b/app/code/Magento/Backup/Helper/Data.php @@ -208,12 +208,12 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper public function getCreateSuccessMessageByType($type) { $messagesMap = [ - \Magento\Framework\Backup\Factory::TYPE_SYSTEM_SNAPSHOT => __('The system backup has been created.'), + \Magento\Framework\Backup\Factory::TYPE_SYSTEM_SNAPSHOT => __('You created the system backup.'), \Magento\Framework\Backup\Factory::TYPE_SNAPSHOT_WITHOUT_MEDIA => __( - 'The system backup (excluding media) has been created.' + 'You created the system backup (excluding media).' ), - \Magento\Framework\Backup\Factory::TYPE_MEDIA => __('The database and media backup has been created.'), - \Magento\Framework\Backup\Factory::TYPE_DB => __('The database backup has been created.'), + \Magento\Framework\Backup\Factory::TYPE_MEDIA => __('You created the database and media backup.'), + \Magento\Framework\Backup\Factory::TYPE_DB => __('You created the database backup.'), ]; if (!isset($messagesMap[$type])) { diff --git a/app/code/Magento/Backup/Model/Backup.php b/app/code/Magento/Backup/Model/Backup.php index a19cf7091903b12ebf12db04d5919bbf84d4f8dc..0994b903703191635276286ca1ceeea78166bd33 100755 --- a/app/code/Magento/Backup/Model/Backup.php +++ b/app/code/Magento/Backup/Model/Backup.php @@ -357,7 +357,7 @@ class Backup extends \Magento\Framework\Object implements \Magento\Framework\Bac $this->_getStream()->write($string); } catch (\Magento\Framework\Exception\FileSystemException $e) { throw new \Magento\Framework\Exception\InputException( - __('Something went wrong writing to the backup file "%1".', $this->getFileName()) + __('Something went wrong while writing to the backup file "%1".', $this->getFileName()) ); } diff --git a/app/code/Magento/Backup/view/adminhtml/templates/backup/dialogs.phtml b/app/code/Magento/Backup/view/adminhtml/templates/backup/dialogs.phtml index ef121271e5ccda5a1c83ac7ba7f1ffb790878a2b..5401dcbca9d03101f0834b918e4158f4e82c14ce 100644 --- a/app/code/Magento/Backup/view/adminhtml/templates/backup/dialogs.phtml +++ b/app/code/Magento/Backup/view/adminhtml/templates/backup/dialogs.phtml @@ -17,8 +17,8 @@ <div class="popup-content"> <div class="messages"> <div class="message message-warning"> - <p><?php echo __('Any data created since the backup was made will be lost including admin users, customers and orders.')?></p> - <p><?php echo __('Are you sure you want to proceed?')?></p> + <p><?php echo __('You will lose any data created since the backup was made, including admin users, customers and orders.')?></p> + <p><?php echo __('Are you sure you want to continue?')?></p> </div> </div> @@ -40,7 +40,7 @@ <div class="popup-content"> <div class="messages"> <div class="message message-warning"> - <?php echo __("It will take time to create a backup. ")?><?php echo __('Please wait until the action ends.')?><br> + <?php echo __("It will take time to create a backup. ")?><?php echo __('Please wait while we create your backup.')?><br> <?php echo __('Are you sure you want to continue?')?> </div> </div> @@ -115,7 +115,7 @@ <div class="message message-warning"> <?php echo __('Please enter the password to confirm rollback.')?><br> <?php echo __('This action cannot be undone.')?> - <p><?php echo __('Are you sure you want to proceed?')?></p> + <p><?php echo __('Are you sure you want to continue?')?></p> </div> </div> <form action="" method="post" id="rollback-form" class="form-inline"> 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 6c7dfa4a80d1e2ba9643ef78b4e365fb2f7d42ae..eab043bd0044b9f9b06d4e91446c9339fba2cb09 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 @@ -118,7 +118,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended if ($this->getFirstShow()) { $collection->addIdFilter('-1'); - $this->setEmptyText(__('Please enter search conditions to view products.')); + $this->setEmptyText(__('What are you looking for?')); } $this->setCollection($collection); diff --git a/app/code/Magento/Bundle/Block/Checkout/Cart/Item/Renderer.php b/app/code/Magento/Bundle/Block/Checkout/Cart/Item/Renderer.php index 9139bd45b3e11295f712093142bdacd27981d89f..5a23f62b959ef87ff65698c3011e2e1d7840344e 100644 --- a/app/code/Magento/Bundle/Block/Checkout/Cart/Item/Renderer.php +++ b/app/code/Magento/Bundle/Block/Checkout/Cart/Item/Renderer.php @@ -30,8 +30,8 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer * @param \Magento\Framework\Url\Helper\Data $urlHelper * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param PriceCurrencyInterface $priceCurrency - * @param Configuration $bundleProductConfiguration * @param \Magento\Framework\Module\Manager $moduleManager + * @param Configuration $bundleProductConfiguration * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ diff --git a/app/code/Magento/Bundle/Model/Product/Type.php b/app/code/Magento/Bundle/Model/Product/Type.php index f183de707ca487db858664414f7d8b43a221fc86..78a4dd754c66d8dd761c9483db3af16caad6fbeb 100644 --- a/app/code/Magento/Bundle/Model/Product/Type.php +++ b/app/code/Magento/Bundle/Model/Product/Type.php @@ -1319,7 +1319,7 @@ class Type extends \Magento\Catalog\Model\Product\Type\AbstractType if (!isset($_result[0])) { throw new \Magento\Framework\Exception\LocalizedException( - __('We can\'t add this item to your cart right now.') + __('We can\'t add this item to your shopping cart right now.') ); } } diff --git a/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php b/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php index e4a7ceb99903b0987bbd38eebc3464895efe4d25..f216ecfc5b4e9f749eeac10696bcf202b83a6db6 100644 --- a/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php +++ b/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php @@ -20,7 +20,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { @@ -54,10 +54,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getBundlePriceTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_bundle_idx'); - } - return $this->getTable('catalog_product_index_price_bundle_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_bundle'); } /** @@ -67,10 +64,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getBundleSelectionTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_bundle_sel_idx'); - } - return $this->getTable('catalog_product_index_price_bundle_sel_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_bundle_sel'); } /** @@ -80,10 +74,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getBundleOptionTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_bundle_opt_idx'); - } - return $this->getTable('catalog_product_index_price_bundle_opt_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_bundle_opt'); } /** diff --git a/app/code/Magento/Bundle/Test/Unit/Model/Product/TypeTest.php b/app/code/Magento/Bundle/Test/Unit/Model/Product/TypeTest.php index 64b4c6789f3cd54959a16be74fac68263b8ff396..9fe5ccb2daeffcb0a22b4541e47c2608741c302d 100644 --- a/app/code/Magento/Bundle/Test/Unit/Model/Product/TypeTest.php +++ b/app/code/Magento/Bundle/Test/Unit/Model/Product/TypeTest.php @@ -695,7 +695,7 @@ class TypeTest extends \PHPUnit_Framework_TestCase ->willReturn(3.14); $result = $this->model->prepareForCartAdvanced($buyRequest, $product); - $this->assertEquals('We can\'t add this item to your cart right now.', $result); + $this->assertEquals('We can\'t add this item to your shopping cart right now.', $result); } /** diff --git a/app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/radio.phtml b/app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/radio.phtml index aa91cf9e455abb8c14170b661eb7af6c5d6d20cb..be5e42dbdbeb6f18656831461836e361dd191357 100644 --- a/app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/radio.phtml +++ b/app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/radio.phtml @@ -60,7 +60,7 @@ <?php endif; ?> <div class="field admin__field qty"> <label class="label admin__field-label" - for="bundle-option-<?php echo $_option->getId() ?>-qty-input"><span><?php echo __('Qty:') ?></span></label> + for="bundle-option-<?php echo $_option->getId() ?>-qty-input"><span><?php echo __('Quantity:') ?></span></label> <div class="control admin__field-control"><input <?php if (!$_canChangeQty) echo ' disabled="disabled"' ?> id="bundle-option-<?php echo $_option->getId() ?>-qty-input" class="input-text admin__control-text qty<?php if (!$_canChangeQty) echo ' qty-disabled' ?>" diff --git a/app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/select.phtml b/app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/select.phtml index 9605342dff7b4f9cbb51999cac317656b3b1e5c3..23ccd1f7084850cf549a3242f0a1efb63342778d 100644 --- a/app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/select.phtml +++ b/app/code/Magento/Bundle/view/adminhtml/templates/product/composite/fieldset/options/type/select.phtml @@ -40,7 +40,7 @@ <div class="nested"> <div class="field admin__field qty"> <label class="label admin__field-label" - for="bundle-option-<?php echo $_option->getId() ?>-qty-input"><span><?php echo __('Qty:') ?></span></label> + for="bundle-option-<?php echo $_option->getId() ?>-qty-input"><span><?php echo __('Quantity:') ?></span></label> <div class="control admin__field-control"> <input <?php if (!$_canChangeQty) echo ' disabled="disabled"' ?> id="bundle-option-<?php echo $_option->getId() ?>-qty-input" diff --git a/app/code/Magento/Bundle/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Bundle/view/frontend/layout/checkout_cart_item_renderers.xml index 9c84f6735136c63ec0d0d78449e0d52295e3a014..94ceb9f5440cc6de01d0a7a13863b41d8b753f71 100644 --- a/app/code/Magento/Bundle/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/Bundle/view/frontend/layout/checkout_cart_item_renderers.xml @@ -8,7 +8,12 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\Bundle\Block\Checkout\Cart\Item\Renderer" as="bundle" template="Magento_Checkout::cart/item/default.phtml"/> + <block class="Magento\Bundle\Block\Checkout\Cart\Item\Renderer" as="bundle" template="Magento_Checkout::cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.bundle.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.bundle.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.bundle.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/Bundle/view/frontend/templates/catalog/product/view/type/bundle/option/radio.phtml b/app/code/Magento/Bundle/view/frontend/templates/catalog/product/view/type/bundle/option/radio.phtml index f630eae06bb319a057cc215fe15a4600785e88f2..5dc71ec3aaa92af894f6c6350976f62b1eec7ca8 100644 --- a/app/code/Magento/Bundle/view/frontend/templates/catalog/product/view/type/bundle/option/radio.phtml +++ b/app/code/Magento/Bundle/view/frontend/templates/catalog/product/view/type/bundle/option/radio.phtml @@ -59,7 +59,7 @@ <?php endif; ?> <div class="field qty qty-holder"> <label class="label" for="bundle-option-<?php echo $_option->getId() ?>-qty-input"> - <span><?php echo __('Qty') ?></span> + <span><?php echo __('Quantity') ?></span> </label> <div class="control"> <input <?php if (!$_canChangeQty) echo ' disabled="disabled"' ?> diff --git a/app/code/Magento/Bundle/view/frontend/templates/catalog/product/view/type/bundle/option/select.phtml b/app/code/Magento/Bundle/view/frontend/templates/catalog/product/view/type/bundle/option/select.phtml index 4edb1eb2f86666389b65c2a64981c20f01ca21a4..b2737e90aa10f7334a06f00662a6692cb00993be 100644 --- a/app/code/Magento/Bundle/view/frontend/templates/catalog/product/view/type/bundle/option/select.phtml +++ b/app/code/Magento/Bundle/view/frontend/templates/catalog/product/view/type/bundle/option/select.phtml @@ -42,7 +42,7 @@ <div class="nested"> <div class="field qty qty-holder"> <label class="label" for="bundle-option-<?php echo $_option->getId() ?>-qty-input"> - <span><?php echo __('Qty') ?></span> + <span><?php echo __('Quantity') ?></span> </label> <div class="control"> <input <?php if (!$_canChangeQty) echo ' disabled="disabled"' ?> diff --git a/app/code/Magento/Bundle/view/frontend/templates/sales/order/creditmemo/items/renderer.phtml b/app/code/Magento/Bundle/view/frontend/templates/sales/order/creditmemo/items/renderer.phtml index 3d908583e199610eb48aad5ce83126bf957a9ca8..85ab2f080cc6086aded54f77dfc5caca314fbd4f 100644 --- a/app/code/Magento/Bundle/view/frontend/templates/sales/order/creditmemo/items/renderer.phtml +++ b/app/code/Magento/Bundle/view/frontend/templates/sales/order/creditmemo/items/renderer.phtml @@ -50,7 +50,7 @@ <?php endif; ?> </td> - <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Qty')); ?>"> + <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Quantity')); ?>"> <?php if ($block->canShowPriceInfo($_item)): ?> <?php echo $_item->getQty()*1 ?> <?php else: ?> diff --git a/app/code/Magento/Bundle/view/frontend/templates/sales/order/items/renderer.phtml b/app/code/Magento/Bundle/view/frontend/templates/sales/order/items/renderer.phtml index c50b8cfdac980447385bf4367eb3dfddbf07c789..e3061c2df35d6c62073742eec40c11c4a44ac5ee 100644 --- a/app/code/Magento/Bundle/view/frontend/templates/sales/order/items/renderer.phtml +++ b/app/code/Magento/Bundle/view/frontend/templates/sales/order/items/renderer.phtml @@ -48,7 +48,7 @@ <?php endif; ?> </td> - <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Qty')); ?>"> + <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Quantity')); ?>"> <?php if ( ($_item->getParentItem() && $block->isChildCalculated()) || (!$_item->getParentItem() && !$block->isChildCalculated()) || ($_item->getQtyShipped() > 0 && $_item->getParentItem() && $block->isShipmentSeparately())):?> diff --git a/app/code/Magento/Captcha/etc/adminhtml/system.xml b/app/code/Magento/Captcha/etc/adminhtml/system.xml index 08d4a06aa6bbfab496f82388855381bcf1bc69f3..d1777164dc91644cc64ae91c4e06f1017ac9c92d 100644 --- a/app/code/Magento/Captcha/etc/adminhtml/system.xml +++ b/app/code/Magento/Captcha/etc/adminhtml/system.xml @@ -82,7 +82,7 @@ <group id="captcha" translate="label" type="text" sortOrder="110" showInDefault="1" showInWebsite="1" showInStore="0"> <label>CAPTCHA</label> <field id="enable" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="0"> - <label>Enable CAPTCHA on Frontend</label> + <label>Enable CAPTCHA on Storefront</label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> </field> <field id="font" translate="label" type="select" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="0"> diff --git a/app/code/Magento/Captcha/etc/config.xml b/app/code/Magento/Captcha/etc/config.xml index 8c91d2c706f152873ceedd4c1da7ec8de75531d6..acb9a76cdbfcdd35a11efa0ed0e6e42a2c402305 100644 --- a/app/code/Magento/Captcha/etc/config.xml +++ b/app/code/Magento/Captcha/etc/config.xml @@ -77,7 +77,7 @@ <label>Forgot password</label> </user_forgotpassword> <guest_checkout> - <label>Checkout as Guest</label> + <label>Check Out as Guest</label> </guest_checkout> <register_during_checkout> <label>Register during Checkout</label> diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit.php index 29f7d7227a290bac1a230be877481c0d9f3d4094..96d204f7400e01651de1a2b2e75af3cec9c569a4 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit.php @@ -54,9 +54,9 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container $this->addButton( 'save_in_new_set', [ - 'label' => __('Save in New Attribute Set'), + 'label' => __('Save in New Product Template'), 'class' => 'save', - 'onclick' => 'saveAttributeInNewSet(\'' . __('Enter Name for New Attribute Set') . '\')' + 'onclick' => 'saveAttributeInNewSet(\'' . __('Enter Name for New Product Template') . '\')' ], 100 ); diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Front.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Front.php index c974a84d624dd149239a3526b00d914df343b4de..77aa77bdae4738cde63faa607ff5efb5192016a4 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Front.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Front.php @@ -72,7 +72,7 @@ class Front extends Generic $fieldset = $form->addFieldset( 'front_fieldset', - ['legend' => __('Frontend Properties'), 'collapsable' => $this->getRequest()->has('popup')] + ['legend' => __('Storefront Properties'), 'collapsable' => $this->getRequest()->has('popup')] ); $fieldset->addField( @@ -102,8 +102,8 @@ class Front extends Generic 'select', [ 'name' => 'is_comparable', - 'label' => __('Comparable on Frontend'), - 'title' => __('Comparable on Frontend'), + 'label' => __('Comparable on Storefront'), + 'title' => __('Comparable on Storefront'), 'values' => $yesnoSource, ] ); @@ -137,8 +137,8 @@ class Front extends Generic 'select', [ 'name' => 'is_html_allowed_on_front', - 'label' => __('Allow HTML Tags on Frontend'), - 'title' => __('Allow HTML Tags on Frontend'), + 'label' => __('Allow HTML Tags on Storefront'), + 'title' => __('Allow HTML Tags on Storefront'), 'values' => $yesnoSource, ] ); @@ -151,8 +151,8 @@ class Front extends Generic 'select', [ 'name' => 'is_visible_on_front', - 'label' => __('Visible on Catalog Pages on Frontend'), - 'title' => __('Visible on Catalog Pages on Frontend'), + 'label' => __('Visible on Catalog Pages on Storefront'), + 'title' => __('Visible on Catalog Pages on Storefront'), 'values' => $yesnoSource ] ); diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tabs.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tabs.php index 52ba2586a6fa8f23e48ac41cabf47f22895b7e50..45a95f5f01019da85727b4252f3f91dc0baa9508 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tabs.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tabs.php @@ -49,8 +49,8 @@ class Tabs extends \Magento\Backend\Block\Widget\Tabs $this->addTab( 'front', [ - 'label' => __('Frontend Properties'), - 'title' => __('Frontend Properties'), + 'label' => __('Storefront Properties'), + 'title' => __('Storefront Properties'), 'content' => $this->getChildHtml('front') ] ); diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php index 7f97d5935030e885de468a3b01698129c32ab737..437fd4fc2b1365905649cc58425a546213d61bdc 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php @@ -126,11 +126,11 @@ class Main extends \Magento\Backend\Block\Template 'delete_button', 'Magento\Backend\Block\Widget\Button', [ - 'label' => __('Delete Attribute Set'), + 'label' => __('Delete'), 'onclick' => 'deleteConfirm(\'' . $this->escapeJsQuote( __( - 'You are about to delete all products in this set. ' . - 'Are you sure you want to delete this attribute set?' + 'You are about to delete all products in this product template. ' + . 'Are you sure you want to do that?' ) ) . '\', \'' . $this->getUrl( 'catalog/*/delete', @@ -145,7 +145,7 @@ class Main extends \Magento\Backend\Block\Template 'save_button', 'Magento\Backend\Block\Widget\Button', [ - 'label' => __('Save Attribute Set'), + 'label' => __('Save'), 'onclick' => 'editSet.save();', 'class' => 'save primary save-attribute-set' ] @@ -187,7 +187,7 @@ class Main extends \Magento\Backend\Block\Template */ protected function _getHeader() { - return __("Edit Attribute Set '%1'", $this->_getAttributeSet()->getAttributeSetName()); + return __("Edit Product Template '%1'", $this->_getAttributeSet()->getAttributeSetName()); } /** diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Add.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Add.php index 41b5a6dbdd89072cf220c590c4fa2b72723cf526..42434c7094c6464bc98657e856416e5109e80a36 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Add.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Toolbar/Add.php @@ -30,7 +30,7 @@ class Add extends \Magento\Backend\Block\Template 'save_button', 'Magento\Backend\Block\Widget\Button', [ - 'label' => __('Save Attribute Set'), + 'label' => __('Save'), 'class' => 'save primary save-attribute-set', 'data_attribute' => [ 'mage-init' => ['button' => ['event' => 'save', 'target' => '#set-prop-form']], @@ -57,7 +57,7 @@ class Add extends \Magento\Backend\Block\Template */ protected function _getHeader() { - return __('Add New Attribute Set'); + return __('Add New Product Template'); } /** diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php index 9f6229afbb32bee847f6fdcc591e92ee16174375..a932a9901c8440a193381a3e9ca9673448cfccdb 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php @@ -249,7 +249,7 @@ class Crosssell extends Extended $this->addColumn( 'set_name', [ - 'header' => __('Attribute Set'), + 'header' => __('Product Template'), 'index' => 'attribute_set_id', 'type' => 'options', 'options' => $sets, diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php index 685aa481fe9fa9c335987aae68ce1f7f0bb3056f..69bed2f49c601ab39e0a636c7470cf1f26028ab4 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php @@ -243,7 +243,7 @@ class Related extends Extended $this->addColumn( 'set_name', [ - 'header' => __('Attribute Set'), + 'header' => __('Product Template'), 'index' => 'attribute_set_id', 'type' => 'options', 'options' => $sets, diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php index ca442c0b98b3e9fe3f9dbaf56a3e0bd2c76e2471..89153f5996f74011669420249f8e9fe531406b44 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php @@ -239,7 +239,7 @@ class Upsell extends \Magento\Backend\Block\Widget\Grid\Extended $this->addColumn( 'set_name', [ - 'header' => __('Attribute Set'), + 'header' => __('Product Template'), 'index' => 'attribute_set_id', 'type' => 'options', 'options' => $sets, diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php index f053cfff68c30a45b9b39f8b3da88d0c29e4159c..b393a3632ea60620ae7d22a434f91b59657cbc50 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php @@ -262,7 +262,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended $this->addColumn( 'set_name', [ - 'header' => __('Attribute Set'), + 'header' => __('Product Template'), 'index' => 'attribute_set_id', 'type' => 'options', 'options' => $sets, @@ -396,7 +396,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended $this->getMassactionBlock()->addItem( 'status', [ - 'label' => __('Change status'), + 'label' => __('Change Status'), 'url' => $this->getUrl('catalog/*/massStatus', ['_current' => true]), 'additional' => [ 'visibility' => [ diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/BaseImage.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/BaseImage.php index e38a5d08f8915b29c03e0c3a72671669495a7d24..77351e6fa35a7ed952659bc999263ffa24ffaf66 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/BaseImage.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/BaseImage.php @@ -84,7 +84,7 @@ class BaseImage extends \Magento\Framework\Data\Form\Element\AbstractElement $htmlId = $this->_escaper->escapeHtml($this->getHtmlId()); $uploadUrl = $this->_escaper->escapeHtml($this->_getUploadUrl()); $spacerImage = $this->_assetRepo->getUrl('images/spacer.gif'); - $imagePlaceholderText = __('Click here or drag and drop to add images'); + $imagePlaceholderText = __('Click here or drag and drop to add images.'); $deleteImageText = __('Delete image'); $makeBaseText = __('Make Base'); $hiddenText = __('Hidden'); diff --git a/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php b/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php index 7da80121645d24a199e980a2df32a05aa918145c..cedd7b1f845981a902617fc90a8a4896bf5642c0 100644 --- a/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php +++ b/app/code/Magento/Catalog/Block/Product/View/Options/Type/Select.php @@ -46,7 +46,7 @@ class Select extends \Magento\Catalog\Block\Product\View\Options\AbstractOptions if ($_option->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_DROP_DOWN) { $select->setName('options[' . $_option->getid() . ']')->addOption('', __('-- Please Select --')); } else { - $select->setName('options[' . $_option->getid() . ']'); + $select->setName('options[' . $_option->getid() . '][]'); $select->setClass('multiselect admin__control-multiselect' . $require . ' product-custom-option'); } foreach ($_option->getValues() as $_value) { diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php index 20d4ad019d500f4e501aa006ee1cd39bc6705b12..310c50fb9321943aa48704b953f2ab9d7a00f2a9 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php @@ -162,7 +162,9 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Category $category->unsetData('use_post_data_config'); if (isset($data['general']['entity_id'])) { - throw new \Magento\Framework\Exception\LocalizedException(__('Unable to save the category')); + throw new \Magento\Framework\Exception\LocalizedException( + __('Something went wrong while saving the category.') + ); } $category->save(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Delete.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Delete.php index 3fbda63630e30573e0c3e38dde53d8cf3b1d0a01..9df8254d5e69b458c50ba6b74bf762335b1b8f8e 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Delete.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Delete.php @@ -21,13 +21,13 @@ class Delete extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute // entity type check $model->load($id); if ($model->getEntityTypeId() != $this->_entityTypeId) { - $this->messageManager->addError(__('This attribute cannot be deleted.')); + $this->messageManager->addError(__('We can\'t delete the attribute.')); return $resultRedirect->setPath('catalog/*/'); } try { $model->delete(); - $this->messageManager->addSuccess(__('The product attribute has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the product attribute.')); return $resultRedirect->setPath('catalog/*/'); } catch (\Exception $e) { $this->messageManager->addError($e->getMessage()); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php index 4faadeba7d39f5b3e5c5d5899ad8142f221d5681..66ad7b8f3d1dc0647fbd9ab209272726f84d6a5c 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php @@ -106,13 +106,13 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute ->setName($name) ->getAttributeSet(); } catch (AlreadyExistsException $alreadyExists) { - $this->messageManager->addError(__('Attribute Set with name \'%1\' already exists.', $name)); + $this->messageManager->addError(__('An attribute set named \'%1\' already exists.', $name)); $this->messageManager->setAttributeData($data); return $resultRedirect->setPath('catalog/*/edit', ['_current' => true]); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addException($e, __('Something went wrong saving the attribute.')); + $this->messageManager->addException($e, __('Something went wrong while saving the attribute.')); } } @@ -160,7 +160,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute } // entity type check if ($model->getEntityTypeId() != $this->_entityTypeId) { - $this->messageManager->addError(__('You can\'t update your attribute.')); + $this->messageManager->addError(__('We can\'t update the attribute.')); $this->_session->setAttributeData($data); return $resultRedirect->setPath('catalog/*/'); } diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Validate.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Validate.php index 4f564351eae2418de9a738ebb50d28348a7c5d96..f4db052d14aadbaac619f7599fd9d4b36feb1229 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Validate.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Validate.php @@ -65,7 +65,7 @@ class Validate extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute $response->setAttributes(['attribute_code' => __('An attribute with this code already exists.')]); } else { $response->setAttributes( - ['attribute_label' => __('Attribute with the same code (%1) already exists.', $attributeCode)] + ['attribute_label' => __('An attribute with the same code (%1) already exists.', $attributeCode)] ); } $response->setError(true); @@ -77,7 +77,7 @@ class Validate extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute $attributeSet->setEntityTypeId($this->_entityTypeId)->load($setName, 'attribute_set_name'); if ($attributeSet->getId()) { $setName = $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($setName); - $this->messageManager->addError(__('Attribute Set with name \'%1\' already exists.', $setName)); + $this->messageManager->addError(__('An attribute set named \'%1\' already exists.', $setName)); $layout = $this->layoutFactory->create(); $layout->initMessages(); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Delete.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Delete.php index 9585bce699f5faa9b579089f3fbbd8313344b346..9849dc6884732048424f4b95adc8782eca6954c9 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Delete.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Delete.php @@ -36,7 +36,7 @@ class Delete extends \Magento\Catalog\Controller\Adminhtml\Product\Set $resultRedirect = $this->resultRedirectFactory->create(); try { $this->attributeSetRepository->deleteById($setId); - $this->messageManager->addSuccess(__('The attribute set has been removed.')); + $this->messageManager->addSuccess(__('The product template has been removed.')); $resultRedirect->setPath('catalog/*/'); } catch (\Exception $e) { $this->messageManager->addError(__('We can\'t delete this set right now.')); diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Index.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Index.php index 32c753df84a0688d5d14a943b15866b847fa791d..7b9edb21c7e2f8951643e51963411f2252b655a9 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Index.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Index.php @@ -39,7 +39,7 @@ class Index extends \Magento\Catalog\Controller\Adminhtml\Product\Set $resultPage->setActiveMenu('Magento_Catalog::catalog_attributes_sets'); $resultPage->getConfig()->getTitle()->prepend(__('Product Templates')); $resultPage->addBreadcrumb(__('Catalog'), __('Catalog')); - $resultPage->addBreadcrumb(__('Manage Attribute Sets'), __('Manage Attribute Sets')); + $resultPage->addBreadcrumb(__('Manage Product Templates'), __('Product Templates')); return $resultPage; } } diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Save.php index 09e77fbdec769cacb87a69678ed41a40eeda0a5a..5870190db02b73a9bbae7b804d0ad1e75b8acfe5 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Set/Save.php @@ -82,7 +82,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Set } if (!$model->getId()) { throw new \Magento\Framework\Exception\LocalizedException( - __('This attribute set no longer exists.') + __('This product template no longer exists.') ); } $data = $this->_objectManager->get('Magento\Framework\Json\Helper\Data') @@ -100,12 +100,12 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Set $model->initFromSkeleton($this->getRequest()->getParam('skeleton_set')); } $model->save(); - $this->messageManager->addSuccess(__('You saved the attribute set.')); + $this->messageManager->addSuccess(__('You saved the product template.')); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); $hasError = true; } catch (\Exception $e) { - $this->messageManager->addException($e, __('An error occurred while saving the attribute set.')); + $this->messageManager->addException($e, __('Something went wrong while saving the product template.')); $hasError = true; } diff --git a/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php b/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php index 116c3ffca78dcad3ba422acfb9d722f70d761d5c..fa11d3ec996a89f9a0585ad8703453209d75604b 100644 --- a/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php +++ b/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php @@ -202,7 +202,7 @@ class Indexer extends \Magento\Framework\App\Helper\AbstractHelper 'unsigned' => true, 'nullable' => false, 'default' => '0', - 'comment' => 'Attribute Set Id', + 'comment' => 'Product Template ID', ]; $columns['type_id'] = [ 'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, diff --git a/app/code/Magento/Catalog/Model/Category.php b/app/code/Magento/Catalog/Model/Category.php index 0446ef7afab343c262898bd694513a31347b5dd8..46ea5db35f47a7f7e9ffeb5aeb24ead33259a2a7 100644 --- a/app/code/Magento/Catalog/Model/Category.php +++ b/app/code/Magento/Catalog/Model/Category.php @@ -374,8 +374,7 @@ class Category extends \Magento\Catalog\Model\AbstractModel implements } catch (NoSuchEntityException $e) { throw new \Magento\Framework\Exception\LocalizedException( __( - 'Sorry, but we can\'t move the category because we can\'t find the new parent category you' - . ' selected.' + 'Sorry, but we can\'t find the new parent category you selected.' ), $e ); @@ -383,13 +382,12 @@ class Category extends \Magento\Catalog\Model\AbstractModel implements if (!$this->getId()) { throw new \Magento\Framework\Exception\LocalizedException( - __('Sorry, but we can\'t move the category because we can\'t find the new category you selected.') + __('Sorry, but we can\'t find the new category you selected.') ); } elseif ($parent->getId() == $this->getId()) { throw new \Magento\Framework\Exception\LocalizedException( __( - 'We can\'t perform this category move operation because the parent category matches the child' - . 'category.' + 'We can\'t move the category because the parent category name matches the child category name.' ) ); } diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Eav/Action/Row.php b/app/code/Magento/Catalog/Model/Indexer/Product/Eav/Action/Row.php index cd367f0682f6e3b8f5ce09e95fd17b9b434e133d..e87369b13af49d2e376a0fd59b0946b7de9d945b 100755 --- a/app/code/Magento/Catalog/Model/Indexer/Product/Eav/Action/Row.php +++ b/app/code/Magento/Catalog/Model/Indexer/Product/Eav/Action/Row.php @@ -21,7 +21,9 @@ class Row extends \Magento\Catalog\Model\Indexer\Product\Eav\AbstractAction public function execute($id = null) { if (!isset($id) || empty($id)) { - throw new \Magento\Framework\Exception\InputException(__('Could not rebuild index for undefined product')); + throw new \Magento\Framework\Exception\InputException( + __('We can\'t rebuild the index for an undefined product.') + ); } try { $this->reindex($id); diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php index 1a23f1e351915cfec86e5b1f0f865dd577fb0da4..6ff6896e16694f8c2d3939e99a55ed2f1022a5d8 100644 --- a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php +++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php @@ -66,7 +66,7 @@ class Row extends \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction { if (!isset($id) || empty($id)) { throw new \Magento\Framework\Exception\LocalizedException( - __('Could not rebuild index for undefined product') + __('We can\'t rebuild the index for an undefined product.') ); } $ids = [$id]; diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Price/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Product/Price/AbstractAction.php index 6e43b0666791cf26a65df23d3dbd6809bbc48b2f..c6da03c6a48ee2dd466f15ffe71f3e1d9a33c7b6 100755 --- a/app/code/Magento/Catalog/Model/Indexer/Product/Price/AbstractAction.php +++ b/app/code/Magento/Catalog/Model/Indexer/Product/Price/AbstractAction.php @@ -15,16 +15,9 @@ abstract class AbstractAction /** * Default Product Type Price indexer resource model * - * @var string + * @var \Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice */ - protected $_defaultPriceIndexer; - - /** - * Resource instance - * - * @var \Magento\Framework\App\Resource - */ - protected $_resource; + protected $_defaultIndexerResource; /** * @var \Magento\Framework\DB\Adapter\AdapterInterface @@ -78,14 +71,6 @@ abstract class AbstractAction protected $_indexers; /** - * Flag that defines if need to use "_idx" index table suffix instead of "_tmp" - * - * @var bool - */ - protected $_useIdxTable = false; - - /** - * @param \Magento\Framework\App\Resource $resource * @param \Magento\Framework\App\Config\ScopeConfigInterface $config * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Directory\Model\CurrencyFactory $currencyFactory @@ -93,10 +78,9 @@ abstract class AbstractAction * @param \Magento\Framework\Stdlib\DateTime $dateTime * @param \Magento\Catalog\Model\Product\Type $catalogProductType * @param \Magento\Catalog\Model\Resource\Product\Indexer\Price\Factory $indexerPriceFactory - * @param string $defaultPriceIndexer + * @param \Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice $defaultIndexerResource */ public function __construct( - \Magento\Framework\App\Resource $resource, \Magento\Framework\App\Config\ScopeConfigInterface $config, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Directory\Model\CurrencyFactory $currencyFactory, @@ -104,9 +88,8 @@ abstract class AbstractAction \Magento\Framework\Stdlib\DateTime $dateTime, \Magento\Catalog\Model\Product\Type $catalogProductType, \Magento\Catalog\Model\Resource\Product\Indexer\Price\Factory $indexerPriceFactory, - $defaultPriceIndexer + \Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice $defaultIndexerResource ) { - $this->_resource = $resource; $this->_config = $config; $this->_storeManager = $storeManager; $this->_currencyFactory = $currencyFactory; @@ -114,20 +97,8 @@ abstract class AbstractAction $this->_dateTime = $dateTime; $this->_catalogProductType = $catalogProductType; $this->_indexerPriceFactory = $indexerPriceFactory; - $this->_defaultPriceIndexer = $defaultPriceIndexer; - } - - /** - * Retrieve connection instance - * - * @return bool|\Magento\Framework\DB\Adapter\AdapterInterface - */ - protected function _getConnection() - { - if (null === $this->_connection) { - $this->_connection = $this->_resource->getConnection('write'); - } - return $this->_connection; + $this->_defaultIndexerResource = $defaultIndexerResource; + $this->_connection = $this->_defaultIndexerResource->getWriteConnection(); } /** @@ -147,11 +118,11 @@ abstract class AbstractAction protected function _syncData(array $processIds = []) { // delete invalid rows - $select = $this->_getConnection()->select()->from( - ['index_price' => $this->_getTable('catalog_product_index_price')], + $select = $this->_connection->select()->from( + ['index_price' => $this->_defaultIndexerResource->getTable('catalog_product_index_price')], null )->joinLeft( - ['ip_tmp' => $this->_getIdxTable()], + ['ip_tmp' => $this->_defaultIndexerResource->getIdxTable()], 'index_price.entity_id = ip_tmp.entity_id AND index_price.website_id = ip_tmp.website_id', [] )->where( @@ -161,23 +132,15 @@ abstract class AbstractAction $select->where('index_price.entity_id IN(?)', $processIds); } $sql = $select->deleteFromSelect('index_price'); - $this->_getConnection()->query($sql); + $this->_connection->query($sql); - $this->_insertFromTable($this->_getIdxTable(), $this->_getTable('catalog_product_index_price')); + $this->_insertFromTable( + $this->_defaultIndexerResource->getIdxTable(), + $this->_defaultIndexerResource->getTable('catalog_product_index_price') + ); return $this; } - /** - * Returns table name for given entity - * - * @param string $entityName - * @return string - */ - protected function _getTable($entityName) - { - return $this->_resource->getTableName($entityName); - } - /** * Prepare website current dates table * @@ -185,14 +148,13 @@ abstract class AbstractAction */ protected function _prepareWebsiteDateTable() { - $write = $this->_getConnection(); $baseCurrency = $this->_config->getValue(\Magento\Directory\Model\Currency::XML_PATH_CURRENCY_BASE); - $select = $write->select()->from( - ['cw' => $this->_getTable('store_website')], + $select = $this->_connection->select()->from( + ['cw' => $this->_defaultIndexerResource->getTable('store_website')], ['website_id'] )->join( - ['csg' => $this->_getTable('store_group')], + ['csg' => $this->_defaultIndexerResource->getTable('store_group')], 'cw.default_group_id = csg.group_id', ['store_id' => 'default_store_id'] )->where( @@ -200,7 +162,7 @@ abstract class AbstractAction ); $data = []; - foreach ($write->fetchAll($select) as $item) { + foreach ($this->_connection->fetchAll($select) as $item) { /** @var $website \Magento\Store\Model\Website */ $website = $this->_storeManager->getWebsite($item['website_id']); @@ -229,10 +191,12 @@ abstract class AbstractAction } } - $table = $this->_getTable('catalog_product_index_website'); + $table = $this->_defaultIndexerResource->getTable('catalog_product_index_website'); $this->_emptyTable($table); if ($data) { - $write->insertMultiple($table, $data); + foreach ($data as $row) { + $this->_connection->insertOnDuplicate($table, $row, array_keys($row)); + } } return $this; @@ -246,24 +210,27 @@ abstract class AbstractAction */ protected function _prepareTierPriceIndex($entityIds = null) { - $write = $this->_getConnection(); - $table = $this->_getTable('catalog_product_index_tier_price'); + $table = $this->_defaultIndexerResource->getTable('catalog_product_index_tier_price'); $this->_emptyTable($table); - $websiteExpression = $write->getCheckSql('tp.website_id = 0', 'ROUND(tp.value * cwd.rate, 4)', 'tp.value'); - $select = $write->select()->from( - ['tp' => $this->_getTable(['catalog_product_entity', 'tier_price'])], + $websiteExpression = $this->_connection->getCheckSql( + 'tp.website_id = 0', + 'ROUND(tp.value * cwd.rate, 4)', + 'tp.value' + ); + $select = $this->_connection->select()->from( + ['tp' => $this->_defaultIndexerResource->getTable(['catalog_product_entity', 'tier_price'])], ['entity_id'] )->join( - ['cg' => $this->_getTable('customer_group')], + ['cg' => $this->_defaultIndexerResource->getTable('customer_group')], 'tp.all_groups = 1 OR (tp.all_groups = 0 AND tp.customer_group_id = cg.customer_group_id)', ['customer_group_id'] )->join( - ['cw' => $this->_getTable('store_website')], + ['cw' => $this->_defaultIndexerResource->getTable('store_website')], 'tp.website_id = 0 OR tp.website_id = cw.website_id', ['website_id'] )->join( - ['cwd' => $this->_getTable('catalog_product_index_website')], + ['cwd' => $this->_defaultIndexerResource->getTable('catalog_product_index_website')], 'cw.website_id = cwd.website_id', [] )->where( @@ -279,7 +246,7 @@ abstract class AbstractAction } $query = $select->insertFromSelect($table); - $write->query($query); + $this->_connection->query($query); return $this; } @@ -292,24 +259,27 @@ abstract class AbstractAction */ protected function _prepareGroupPriceIndex($entityIds = null) { - $write = $this->_getConnection(); - $table = $this->_getTable('catalog_product_index_group_price'); + $table = $this->_defaultIndexerResource->getTable('catalog_product_index_group_price'); $this->_emptyTable($table); - $websiteExpression = $write->getCheckSql('gp.website_id = 0', 'ROUND(gp.value * cwd.rate, 4)', 'gp.value'); - $select = $write->select()->from( - ['gp' => $this->_getTable(['catalog_product_entity', 'group_price'])], + $websiteExpression = $this->_connection->getCheckSql( + 'gp.website_id = 0', + 'ROUND(gp.value * cwd.rate, 4)', + 'gp.value' + ); + $select = $this->_connection->select()->from( + ['gp' => $this->_defaultIndexerResource->getTable(['catalog_product_entity', 'group_price'])], ['entity_id'] )->join( - ['cg' => $this->_getTable('customer_group')], + ['cg' => $this->_defaultIndexerResource->getTable('customer_group')], 'gp.all_groups = 1 OR (gp.all_groups = 0 AND gp.customer_group_id = cg.customer_group_id)', ['customer_group_id'] )->join( - ['cw' => $this->_getTable('store_website')], + ['cw' => $this->_defaultIndexerResource->getTable('store_website')], 'gp.website_id = 0 OR gp.website_id = cw.website_id', ['website_id'] )->join( - ['cwd' => $this->_getTable('catalog_product_index_website')], + ['cwd' => $this->_defaultIndexerResource->getTable('catalog_product_index_website')], 'cw.website_id = cwd.website_id', [] )->where( @@ -325,7 +295,7 @@ abstract class AbstractAction } $query = $select->insertFromSelect($table); - $write->query($query); + $this->_connection->query($query); return $this; } @@ -343,7 +313,7 @@ abstract class AbstractAction foreach ($types as $typeId => $typeInfo) { $modelName = isset( $typeInfo['price_indexer'] - ) ? $typeInfo['price_indexer'] : $this->_defaultPriceIndexer; + ) ? $typeInfo['price_indexer'] : get_class($this->_defaultIndexerResource); $isComposite = !empty($typeInfo['composite']); $indexer = $this->_indexerPriceFactory->create( @@ -377,7 +347,7 @@ abstract class AbstractAction } /** - * Copy data from source table of read adapter to destination table of index adapter + * Copy data from source table to destination * * @param string $sourceTable * @param string $destTable @@ -386,47 +356,19 @@ abstract class AbstractAction */ protected function _insertFromTable($sourceTable, $destTable, $where = null) { - $connection = $this->_getConnection(); - $sourceColumns = array_keys($connection->describeTable($sourceTable)); - $targetColumns = array_keys($connection->describeTable($destTable)); - $select = $connection->select()->from($sourceTable, $sourceColumns); + $sourceColumns = array_keys($this->_connection->describeTable($sourceTable)); + $targetColumns = array_keys($this->_connection->describeTable($destTable)); + $select = $this->_connection->select()->from($sourceTable, $sourceColumns); if ($where) { $select->where($where); } - $query = $connection->insertFromSelect( + $query = $this->_connection->insertFromSelect( $select, $destTable, $targetColumns, \Magento\Framework\DB\Adapter\AdapterInterface::INSERT_ON_DUPLICATE ); - $connection->query($query); - } - - /** - * Set or get what either "_idx" or "_tmp" suffixed temporary index table need to use - * - * @param bool $value - * @return bool - */ - protected function _useIdxTable($value = null) - { - if ($value !== null) { - $this->_useIdxTable = (bool)$value; - } - return $this->_useIdxTable; - } - - /** - * Retrieve temporary index table name - * - * @return string - */ - protected function _getIdxTable() - { - if ($this->_useIdxTable()) { - return $this->_getTable('catalog_product_index_price_idx'); - } - return $this->_getTable('catalog_product_index_price_tmp'); + $this->_connection->query($query); } /** @@ -437,7 +379,7 @@ abstract class AbstractAction */ protected function _emptyTable($table) { - $this->_getConnection()->delete($table); + $this->_connection->delete($table); } /** @@ -449,11 +391,11 @@ abstract class AbstractAction */ protected function _reindexRows($changedIds = []) { - $this->_emptyTable($this->_getIdxTable()); + $this->_emptyTable($this->_defaultIndexerResource->getIdxTable()); $this->_prepareWebsiteDateTable(); $select = $this->_connection->select()->from( - $this->_getTable('catalog_product_entity'), + $this->_defaultIndexerResource->getTable('catalog_product_entity'), ['entity_id', 'type_id'] )->where( 'entity_id IN(?)', @@ -479,10 +421,10 @@ abstract class AbstractAction if (!empty($notCompositeIds)) { $select = $this->_connection->select()->from( - ['l' => $this->_getTable('catalog_product_relation')], + ['l' => $this->_defaultIndexerResource->getTable('catalog_product_relation')], 'parent_id' )->join( - ['e' => $this->_getTable('catalog_product_entity')], + ['e' => $this->_defaultIndexerResource->getTable('catalog_product_entity')], 'e.entity_id = l.parent_id', ['type_id'] )->where( @@ -525,9 +467,8 @@ abstract class AbstractAction */ protected function _copyRelationIndexData($parentIds, $excludeIds = null) { - $write = $this->_connection; - $select = $write->select()->from( - $this->_getTable('catalog_product_relation'), + $select = $this->_connection->select()->from( + $this->_defaultIndexerResource->getTable('catalog_product_relation'), ['child_id'] )->where( 'parent_id IN(?)', @@ -537,17 +478,17 @@ abstract class AbstractAction $select->where('child_id NOT IN(?)', $excludeIds); } - $children = $write->fetchCol($select); + $children = $this->_connection->fetchCol($select); if ($children) { - $select = $write->select()->from( - $this->_getTable('catalog_product_index_price') + $select = $this->_connection->select()->from( + $this->_defaultIndexerResource->getTable('catalog_product_index_price') )->where( 'entity_id IN(?)', $children ); - $query = $select->insertFromSelect($this->_getIdxTable(), [], false); - $write->query($query); + $query = $select->insertFromSelect($this->_defaultIndexerResource->getIdxTable(), [], false); + $this->_connection->query($query); } return $this; diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Full.php b/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Full.php index 61700737da9d279d805533bc4421db2bbfb18182..ac9c4391efaa1bf23198ef8ec07c16436f5666eb 100755 --- a/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Full.php +++ b/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Full.php @@ -21,8 +21,8 @@ class Full extends \Magento\Catalog\Model\Indexer\Product\Price\AbstractAction public function execute($ids = null) { try { - $this->_useIdxTable(true); - $this->_emptyTable($this->_getIdxTable()); + $this->_defaultIndexerResource->getTableStrategy()->setUseIdxTable(true); + $this->_emptyTable($this->_defaultIndexerResource->getIdxTable()); $this->_prepareWebsiteDateTable(); $this->_prepareTierPriceIndex(); $this->_prepareGroupPriceIndex(); diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Row.php b/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Row.php index 8ba3086616817d0170aac3638e87eb4de5dd3005..1fe84aeec9c6217c943d4514513f4dcc025192a3 100755 --- a/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Row.php +++ b/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Row.php @@ -22,7 +22,9 @@ class Row extends \Magento\Catalog\Model\Indexer\Product\Price\AbstractAction public function execute($id = null) { if (!isset($id) || empty($id)) { - throw new \Magento\Framework\Exception\InputException(__('Could not rebuild index for undefined product')); + throw new \Magento\Framework\Exception\InputException( + __('We can\'t rebuild the index for an undefined product.') + ); } try { $this->_reindexRows([$id]); diff --git a/app/code/Magento/Catalog/Model/Layer/Filter/Item.php b/app/code/Magento/Catalog/Model/Layer/Filter/Item.php index 3ac15cc5cd688738d9bd9c257a7000cdd8ebd36f..920b9173e0a53938006ad701c9600c7dfe06d1cb 100644 --- a/app/code/Magento/Catalog/Model/Layer/Filter/Item.php +++ b/app/code/Magento/Catalog/Model/Layer/Filter/Item.php @@ -57,7 +57,7 @@ class Item extends \Magento\Framework\Object $filter = $this->getData('filter'); if (!is_object($filter)) { throw new \Magento\Framework\Exception\LocalizedException( - __('The filter must be an object. Please set correct filter.') + __('The filter must be an object. Please set the correct filter.') ); } return $filter; diff --git a/app/code/Magento/Catalog/Model/Product/AttributeSet/Build.php b/app/code/Magento/Catalog/Model/Product/AttributeSet/Build.php index c26950c2bcfd0e3ce2bc2563d0693e889f6dfb68..7c5be52e6d7e89e9d387a0d6c5e5d63f66af9d61 100644 --- a/app/code/Magento/Catalog/Model/Product/AttributeSet/Build.php +++ b/app/code/Magento/Catalog/Model/Product/AttributeSet/Build.php @@ -79,7 +79,7 @@ class Build $attributeSet = $this->attributeSetFactory->create(); $attributeSet->setEntityTypeId($this->entityTypeId)->load($this->name, 'attribute_set_name'); if ($attributeSet->getId()) { - throw new AlreadyExistsException(__('Attribute set already exists.')); + throw new AlreadyExistsException(__('Product Template already exists.')); } $attributeSet->setAttributeSetName($this->name)->validate(); diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/Date.php b/app/code/Magento/Catalog/Model/Product/Option/Type/Date.php index e34493d50951354f64b96d8e8089403649e5f113..b29a82e6d0e2e6b03b8749bfc5018e43740f00a2 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/Date.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/Date.php @@ -109,7 +109,7 @@ class Date extends \Magento\Catalog\Model\Product\Option\Type\DefaultType ); } else { throw new \Magento\Framework\Exception\LocalizedException( - __('Please specify the product\'s required option(s).') + __('Please specify product\'s required option(s).') ); } } else { diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/DefaultType.php b/app/code/Magento/Catalog/Model/Product/Option/Type/DefaultType.php index 41dfc06bd23febd38920595676bd5851ef2e9133..e001dced13fc26f5f9cd3b08da8c3c8cc025f394 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/DefaultType.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/DefaultType.php @@ -208,7 +208,7 @@ class DefaultType extends \Magento\Framework\Object $option = $this->getOption(); if (!isset($values[$option->getId()]) && $option->getIsRequire() && !$this->getSkipCheckRequiredOption()) { - throw new LocalizedException(__('Please specify the product\'s required option(s).')); + throw new LocalizedException(__('Please specify product\'s required option(s).')); } elseif (isset($values[$option->getId()])) { $this->setUserValue($values[$option->getId()]); $this->setIsValid(true); @@ -240,7 +240,7 @@ class DefaultType extends \Magento\Framework\Object return $this->getUserValue(); } throw new LocalizedException( - __('We couldn\'t add the product to the cart because of an option validation issue.') + __('We can\'t add the product to the cart because of an option validation issue.') ); } diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/File.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File.php index 21a1ecedb1f403f2bbe222e6b2e5542348ab1368..04faaeb1225b380df79ed67abbd34b23926695f4 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/File.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/File.php @@ -226,7 +226,7 @@ class File extends \Magento\Catalog\Model\Product\Option\Type\DefaultType } catch (ProductException $e) { switch ($this->getProcessMode()) { case \Magento\Catalog\Model\Product\Type\AbstractType::PROCESS_MODE_FULL: - throw new LocalizedException(__('Please specify the product\'s required option(s).')); + throw new LocalizedException(__('Please specify product\'s required option(s).')); break; default: $this->setUserValue(null); diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/File/Validator.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/Validator.php index 33fab28e868db5b82b7fdfc9fe57891607242cc8..f0e4ef3ef504b5c37fcdd59b732754cf1b13fd20 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/File/Validator.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/File/Validator.php @@ -87,7 +87,7 @@ abstract class Validator case \Zend_Validate_File_ImageSize::WIDTH_TOO_BIG: case \Zend_Validate_File_ImageSize::HEIGHT_TOO_BIG: $result[] = __( - "Maximum allowed image size for '%1' is %2x%3 px.", + "The maximum allowed image size for '%1' is %2x%3 px.", $option->getTitle(), $option->getImageSizeX(), $option->getImageSizeY() diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php index 9f8c3c955c96e7e08e580c5de60f5fcb3c3c77f1..cea7f07b44c7fdf063d46baf561b756aa01190c9 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php @@ -107,7 +107,7 @@ class ValidatorFile extends Validator $runValidation = $option->getIsRequire() || $upload->isUploaded($file); if (!$runValidation) { throw new \Magento\Framework\Validator\Exception( - __('Validation failed. Required options were not filled or file was not uploaded.') + __('Validation failed. Required options were not filled or the file was not uploaded.') ); } @@ -194,7 +194,7 @@ class ValidatorFile extends Validator throw new LocalizedException(__(implode("\n", $errors))); } } else { - throw new LocalizedException(__('Please specify the product\'s required option(s).')); + throw new LocalizedException(__('Please specify product\'s required option(s).')); } return $userValue; } diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfo.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfo.php index 373b8a63db3fe28bce01645bd8eb36bd5d9ae406..0e0acad062ef94109a4981dbedb4ed7faaee42f5 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfo.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfo.php @@ -102,7 +102,7 @@ class ValidatorInfo extends Validator } } else { throw new \Magento\Framework\Exception\LocalizedException( - __('Please specify the product\'s required option(s).') + __('Please specify product\'s required option(s).') ); } return $result; diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/Select.php b/app/code/Magento/Catalog/Model/Product/Option/Type/Select.php index 4214b8031f021d6bae3b16bcbe1cfd803a566ed0..c3c49e06779cab4a723bcfd9c6e60061ffa13902 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/Select.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/Select.php @@ -64,13 +64,13 @@ class Select extends \Magento\Catalog\Model\Product\Option\Type\DefaultType if (empty($value) && $option->getIsRequire() && !$this->getSkipCheckRequiredOption()) { $this->setIsValid(false); - throw new LocalizedException(__('Please specify the product\'s required option(s).')); + throw new LocalizedException(__('Please specify product\'s required option(s).')); } if (!$this->_isSingleSelection()) { $valuesCollection = $option->getOptionValuesByOptionId($value, $this->getProduct()->getStoreId())->load(); if ($valuesCollection->count() != count($value)) { $this->setIsValid(false); - throw new LocalizedException(__('Please specify the product\'s required option(s).')); + throw new LocalizedException(__('Please specify product\'s required option(s).')); } } return $this; diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/Text.php b/app/code/Magento/Catalog/Model/Product/Option/Type/Text.php index e0c80e3d34b5d1f79ec548e26b3a5c3edd3bd352..99c17e0a3af232ba60779ab0d9e7bc130562ef07 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/Text.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/Text.php @@ -60,7 +60,7 @@ class Text extends \Magento\Catalog\Model\Product\Option\Type\DefaultType // Check requires option to have some value if (strlen($value) == 0 && $option->getIsRequire() && !$this->getSkipCheckRequiredOption()) { $this->setIsValid(false); - throw new LocalizedException(__('Please specify the product\'s required option(s).')); + throw new LocalizedException(__('Please specify product\'s required option(s).')); } // Check maximal length limit diff --git a/app/code/Magento/Catalog/Model/Product/Type/AbstractType.php b/app/code/Magento/Catalog/Model/Product/Type/AbstractType.php index b40b91d5b08b8efa59ff0534e04600c1bfcc33d7..837e2481681a0fabfabeb80220b17aec11e2bbaf 100644 --- a/app/code/Magento/Catalog/Model/Product/Type/AbstractType.php +++ b/app/code/Magento/Catalog/Model/Product/Type/AbstractType.php @@ -559,7 +559,7 @@ abstract class AbstractType */ public function getSpecifyOptionMessage() { - return __('Please specify the product\'s required option(s).'); + return __('Please specify product\'s required option(s).'); } /** diff --git a/app/code/Magento/Catalog/Model/Product/Website.php b/app/code/Magento/Catalog/Model/Product/Website.php index 0a389baf909c6472b329f654fbd2d176724f232f..8df811f7dba80d5744b04676f317de06f28b0803 100644 --- a/app/code/Magento/Catalog/Model/Product/Website.php +++ b/app/code/Magento/Catalog/Model/Product/Website.php @@ -54,7 +54,7 @@ class Website extends \Magento\Framework\Model\AbstractModel $this->_getResource()->removeProducts($websiteIds, $productIds); } catch (\Exception $e) { throw new \Magento\Framework\Exception\LocalizedException( - __('Something went wrong removing products from the websites.') + __('Something went wrong while removing products from the websites.') ); } return $this; @@ -74,7 +74,7 @@ class Website extends \Magento\Framework\Model\AbstractModel $this->_getResource()->addProducts($websiteIds, $productIds); } catch (\Exception $e) { throw new \Magento\Framework\Exception\LocalizedException( - __('Something went wrong adding products to websites.') + __('Something went wrong while adding products to websites.') ); } return $this; diff --git a/app/code/Magento/Catalog/Model/Resource/Category/Flat.php b/app/code/Magento/Catalog/Model/Resource/Category/Flat.php index 01f2fa19a59ca5163d06d995796414944bb60cc5..fcc0fbf435f681062bdf3f39a0ab9e21d9dbeaad 100644 --- a/app/code/Magento/Catalog/Model/Resource/Category/Flat.php +++ b/app/code/Magento/Catalog/Model/Resource/Category/Flat.php @@ -11,6 +11,7 @@ use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator; * Category flat model * * @SuppressWarnings(PHPMD.LongVariable) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Flat extends \Magento\Indexer\Model\Resource\AbstractResource { @@ -78,7 +79,10 @@ class Flat extends \Magento\Indexer\Model\Resource\AbstractResource protected $_categoryFactory; /** + * Class constructor + * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Catalog\Model\CategoryFactory $categoryFactory * @param CollectionFactory $categoryCollectionFactory * @param \Magento\Store\Model\StoreManagerInterface $storeManager @@ -88,6 +92,7 @@ class Flat extends \Magento\Indexer\Model\Resource\AbstractResource */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Catalog\Model\CategoryFactory $categoryFactory, \Magento\Catalog\Model\Resource\Category\CollectionFactory $categoryCollectionFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, @@ -100,7 +105,7 @@ class Flat extends \Magento\Indexer\Model\Resource\AbstractResource $this->_storeManager = $storeManager; $this->_catalogConfig = $catalogConfig; $this->_eventManager = $eventManager; - parent::__construct($context, $resourcePrefix); + parent::__construct($context, $tableStrategy, $resourcePrefix); } /** diff --git a/app/code/Magento/Catalog/Model/Resource/Product.php b/app/code/Magento/Catalog/Model/Resource/Product.php index 6f02829d2bc2a7dff4e95b39b7cd20181d5d1903..da4aee259b6320ff29863f95e3ed192d7ad26c2c 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product.php +++ b/app/code/Magento/Catalog/Model/Resource/Product.php @@ -649,7 +649,7 @@ class Product extends AbstractResource $entityType = $this->typeFactory->create()->loadByCode(\Magento\Catalog\Model\Product::ENTITY); $attributeSet = $this->setFactory->create()->load($object->getAttributeSetId()); if ($attributeSet->getEntityTypeId() != $entityType->getId()) { - return ['attribute_set' => 'Invalid attribute set entity type']; + return ['attribute_set' => 'Invalid product template entity type']; } return parent::validate($object); diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php index 0b27b2e351936a40021478bad8332133315a2625..03a082ac070ccf8f1aec001af905968183588585 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php @@ -23,16 +23,18 @@ abstract class AbstractIndexer extends \Magento\Indexer\Model\Resource\AbstractR * Class constructor * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Eav\Model\Config $eavConfig * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Eav\Model\Config $eavConfig, $resourcePrefix = null ) { $this->_eavConfig = $eavConfig; - parent::__construct($context, $resourcePrefix); + parent::__construct($context, $tableStrategy, $resourcePrefix); } /** diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/AbstractEav.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/AbstractEav.php index 450b8207a86a2a979a0977eb079e9832e4e32c71..a156d0282926d13ad1a39ff29e3a4bdc5dbbe129 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/AbstractEav.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/AbstractEav.php @@ -23,18 +23,20 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index * Construct * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, $resourcePrefix = null ) { $this->_eventManager = $eventManager; - parent::__construct($context, $eavConfig, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $resourcePrefix); } /** @@ -45,21 +47,19 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->clearTemporaryIndexTable(); $this->_prepareIndex(); $this->_prepareRelationIndex(); $this->_removeNotVisibleEntityFromIndex(); - $this->syncData(); $this->commit(); } catch (\Exception $e) { $this->rollBack(); throw $e; } - return $this; } @@ -107,7 +107,6 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index $adapter->rollBack(); throw $e; } - return $this; } @@ -174,12 +173,12 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index } /** - * Prepare data index for product relations + * Prepare data index select for product relations * * @param array $parentIds the parent entity ids limitation - * @return $this + * @return \Magento\Framework\DB\Select */ - protected function _prepareRelationIndex($parentIds = null) + protected function _prepareRelationIndexSelect($parentIds = null) { $write = $this->_getWriteAdapter(); $idxTable = $this->getIdxTable(); @@ -215,8 +214,22 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index ] ); + return $select; + } + + /** + * Prepare data index for product relations + * + * @param array $parentIds the parent entity ids limitation + * @return $this + */ + protected function _prepareRelationIndex($parentIds = null) + { + $write = $this->_getWriteAdapter(); + $idxTable = $this->getIdxTable(); + $query = $write->insertFromSelect( - $select, + $this->_prepareRelationIndexSelect($parentIds), $idxTable, [], \Magento\Framework\DB\Adapter\AdapterInterface::INSERT_IGNORE @@ -259,10 +272,9 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index $adapter->delete($this->getMainTable(), $where); $adapter->commit(); } catch (\Exception $e) { - $adapter->rollback(); + $adapter->rollBack(); throw $e; } - return $this; } @@ -284,13 +296,11 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index // insert new index $this->insertFromTable($this->getIdxTable(), $this->getMainTable()); - $adapter->commit(); } catch (\Exception $e) { - $adapter->rollback(); + $adapter->rollBack(); throw $e; } - return $this; } } diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php index 49c694355daf768f44f156f4e91ada07ce3fe52c..f8e73ca886a6c22c3af6b5b634bd0131ae5faa8b 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php @@ -131,9 +131,6 @@ class Decimal extends AbstractEav */ public function getIdxTable($table = null) { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_eav_decimal_idx'); - } - return $this->getTable('catalog_product_index_eav_decimal_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_eav_decimal'); } } diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php index 287847f4acf445a582a4f32f80d8128cdfe9e2eb..f5899d9a55c7996ce8b2980ba865bd792724f975 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php @@ -25,6 +25,7 @@ class Source extends AbstractEav * Construct * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param \Magento\Catalog\Model\Resource\Helper $resourceHelper @@ -32,13 +33,14 @@ class Source extends AbstractEav */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Catalog\Model\Resource\Helper $resourceHelper, $resourcePrefix = null ) { $this->_resourceHelper = $resourceHelper; - parent::__construct($context, $eavConfig, $eventManager, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $eventManager, $resourcePrefix); } /** @@ -321,9 +323,6 @@ class Source extends AbstractEav */ public function getIdxTable($table = null) { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_eav_idx'); - } - return $this->getTable('catalog_product_index_eav_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_eav'); } } diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php index 7c488ecf2ec36d3bc050d1726df25a72d6d365fb..467091e3c42ed9e29542d5624ae9fc5dfdd6e1ee 100755 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php @@ -42,7 +42,10 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr protected $_eventManager = null; /** + * Class constructor + * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param \Magento\Framework\Module\Manager $moduleManager @@ -50,6 +53,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Framework\Module\Manager $moduleManager, @@ -57,7 +61,27 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr ) { $this->_eventManager = $eventManager; $this->moduleManager = $moduleManager; - parent::__construct($context, $eavConfig, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $resourcePrefix); + } + + /** + * Get Table strategy + * + * @return \Magento\Indexer\Model\Indexer\Table\StrategyInterface + */ + public function getTableStrategy() + { + return $this->tableStrategy; + } + + /** + * Get write connection + * + * @return false|\Magento\Framework\DB\Adapter\AdapterInterface + */ + public function getWriteConnection() + { + return $this->_getWriteAdapter(); } /** @@ -129,7 +153,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); @@ -176,10 +200,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ protected function _getDefaultFinalPriceTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_final_idx'); - } - return $this->getTable('catalog_product_index_price_final_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_final'); } /** @@ -330,10 +351,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ protected function _getCustomOptionAggregateTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_opt_agr_idx'); - } - return $this->getTable('catalog_product_index_price_opt_agr_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_opt_agr'); } /** @@ -343,10 +361,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ protected function _getCustomOptionPriceTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_opt_idx'); - } - return $this->getTable('catalog_product_index_price_opt_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_opt'); } /** @@ -630,10 +645,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function getIdxTable($table = null) { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_idx'); - } - return $this->getTable('catalog_product_index_price_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price'); } /** diff --git a/app/code/Magento/Catalog/Setup/InstallSchema.php b/app/code/Magento/Catalog/Setup/InstallSchema.php index d2dc790edb124beb7e7aaa34c86114e7a17ff7e2..2193120073f323e24e71960e1fd8b3e779517620 100644 --- a/app/code/Magento/Catalog/Setup/InstallSchema.php +++ b/app/code/Magento/Catalog/Setup/InstallSchema.php @@ -49,7 +49,7 @@ class InstallSchema implements InstallSchemaInterface \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, null, ['unsigned' => true, 'nullable' => false, 'default' => '0'], - 'Attribute Set ID' + 'Product Template ID' ) ->addColumn( 'type_id', diff --git a/app/code/Magento/Catalog/Test/Unit/Model/CategoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/CategoryTest.php index 058e8edb6de1c3e87ba52fa160ad30a8e4a62958..cf4fbe668a4fbbf20d62598bd85ec25eb9d5a6a3 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/CategoryTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/CategoryTest.php @@ -180,7 +180,7 @@ class CategoryTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\LocalizedException * @codingStandardsIgnoreStart - * @expectedExceptionMessage Sorry, but we can't move the category because we can't find the new parent category you selected. + * @expectedExceptionMessage Sorry, but we can't find the new parent category you selected. * @codingStandardsIgnoreEnd */ public function testMoveWhenCannotFindParentCategory() @@ -206,7 +206,7 @@ class CategoryTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\LocalizedException * @codingStandardsIgnoreStart - * @expectedExceptionMessage Sorry, but we can't move the category because we can't find the new category you selected. + * @expectedExceptionMessage Sorry, but we can't find the new category you selected. * @codingStandardsIgnoreEnd */ public function testMoveWhenCannotFindNewCategory() @@ -232,7 +232,7 @@ class CategoryTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\LocalizedException * @codingStandardsIgnoreStart - * @expectedExceptionMessage We can't perform this category move operation because the parent category matches the child category. + * @expectedExceptionMessage We can't move the category because the parent category name matches the child category name. * @codingStandardsIgnoreEnd */ public function testMoveWhenParentCategoryIsSameAsChildCategory() diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/Action/RowTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/Action/RowTest.php index b40ffc2e186c9746725e9999c8be987c8731371c..700ffc1a8a694296f01fdeeeead3f7341bb82097 100755 --- a/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/Action/RowTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Eav/Action/RowTest.php @@ -22,7 +22,7 @@ class RowTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\InputException - * @expectedExceptionMessage Could not rebuild index for undefined product + * @expectedExceptionMessage We can't rebuild the index for an undefined product. */ public function testEmptyId() { diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Flat/Action/RowTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Flat/Action/RowTest.php index 0ed7aae857a04d77741ae237e9e2535ad6fa594b..e99f1ae0ed106a17169346c2afa526a62775d454 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Flat/Action/RowTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Flat/Action/RowTest.php @@ -95,7 +95,7 @@ class RowTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Could not rebuild index for undefined product + * @expectedExceptionMessage We can't rebuild the index for an undefined product. */ public function testExecuteWithEmptyId() { diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Price/Action/RowTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Price/Action/RowTest.php index 27369edc624560bcd61ad2d9d6d85dbcf9e71f74..8c266d5e6815ae5ed15b7721d06bbaefd8df3374 100755 --- a/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Price/Action/RowTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Price/Action/RowTest.php @@ -22,7 +22,7 @@ class RowTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\InputException - * @expectedExceptionMessage Could not rebuild index for undefined product + * @expectedExceptionMessage We can't rebuild the index for an undefined product. */ public function testEmptyId() { diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Media/AttributeManagementTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Media/AttributeManagementTest.php index df099dac7d44b87d2262cda14cdc56648b97a4c3..82bcdf4a994d0dff0496974fc79cda1f63e52d82 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Media/AttributeManagementTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Media/AttributeManagementTest.php @@ -58,7 +58,7 @@ class AttributeManagementTest extends \PHPUnit_Framework_TestCase public function testGetList() { - $attributeSetName = 'Default Attribute Set'; + $attributeSetName = 'Default Product Template'; $expectedResult = [ $this->getMock('\Magento\Catalog\Api\Data\ProductAttributeInterface'), ]; diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Resource/ProductTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Resource/ProductTest.php index b0e7ede94316b4b8f8e62d8f31d3e940f519c1b9..97c41ca67eaa3bf4dfdfbd0586d2a24bef250aa3 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/Resource/ProductTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Resource/ProductTest.php @@ -56,7 +56,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase public function testValidateWrongAttributeSet() { $productTypeId = 4; - $expectedErrorMessage = ['attribute_set' => 'Invalid attribute set entity type']; + $expectedErrorMessage = ['attribute_set' => 'Invalid product template entity type']; $productMock = $this->getMock('\Magento\Framework\Object', ['getAttributeSetId', '__wakeup'], [], '', false); $attributeSetMock = $this->getMock( diff --git a/app/code/Magento/Catalog/etc/adminhtml/system.xml b/app/code/Magento/Catalog/etc/adminhtml/system.xml index fc2a339f4048e6f12917d89336c8af47cfdb413a..3b914826a2ac44449f419e108c04f5aacbe1a241 100644 --- a/app/code/Magento/Catalog/etc/adminhtml/system.xml +++ b/app/code/Magento/Catalog/etc/adminhtml/system.xml @@ -35,7 +35,7 @@ </field> </group> <group id="frontend" translate="label" type="text" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="1"> - <label>Frontend</label> + <label>Storefront</label> <field id="list_mode" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1"> <label>List Mode</label> <source_model>Magento\Catalog\Model\Config\Source\ListMode</source_model> diff --git a/app/code/Magento/Catalog/etc/di.xml b/app/code/Magento/Catalog/etc/di.xml index f4aad2caa251e2efce7f66c472eb76c8e17c5c6d..40b644c226a2ae2af8135aee265bcbe473480f98 100644 --- a/app/code/Magento/Catalog/etc/di.xml +++ b/app/code/Magento/Catalog/etc/di.xml @@ -185,7 +185,7 @@ </type> <type name="Magento\Catalog\Model\Indexer\Product\Price\AbstractAction"> <arguments> - <argument name="defaultPriceIndexer" xsi:type="string">Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice</argument> + <argument name="defaultPriceIndexer" xsi:type="object">Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice</argument> </arguments> </type> <type name="Magento\Eav\Model\Entity\Attribute\Set"> diff --git a/app/code/Magento/Catalog/etc/widget.xml b/app/code/Magento/Catalog/etc/widget.xml index 56899da4215345be5fd4741f757d78c8292a2fe1..9317297c3e3329bf860e4cc6bc24a9a490249a91 100644 --- a/app/code/Magento/Catalog/etc/widget.xml +++ b/app/code/Magento/Catalog/etc/widget.xml @@ -103,7 +103,7 @@ </parameter> <parameter name="anchor_text" xsi:type="text" visible="true"> <label translate="true">Anchor Custom Text</label> - <description translate="true">If empty, the Product Name will be used</description> + <description translate="true">If empty, we'll use the product name here.</description> </parameter> <parameter name="title" xsi:type="text" visible="true"> <label translate="true">Anchor Custom Title</label> @@ -142,7 +142,7 @@ </parameter> <parameter name="anchor_text" xsi:type="text" visible="true"> <label translate="true">Anchor Custom Text</label> - <description translate="true">If empty, the Category Name will be used</description> + <description translate="true">If empty, we'll use the category name here.</description> </parameter> <parameter name="title" xsi:type="text" visible="true"> <label translate="true">Anchor Custom Title</label> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/set/main.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/set/main.phtml index 019eb3d595e8d1d6c95712d524a32f6ec646de1e..a63bc15d80e089cd5fb12dfcda59feb7e7b70aac 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/set/main.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/attribute/set/main.phtml @@ -27,7 +27,7 @@ require([ </div> <?php if (!$block->getIsReadOnly()): ?> <?php echo $block->getAddGroupButton() ?> <?php echo $block->getDeleteGroupButton() ?> - <p class="note-block"><?php echo __('Double click on a group to rename it') ?></p> + <p class="note-block"><?php echo __('Double click on a group to rename it.') ?></p> <?php endif; ?> <?php echo $block->getSetsFilterHtml() ?> @@ -322,7 +322,7 @@ define("tree-panel", ["jquery", "extjs/ext-tree-checkbox", "prototype"], functio }, failure : function(o) { - alert('<?php echo $block->escapeJsQuote(__('We\'re unable to complete this request.')) ?>'); + alert('<?php echo $block->escapeJsQuote(__('Sorry, we\'re unable to complete this request.')) ?>'); }, groupBeforeMove : function(tree, nodeThis, oldParent, newParent) { @@ -337,7 +337,7 @@ define("tree-panel", ["jquery", "extjs/ext-tree-checkbox", "prototype"], functio rightBeforeAppend : function(tree, nodeThis, node, newParent) { if (node.attributes.is_user_defined == 0) { - alert('<?php echo $block->escapeJsQuote(__('You cannot remove system attributes from this set.')) ?>'); + alert('<?php echo $block->escapeJsQuote(__('You can\'t remove attributes from this product template.')) ?>'); return false; } else { return true; @@ -351,7 +351,7 @@ define("tree-panel", ["jquery", "extjs/ext-tree-checkbox", "prototype"], functio } if (node.attributes.is_unassignable == 0) { - alert('<?php echo $block->escapeJsQuote(__('You cannot remove system attributes from this set.')) ?>'); + alert('<?php echo $block->escapeJsQuote(__('You can\'t remove attributes from this product template.')) ?>'); return false; } else { return true; diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/composite/fieldset/options/type/date.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/composite/fieldset/options/type/date.phtml index 40fe6a37f8e852a28c2cbb9a1cccc651ea780e64..53ffa3fca77b51a5fb816a0d295dcf56f05b004d 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/composite/fieldset/options/type/date.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/composite/fieldset/options/type/date.phtml @@ -74,7 +74,7 @@ require([ } } return hasWithValue ^ hasWithNoValue; - }, '<?php echo $block->escapeJsQuote( __('Field is not complete') )?>'); + }, '<?php echo $block->escapeJsQuote( __('The field isn\'t complete.') )?>'); <?php endif; ?> //]]> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/composite/fieldset/options/type/file.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/composite/fieldset/options/type/file.phtml index 9f2fbc3cdd2babe945ad3a74347be037ad928434..28bc783f49dfda34ed98aa88d6681c39ad543788 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/composite/fieldset/options/type/file.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/composite/fieldset/options/type/file.phtml @@ -84,7 +84,7 @@ require(['prototype'], function(){ <?php if ($_option->getFileExtension()): ?> <div class="admin__field-note"> - <span><?php echo __('Allowed file extensions to upload')?>: <strong><?php echo $_option->getFileExtension() ?></strong></span> + <span><?php echo __('Compatible file extensions to upload')?>: <strong><?php echo $_option->getFileExtension() ?></strong></span> </div> <?php endif; ?> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/action/inventory.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/action/inventory.phtml index 3d11c5d746dc2e2404b2cbbae15f88164fc0947b..20e1b045d7cf7ac718713c93d5cb12f3a58a2573 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/action/inventory.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/action/inventory.phtml @@ -94,7 +94,7 @@ <div class="field with-addon"> <label class="label" for="inventory_min_qty"> - <span><?php echo __('Minimum Qty for Item\'s Status to be Out of Stock') ?></span> + <span><?php echo __('Out-of-Stock Threshold') ?></span> </label> <div class="control"> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/action/websites.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/action/websites.phtml index a8ee0b1f928cee9031e0db52a96b321646f7eb5a..bb333b6f8d976f4282ebaccdc7f761ae97c810de 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/action/websites.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/action/websites.phtml @@ -49,7 +49,7 @@ <br> <div class="messages"> <div class="message message-notice"> - <div><?php echo __("Items that you do not want to show in the catalog or search results should have status 'Disabled' in the desired store.") ?></div> + <div><?php echo __('To hide an item in catalog or search results, set the status to "Disabled".') ?></div> </div> </div> <div class="store-scope"> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options.phtml index bb8770587f9f0fc27bdf0b671c89321be9e4f62c..e2873c01dcb2d1c01a9084228611863deecd0498 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options.phtml @@ -20,7 +20,7 @@ <div class="messages"> <div class="message message-error" id="dynamic-price-warning" style="display: none;"> <div class="message-inner"> - <div class="message-content"><?php echo __('Bundle with dynamic pricing cannot include custom defined options. Options will not be saved.') ?></div> + <div class="message-content"><?php echo __('We can\'t save custom-defined options for bundles with dynamic pricing.') ?></div> </div> </div> </div> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/type/file.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/type/file.phtml index f35de05213b18b318373ea89cd4f5a1312d47e56..ada4c887c666e4527cff0b91b7f19cd6c8b2e26c 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/type/file.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/type/file.phtml @@ -18,7 +18,7 @@ <th><?php echo __('Price Type'); ?></th> <?php endif; ?> <th><?php echo __('SKU'); ?></th> - <th><?php echo __('Allowed File Extensions'); ?></th> + <th><?php echo __('Compatible File Extensions'); ?></th> <th><?php echo __('Maximum Image Size'); ?></th> </tr> </thead> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/websites.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/websites.phtml index e0128a5f0fd60ee6c7814ce459ca2b8971024770..20128abd4d013514023a4976e6ecec8750340d76 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/websites.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/websites.phtml @@ -13,7 +13,7 @@ <?php if ($block->getProductId()): ?> <div class="messages"> <div class="message message-notice"> - <?php echo __("Items that you don't want to show in the catalog or search results should have status 'Disabled' in the desired store.") ?> + <?php echo __('To hide an item in catalog or search results, set the status to "Disabled".') ?> </div> </div> <?php endif; ?> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/helper/gallery.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/helper/gallery.phtml index 73131febf7bf9b03d9c4f79b718991d8440becce..85ed22551105e18aced7f4c68f892d81bf8db78d 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/helper/gallery.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/helper/gallery.phtml @@ -23,7 +23,7 @@ $elementName = $block->getElement()->getName() . '[images]'; <?php echo $block->getUploaderHtml(); ?> <img class="spacer" src="<?php echo $block->getViewFileUrl('images/spacer.gif')?>"/> - <p class="image-placeholder-text"><?php echo __('Click here or drag and drop to add images'); + <p class="image-placeholder-text"><?php echo __('Click here or drag and drop to add images.'); ?></p> </div> <?php diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/tab/inventory.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/tab/inventory.phtml index d728e6346f4e11404534210ef9ea04ae772385cf..ecaa3dd1b64a1513597105617f7fffc7acb73e0f 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/tab/inventory.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/tab/inventory.phtml @@ -61,7 +61,7 @@ toggleValueElements($('inventory_use_config_manage_stock'), $('inventory_use_con <div class="field"> <label class="label" for="inventory_min_qty"> - <span><?php echo __('Qty for Item\'s Status to Become Out of Stock') ?></span> + <span><?php echo __('Out-of-Stock Threshold') ?></span> </label> <div class="control"> <input type="text" class="input-text validate-number" id="inventory_min_qty" name="<?php echo $block->getFieldSuffix() ?>[stock_data][min_qty]" value="<?php echo $block->getFieldValue('min_qty') * 1 ?>" <?php echo $_readonly;?>> @@ -154,7 +154,7 @@ toggleValueElements($('inventory_use_config_max_sale_qty'), $('inventory_use_con <?php if (!$block->isVirtual()) : ?> <div class="field"> <label class="label" for="inventory_is_decimal_divided"> - <span><?php echo __('Can be Divided into Multiple Boxes for Shipping') ?></span> + <span><?php echo __('Allow Multiple Boxes for Shipping.') ?></span> </label> <div class="control"> <select id="inventory_is_decimal_divided" name="<?php echo $block->getFieldSuffix() ?>[stock_data][is_decimal_divided]" <?php echo $_readonly;?>> diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/product/edit/tabs.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/product/edit/tabs.phtml index f2042ea041a048a6b9014f41837792e0bc3f3343..ed1109ac296cd7d01582a8c3c9ab1cbca9983d55 100644 --- a/app/code/Magento/Catalog/view/adminhtml/templates/product/edit/tabs.phtml +++ b/app/code/Magento/Catalog/view/adminhtml/templates/product/edit/tabs.phtml @@ -83,7 +83,7 @@ <span class="admin__page-nav-item-message _error"> <span class="admin__page-nav-item-message-icon"></span> <span class="admin__page-nav-item-message-tooltip"> - <?php echo __('This tab contains invalid data. Please solve the problem before saving.'); ?> + <?php echo __('This tab contains invalid data. Please resolve this before saving.'); ?> </span> </span> <span class="admin__page-nav-item-message-loader"> diff --git a/app/code/Magento/Catalog/view/frontend/layout/catalog_product_view.xml b/app/code/Magento/Catalog/view/frontend/layout/catalog_product_view.xml index 8de6e2824291b74e3fb39d5829238519f461c589..c3321016fd0ee1318ed7932957de322454a18156 100644 --- a/app/code/Magento/Catalog/view/frontend/layout/catalog_product_view.xml +++ b/app/code/Magento/Catalog/view/frontend/layout/catalog_product_view.xml @@ -115,7 +115,7 @@ </block> <block class="Magento\Catalog\Block\Product\View\Attributes" name="product.attributes" as="additional" template="product/view/attributes.phtml" group="detailed_info"> <arguments> - <argument translate="true" name="title" xsi:type="string">Additional Information</argument> + <argument translate="true" name="title" xsi:type="string">More Information</argument> </arguments> </block> </block> diff --git a/app/code/Magento/Catalog/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Catalog/view/frontend/layout/checkout_cart_item_renderers.xml index d14cbd5b13e6e0dc0a2696e007a81e931d4d376e..8760461ac724838b80814aee5db7c635edaccf82 100644 --- a/app/code/Magento/Catalog/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/Catalog/view/frontend/layout/checkout_cart_item_renderers.xml @@ -8,7 +8,12 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="virtual" template="cart/item/default.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="virtual" template="cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.virtual.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.virtual.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.virtual.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/list.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/list.phtml index c376d81d7fae39cbd40de974793de4129085bac2..27353c7140224bd53f485e3d6534f4ae29a99d90 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/list.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/list.phtml @@ -21,7 +21,7 @@ $_helper = $this->helper('Magento\Catalog\Helper\Output'); $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\Image'); ?> <?php if (!$_productCollection->count()): ?> - <div class="message info empty"><div><?php echo __('There are no products matching the selection.') ?></div></div> + <div class="message info empty"><div><?php echo __('We can\'t find products matching the selection.') ?></div></div> <?php else: ?> <?php echo $block->getToolbarHtml() ?> <?php echo $block->getAdditionalHtml() ?> diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/list/items.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/list/items.phtml index a2d391e3eb6955a408b51c5cd8d44f07673fc5d7..7260913b0c67c1ee6a6dece62025cf06c0d01f6d 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/list/items.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/list/items.phtml @@ -60,7 +60,7 @@ switch ($type = $block->getType()) { $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\Image'); $image = 'upsell_products_list'; - $title = __('You may also be interested in the following product(s)'); + $title = __('We found other products you might like!'); $items = $block->getAllItems(); $limit = $block->getPositionLimit(); $shuffle = (int) $block->isShuffled(); @@ -81,7 +81,7 @@ switch ($type = $block->getType()) { $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\Image'); $image = 'upsell_products_list'; - $title = __('You may also be interested in the following product(s)'); + $title = __('We found other products you might like!'); $items = $block->getItemCollection()->getItems(); $limit = $block->getItemLimit('upsell'); $shuffle = 0; diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/listing.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/listing.phtml index 2bb871627594dd90c722a83a264c0ddb0c0e7aa5..564bcad2f3ae049bec0c77b835a240d0952e8e71 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/listing.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/listing.phtml @@ -21,7 +21,7 @@ $_helper = $this->helper('Magento\Catalog\Helper\Output'); $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\Image'); ?> <?php if (!$_productCollection->count()): ?> -<p class="message note"><?php echo __('There are no products matching the selection.') ?></p> +<p class="message note"><?php echo __('We can\'t find products matching the selection.') ?></p> <?php else: ?> <?php echo $block->getToolbarHtml() ?> <?php echo $block->getAdditionalHtml() ?> diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/view/attributes.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/view/attributes.phtml index 39485ad90b96aabfcc70664a932ee7bb46fc9e5b..e804e0833a58ab4720d9989a5532d05283988165 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/view/attributes.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/view/attributes.phtml @@ -19,7 +19,7 @@ <?php if ($_additional = $block->getAdditionalData()): ?> <div class="additional-attributes-wrapper table-wrapper"> <table class="data table additional-attributes" id="product-attribute-specs-table"> - <caption class="table-caption"><?php echo __('Additional Information') ?></caption> + <caption class="table-caption"><?php echo __('More Information') ?></caption> <tbody> <?php foreach ($_additional as $_data): ?> <tr> diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/view/base-image.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/view/base-image.phtml index 5d78983a248ca004c08b53be5b26cddb717cc769..719d4ee3391c807f3155bdcbac40cb58e85e314d 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/view/base-image.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/view/base-image.phtml @@ -154,7 +154,7 @@ $thumbHeight = $block->getVar("product_page_more_views:height") ?: $thumbWidth; }, "controls": { "notice": { - "text": "<?php echo $block->escapeJsQuote(__('Click on image to view it full sized')) ?>" + "text": "<?php echo $block->escapeJsQuote(__('Click to see a larger image.')) ?>" } } }, @@ -165,7 +165,7 @@ $thumbHeight = $block->getVar("product_page_more_views:height") ?: $thumbWidth; "top": 65 }, "notice": { - "text": "<?php echo $block->escapeJsQuote(__('Click on image to zoom')) ?>" + "text": "<?php echo $block->escapeJsQuote(__('Click to see zoomed image.')) ?>" } } }, diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/view/options/type/file.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/view/options/type/file.phtml index 408b5cf67e0a3b7bdeec79808b658d42adf6b832..9e8165e3da4c00161d7b5387d3fd1ec2ef03689b 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/view/options/type/file.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/view/options/type/file.phtml @@ -50,7 +50,7 @@ <input type="hidden" name="<?php echo $_fieldNameAction; ?>" value="<?php echo $_fieldValueAction; ?>" /> <?php if ($_option->getFileExtension()): ?> <p class="note"> - <?php echo __('Allowed file extensions to upload')?>: <strong><?php echo $_option->getFileExtension() ?></strong> + <?php echo __('Compatible file extensions to upload')?>: <strong><?php echo $_option->getFileExtension() ?></strong> </p> <?php endif; ?> <?php if ($_option->getImageSizeX() > 0): ?> diff --git a/app/code/Magento/Catalog/view/frontend/web/js/view/compare-products.js b/app/code/Magento/Catalog/view/frontend/web/js/view/compare-products.js index 8f6a31c32358e4ca41e5b1e02a9d7a84d3d43e9f..3e07b5d95d3f6a2d86db1bb8e5029414a9cff9dc 100644 --- a/app/code/Magento/Catalog/view/frontend/web/js/view/compare-products.js +++ b/app/code/Magento/Catalog/view/frontend/web/js/view/compare-products.js @@ -21,11 +21,11 @@ define([ ], function ($) { $('[data-role=compare-products-sidebar]').mage('compareItems', { "removeConfirmMessage": $.mage.__( - "Are you sure you would like to remove this item from the compare products?" + "Are you sure you want to remove this item from your Compare Products list?" ), "removeSelector": "#compare-items a.action.delete", "clearAllConfirmMessage": $.mage.__( - "Are you sure you would like to remove all products from your comparison?" + "Are you sure you want to remove all items from your Compare Products list?" ), "clearAllSelector": "#compare-clear-all" }); diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index b7573b98eeade5a61dab274c12fb0e152704f217..1d2b3366d22bd3420c922d40e40b5bf677de0192 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -442,7 +442,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity } if (!$this->_productTypeModels) { throw new \Magento\Framework\Exception\LocalizedException( - __('There are no product types available for export') + __('There are no product types available for export.') ); } $this->_disabledAttrs = array_unique($this->_disabledAttrs); diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index ca248b50e394bb2d74e84a81d33d76fd1621963d..7c9924969a95257832a763af91f0b666f7e20a1b 100755 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -198,18 +198,18 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity protected $_messageTemplates = [ ValidatorInterface::ERROR_INVALID_SCOPE => 'Invalid value in Scope column', ValidatorInterface::ERROR_INVALID_WEBSITE => 'Invalid value in Website column (website does not exists?)', - ValidatorInterface::ERROR_INVALID_STORE => 'Invalid value in Store column (store does not exists?)', - ValidatorInterface::ERROR_INVALID_ATTR_SET => 'Invalid value for Attribute Set column (set does not exists?)', + ValidatorInterface::ERROR_INVALID_STORE => 'Invalid value in Store column (store doesn\'t exist?)', + ValidatorInterface::ERROR_INVALID_ATTR_SET => 'Invalid value for Product Template column (set doesn\'t exist?)', ValidatorInterface::ERROR_INVALID_TYPE => 'Product Type is invalid or not supported', ValidatorInterface::ERROR_INVALID_CATEGORY => 'Category does not exists', - ValidatorInterface::ERROR_VALUE_IS_REQUIRED => "Required attribute '%s' has an empty value", + ValidatorInterface::ERROR_VALUE_IS_REQUIRED => 'Please make sure attribute "%s" is not empty.', ValidatorInterface::ERROR_TYPE_CHANGED => 'Trying to change type of existing products', ValidatorInterface::ERROR_SKU_IS_EMPTY => 'SKU is empty', ValidatorInterface::ERROR_NO_DEFAULT_ROW => 'Default values row does not exists', ValidatorInterface::ERROR_CHANGE_TYPE => 'Product type change is not allowed', ValidatorInterface::ERROR_DUPLICATE_SCOPE => 'Duplicate scope', ValidatorInterface::ERROR_DUPLICATE_SKU => 'Duplicate SKU', - ValidatorInterface::ERROR_CHANGE_ATTR_SET => 'Product attribute set change is not allowed', + ValidatorInterface::ERROR_CHANGE_ATTR_SET => 'Product template change is not allowed', ValidatorInterface::ERROR_TYPE_UNSUPPORTED => 'Product type is not supported', ValidatorInterface::ERROR_ROW_IS_ORPHAN => 'Orphan rows that will be skipped due default row errors', ValidatorInterface::ERROR_INVALID_TIER_PRICE_QTY => 'Tier Price data price or quantity value is invalid', diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php index 14c1e38ade3b17ffa07f25691eedd4d9590aa9d4..68b16b1460cba13c95c0a7af547135beaa73cba1 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php @@ -373,33 +373,42 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity protected function _initMessageTemplates() { // @codingStandardsIgnoreStart - $this->_productEntity->addMessageTemplate(self::ERROR_INVALID_STORE, __('Invalid custom option store.')); - $this->_productEntity->addMessageTemplate(self::ERROR_INVALID_TYPE, __('Invalid custom option type.')); - $this->_productEntity->addMessageTemplate(self::ERROR_EMPTY_TITLE, __('Empty custom option title.')); - $this->_productEntity->addMessageTemplate(self::ERROR_INVALID_PRICE, __('Invalid custom option price.')); + $this->_productEntity->addMessageTemplate( + self::ERROR_INVALID_STORE, + __('Please enter a correct value for "store."') + ); + $this->_productEntity->addMessageTemplate( + self::ERROR_INVALID_TYPE, + __('Please enter a correct value for "type."') + ); + $this->_productEntity->addMessageTemplate(self::ERROR_EMPTY_TITLE, __('Please enter a value for title.')); + $this->_productEntity->addMessageTemplate( + self::ERROR_INVALID_PRICE, + __('Please enter a correct value for "price."') + ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_MAX_CHARACTERS, - __('Invalid custom option maximum characters value.') + __('Please enter a correct value for "maximum characters."') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_SORT_ORDER, - __('Invalid custom option sort order.') + __('Please enter a correct value for "sort order."') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_ROW_PRICE, - __('Invalid custom option value price.') + __('Please enter a correct value for "value price."') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_ROW_SORT, - __('Invalid custom option value sort order.') + __('Please enter a correct value for "sort order."') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_NEW_NAMES, - __('Custom option with such title already declared in source file.') + __('This name is already being used for custom option. Please enter a different name.') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_OLD_NAMES, - __('There are several existing custom options with such name.') + __('This name is already being used for custom option. Please enter a different name.') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_TYPES, @@ -475,7 +484,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity $this->_productEntity = $data['product_entity']; } else { throw new \Magento\Framework\Exception\LocalizedException( - __('Option entity must have a parent product entity.') + __('Every option entity must have a parent product entity.') ); } if (isset($data['collection_by_pages_iterator'])) { diff --git a/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php b/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php index 92704735fe73e9978cb0f321f9058a28ff4933e1..ee34eeea325a2a439cf5b6fae82180df8ee83a8a 100644 --- a/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php +++ b/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php @@ -11,13 +11,15 @@ use Magento\CatalogInventory\Api\StockRegistryInterface; use Magento\Customer\Api\GroupManagementInterface; use Magento\Framework\Api\AttributeValueFactory; use Magento\Framework\Api\ExtensionAttributesFactory; +use Magento\Framework\Object\IdentityInterface; +use Magento\Catalog\Model\Product; /** * Catalog Inventory Stock Model for adminhtml area * @method \Magento\CatalogInventory\Api\Data\StockItemExtensionInterface getExtensionAttributes() * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ -class Item extends \Magento\CatalogInventory\Model\Stock\Item +class Item extends \Magento\CatalogInventory\Model\Stock\Item implements IdentityInterface { /** * @var GroupManagementInterface @@ -122,4 +124,17 @@ class Item extends \Magento\CatalogInventory\Model\Stock\Item { return true; } + + /** + * @inheritdoc + */ + public function getIdentities() + { + $tags = []; + if ($this->getProductId()) { + $tags[] = Product::CACHE_TAG . '_' . $this->getProductId(); + } + + return $tags; + } } diff --git a/app/code/Magento/CatalogInventory/Model/Indexer/Stock/Action/Row.php b/app/code/Magento/CatalogInventory/Model/Indexer/Stock/Action/Row.php index 0103d0849f897fa8ca31ce6d9071de6d167d9e1f..30a07b0eaea1ac87af855303083bbd8f27655ce8 100644 --- a/app/code/Magento/CatalogInventory/Model/Indexer/Stock/Action/Row.php +++ b/app/code/Magento/CatalogInventory/Model/Indexer/Stock/Action/Row.php @@ -27,7 +27,7 @@ class Row extends \Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction { if (!isset($id) || empty($id)) { throw new \Magento\Framework\Exception\LocalizedException( - __('Could not rebuild index for undefined product') + __('We can\'t rebuild the index for an undefined product.') ); } try { diff --git a/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator.php b/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator.php index 2f1c028dc6f91745bb73f08420f1e9fe121c896e..40f3a1f7562eb8f12866186aadbcc538b2f5678d 100644 --- a/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator.php +++ b/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator.php @@ -110,7 +110,7 @@ class QuantityValidator 'stock', 'cataloginventory', \Magento\CatalogInventory\Helper\Data::ERROR_QTY, - __('Some of the products are currently out of stock.') + __('Some of the products are out of stock.') ); return; } else { diff --git a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php index 05de6b3ffe27586b7f67cf22684ea4049210db6a..8667d4765713ea38e548b44867262df173d63406 100644 --- a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php +++ b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php @@ -36,18 +36,20 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr * Class constructor * * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, $resourcePrefix = null ) { $this->_scopeConfig = $scopeConfig; - parent::__construct($context, $eavConfig, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $resourcePrefix); } /** @@ -68,7 +70,7 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->_prepareIndexTable(); @@ -287,9 +289,6 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function getIdxTable($table = null) { - if ($this->useIdxTable()) { - return $this->getTable('cataloginventory_stock_status_idx'); - } - return $this->getTable('cataloginventory_stock_status_tmp'); + return $this->tableStrategy->getTableName('cataloginventory_stock_status'); } } diff --git a/app/code/Magento/CatalogInventory/Model/Resource/Stock/Item.php b/app/code/Magento/CatalogInventory/Model/Resource/Stock/Item.php index b182d738370fcf152295f199814a120ebbff8604..ee653da73580405bdb9f219ef4793e6b5adc0783 100644 --- a/app/code/Magento/CatalogInventory/Model/Resource/Stock/Item.php +++ b/app/code/Magento/CatalogInventory/Model/Resource/Stock/Item.php @@ -123,6 +123,7 @@ class Item extends \Magento\Framework\Model\Resource\Db\AbstractDb parent::_afterSave($object); /** @var StockItemInterface $object */ if ($this->processIndexEvents) { + $this->stockIndexerProcessor->markIndexerAsInvalid(); $this->stockIndexerProcessor->reindexRow($object->getProductId()); } return $this; diff --git a/app/code/Magento/CatalogInventory/Model/StockRegistry.php b/app/code/Magento/CatalogInventory/Model/StockRegistry.php index f32aeb2104b686091e06120271c462ec33542f08..059910b98b6f6b5dee0cf76426d92074e4f1a548 100644 --- a/app/code/Magento/CatalogInventory/Model/StockRegistry.php +++ b/app/code/Magento/CatalogInventory/Model/StockRegistry.php @@ -172,7 +172,7 @@ class StockRegistry implements StockRegistryInterface $criteria = $this->criteriaFactory->create(); $criteria->setLimit($currentPage, $pageSize); $criteria->setWebsiteFilter($websiteId); - $criteria->setQtyFilter('>=', $qty); + $criteria->setQtyFilter('<=', $qty); $criteria->addField('qty'); return $this->stockItemRepository->getList($criteria); } diff --git a/app/code/Magento/CatalogInventory/Model/StockStateProvider.php b/app/code/Magento/CatalogInventory/Model/StockStateProvider.php index be14f0ea6972d620f4798b448ec713b3d2e9ed62..cc613bb94131df06c80734d433c4c3959eba7c82 100644 --- a/app/code/Magento/CatalogInventory/Model/StockStateProvider.php +++ b/app/code/Magento/CatalogInventory/Model/StockStateProvider.php @@ -153,7 +153,7 @@ class StockStateProvider implements StockStateProviderInterface if (!$stockItem->getIsInStock()) { $result->setHasError(true) ->setMessage(__('This product is out of stock.')) - ->setQuoteMessage(__('Some of the products are currently out of stock.')) + ->setQuoteMessage(__('Some of the products are out of stock.')) ->setQuoteMessageIndex('stock'); $result->setItemUseOldQty(true); return $result; diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Block/Plugin/ProductViewTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Block/Plugin/ProductViewTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4edffd7709f010ce79108f022e22a3e1c19ce03c --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Block/Plugin/ProductViewTest.php @@ -0,0 +1,82 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CatalogInventory\Test\Unit\Block\Plugin; + +class ProductViewTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\CatalogInventory\Block\Plugin\ProductView + */ + protected $block; + + /** + * @var \Magento\CatalogInventory\Api\Data\StockItemInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockItem; + + /** + * @var \Magento\CatalogInventory\Api\StockRegistryInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockRegistry; + + protected function setUp() + { + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->stockItem = $this->getMockBuilder('\Magento\CatalogInventory\Model\Stock\Item') + ->disableOriginalConstructor() + ->setMethods(['getQtyMinAllowed', 'getQtyMaxAllowed', 'getQtyIncrements']) + ->getMock(); + + $this->stockRegistry = $this->getMockBuilder('Magento\CatalogInventory\Api\StockRegistryInterface') + ->getMock(); + + $this->block = $objectManager->getObject( + 'Magento\CatalogInventory\Block\Plugin\ProductView', + [ + 'stockRegistry' => $this->stockRegistry + ] + ); + } + + public function testAfterGetQuantityValidators() + { + $result = [ + 'validate-item-quantity' => + [ + 'minAllowed' => 2, + 'maxAllowed' => 5, + 'qtyIncrements' => 3 + ] + ]; + $validators = []; + $productViewBlock = $this->getMockBuilder('Magento\Catalog\Block\Product\View') + ->disableOriginalConstructor() + ->getMock(); + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->setMethods(['_wakeup', 'getId', 'getStore']) + ->getMock(); + $storeMock = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->setMethods(['getWebsiteId', '_wakeup']) + ->getMock(); + + $productViewBlock->expects($this->any())->method('getProduct')->willReturn($productMock); + $productMock->expects($this->once())->method('getId')->willReturn('productId'); + $productMock->expects($this->once())->method('getStore')->willReturn($storeMock); + $storeMock->expects($this->once())->method('getWebsiteId')->willReturn('websiteId'); + $this->stockRegistry->expects($this->once()) + ->method('getStockItem') + ->with('productId', 'websiteId') + ->willReturn($this->stockItem); + $this->stockItem->expects($this->once())->method('getQtyMinAllowed')->willReturn(2); + $this->stockItem->expects($this->any())->method('getQtyMaxAllowed')->willReturn(5); + $this->stockItem->expects($this->any())->method('getQtyIncrements')->willReturn(3); + + $this->assertEquals($result, $this->block->afterGetQuantityValidators($productViewBlock, $validators)); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Block/Stockqty/DefaultStockqtyTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Block/Stockqty/DefaultStockqtyTest.php index a513382ecc9c08706363240c69c0e210e5e4d5cc..fd247ef871523bf14f3ee2480af22f3c648d6627 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Block/Stockqty/DefaultStockqtyTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Block/Stockqty/DefaultStockqtyTest.php @@ -30,6 +30,11 @@ class DefaultStockqtyTest extends \PHPUnit_Framework_TestCase */ protected $stockRegistryMock; + /** + * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $scopeConfigMock; + protected function setUp() { $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -44,12 +49,16 @@ class DefaultStockqtyTest extends \PHPUnit_Framework_TestCase $this->stockRegistryMock = $this->getMockBuilder('Magento\CatalogInventory\Api\StockRegistryInterface') ->disableOriginalConstructor() ->getMock(); + $this->scopeConfigMock = $this->getMockBuilder('\Magento\Framework\App\Config\ScopeConfigInterface') + ->disableOriginalConstructor() + ->getMock(); $this->block = $objectManager->getObject( 'Magento\CatalogInventory\Block\Stockqty\DefaultStockqty', [ 'registry' => $this->registryMock, 'stockState' => $this->stockState, - 'stockRegistry' => $this->stockRegistryMock + 'stockRegistry' => $this->stockRegistryMock, + 'scopeConfig' => $this->scopeConfigMock ] ); } @@ -198,4 +207,10 @@ class DefaultStockqtyTest extends \PHPUnit_Framework_TestCase $dataArray[$key] = $value; $property->setValue($this->block, $dataArray); } + + public function testGetThresholdQty() + { + $this->scopeConfigMock->expects($this->once())->method('getValue')->willReturn(5); + $this->assertEquals(5, $this->block->getThresholdQty()); + } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Adminhtml/Stock/ItemTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Adminhtml/Stock/ItemTest.php index bcf805e7260685689b0fda77d1026a91c8aa006b..096c3e60ebde0867c7288c24cec2efeb66651921 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Adminhtml/Stock/ItemTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Adminhtml/Stock/ItemTest.php @@ -58,4 +58,10 @@ class ItemTest extends \PHPUnit_Framework_TestCase $this->_model->setCustomerGroupId(2); $this->assertEquals(2, $this->_model->getCustomerGroupId()); } + + public function testGetIdentities() + { + $this->_model->setProductId(1); + $this->assertEquals(['catalog_product_1'], $this->_model->getIdentities()); + } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php index 6de9c01656aecb292c061550e65c69bc000ee0c1..14b5bebfb49f0ac812c2a283a58ac61f5632cbbe 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php @@ -259,4 +259,14 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase ]; $this->assertEquals($fields, $this->model->getConfigItemOptions()); } + + public function testGetManageStock() + { + $store = 1; + $this->scopeConfigMock->expects($this->once()) + ->method('isSetFlag') + ->with(Configuration::XML_PATH_MANAGE_STOCK, \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $store) + ->willReturn(1); + $this->assertEquals(1, $this->model->getManageStock($store)); + } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Indexer/Stock/Action/RowTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Indexer/Stock/Action/RowTest.php index 9a2bb4ec376b3c01d2a7c1862f4b7f802c39d5e1..bc564f6c7175457d3446d56aa938afa7655531e2 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Indexer/Stock/Action/RowTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Indexer/Stock/Action/RowTest.php @@ -26,7 +26,7 @@ class RowTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Could not rebuild index for undefined product + * @expectedExceptionMessage We can't rebuild the index for an undefined product. */ public function testEmptyId() { diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php index f6cfa8b4e7e6643d3b4df80ae83fe79bd57dd0fc..93f078e9ca11d272ef5abc37b8d2c73820cf9096 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php @@ -403,4 +403,58 @@ class ItemTest extends \PHPUnit_Framework_TestCase $this->item->setLowStockDate($date); $this->assertEquals($date, $this->item->getLowStockDate()); } + + /** + * @param array $config + * @param mixed $expected + * @dataProvider getQtyIncrementsDataProvider( + */ + public function testGetQtyIncrements($config, $expected) + { + $this->setDataArrayValue('qty_increments', $config['qty_increments']); + $this->setDataArrayValue('enable_qty_increments', $config['enable_qty_increments']); + $this->setDataArrayValue('use_config_qty_increments', $config['use_config_qty_increments']); + if ($config['use_config_qty_increments']) { + $this->stockConfiguration->expects($this->once()) + ->method('getQtyIncrements') + ->with($this->storeId) + ->willReturn($config['qty_increments']); + } else { + $this->setDataArrayValue('qty_increments', $config['qty_increments']); + } + $this->assertEquals($expected, $this->item->getQtyIncrements()); + } + + /** + * @return array + */ + public function getQtyIncrementsDataProvider() + { + return [ + [ + [ + 'qty_increments' => 1, + 'enable_qty_increments' => true, + 'use_config_qty_increments' => true + ], + 1 + ], + [ + [ + 'qty_increments' => -2, + 'enable_qty_increments' => true, + 'use_config_qty_increments' => true + ], + false + ], + [ + [ + 'qty_increments' => 3, + 'enable_qty_increments' => true, + 'use_config_qty_increments' => false + ], + 3 + ], + ]; + } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php index d01e095949ef6020c099d017e7dd15cca5a30e7f..ed72a425ea8fb2b4d67ec6a75fbf405dfb79505a 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php @@ -6,9 +6,12 @@ namespace Magento\CatalogInventory\Test\Unit\Model\Stock; use \Magento\CatalogInventory\Model\Stock\StockItemRepository; +use \Magento\CatalogInventory\Api\Data as InventoryApiData; /** * Class StockItemRepositoryTest + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase { @@ -18,7 +21,11 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase protected $model; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\CatalogInventory\Model\Stock\Item |\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockItemMock; + /** + * @var \Magento\CatalogInventory\Api\StockConfigurationInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $stockConfigurationMock; @@ -28,42 +35,42 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase protected $productMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\CatalogInventory\Model\Spi\StockStateProviderInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $stockStateProviderMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\CatalogInventory\Model\Resource\Stock\Item|\PHPUnit_Framework_MockObject_MockObject */ protected $stockItemResourceMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var InventoryApiData\StockItemInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $stockItemMock; + protected $stockItemFactoryMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var InventoryApiData\StockItemCollectionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $stockItemCollectionMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Catalog\Model\ProductFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $productFactoryMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\DB\QueryBuilderFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $queryBuilderMock; + protected $queryBuilderFactoryMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\DB\MapperFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $mapperMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $localeDateMock; @@ -74,6 +81,27 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase protected function setUp() { + $this->stockItemMock = $this->getMockBuilder('\Magento\CatalogInventory\Model\Stock\Item') + ->disableOriginalConstructor() + ->setMethods( + [ + 'getItemId', + 'getProductId', + 'setIsInStock', + 'setStockStatusChangedAutomaticallyFlag', + 'getStockStatusChangedAutomaticallyFlag', + 'getManageStock', + 'setLowStockDate', + 'setStockStatusChangedAuto', + 'hasStockStatusChangedAutomaticallyFlag', + 'setQty', + 'getWebsiteId', + 'setWebsiteId', + 'getStockId', + 'setStockId' + ] + ) + ->getMock(); $this->stockConfigurationMock = $this->getMockBuilder( 'Magento\CatalogInventory\Api\StockConfigurationInterface' ) @@ -87,12 +115,16 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase $this->stockItemResourceMock = $this->getMockBuilder('Magento\CatalogInventory\Model\Resource\Stock\Item') ->disableOriginalConstructor() ->getMock(); - $this->stockItemMock = $this->getMockBuilder('Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory') + $this->stockItemFactoryMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory' + ) + ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); $this->stockItemCollectionMock = $this->getMockBuilder( 'Magento\CatalogInventory\Api\Data\StockItemCollectionInterfaceFactory' ) + ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); $this->productFactoryMock = $this->getMockBuilder('Magento\Catalog\Model\ProductFactory') @@ -101,12 +133,14 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase ->getMock(); $this->productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') ->disableOriginalConstructor() + ->setMethods(['load', 'getId', 'getTypeId', '__wakeup']) ->getMock(); $this->productFactoryMock->expects($this->any()) ->method('create') ->willReturn($this->productMock); - $this->queryBuilderMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + $this->queryBuilderFactoryMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); $this->mapperMock = $this->getMockBuilder('Magento\Framework\DB\MapperFactory') @@ -127,29 +161,167 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase $this->stockConfigurationMock, $this->stockStateProviderMock, $this->stockItemResourceMock, - $this->stockItemMock, + $this->stockItemFactoryMock, $this->stockItemCollectionMock, $this->productFactoryMock, - $this->queryBuilderMock, + $this->queryBuilderFactoryMock, $this->mapperMock, $this->localeDateMock, $this->indexProcessorMock ); } + public function testDelete() + { + $this->stockItemResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockItemMock) + ->willReturnSelf(); + + $this->assertTrue($this->model->delete($this->stockItemMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + */ + public function testDeleteException() + { + $this->stockItemResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockItemMock) + ->willThrowException(new \Exception()); + + $this->model->delete($this->stockItemMock); + } + + public function testDeleteById() + { + $id = 1; + + $this->stockItemFactoryMock->expects($this->once())->method('create')->willReturn($this->stockItemMock); + $this->stockItemResourceMock->expects($this->once())->method('load')->with($this->stockItemMock, $id); + $this->stockItemMock->expects($this->once())->method('getItemId')->willReturn($id); + + $this->assertTrue($this->model->deleteById($id)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + * @expectedExceptionMessage Stock Item with id "1" does not exist. + */ + public function testDeleteByIdException() + { + $id = 1; + + $this->stockItemFactoryMock->expects($this->once())->method('create')->willReturn($this->stockItemMock); + $this->stockItemResourceMock->expects($this->once())->method('load')->with($this->stockItemMock, $id); + $this->stockItemMock->expects($this->once())->method('getItemId')->willReturn(null); + + $this->assertTrue($this->model->deleteById($id)); + } + public function testSave() { - $params = []; + $productId = 1; + + $this->stockItemMock->expects($this->any())->method('getProductId')->willReturn($productId); + $this->productMock->expects($this->once())->method('load')->with($productId)->willReturnSelf(); + $this->productMock->expects($this->once())->method('getId')->willReturn($productId); + $this->productMock->expects($this->once())->method('getTypeId')->willReturn('typeId'); + $this->stockConfigurationMock->expects($this->once())->method('isQty')->with('typeId')->willReturn(true); + $this->stockStateProviderMock->expects($this->once()) + ->method('verifyStock') + ->with($this->stockItemMock) + ->willReturn(false); + $this->stockItemMock->expects($this->once())->method('getManageStock')->willReturn(true); + $this->stockItemMock->expects($this->once())->method('setIsInStock')->with(false)->willReturnSelf(); + $this->stockItemMock->expects($this->once()) + ->method('setStockStatusChangedAutomaticallyFlag') + ->with(true) + ->willReturnSelf(); + $this->stockItemMock->expects($this->any())->method('setLowStockDate')->willReturnSelf(); + $this->stockStateProviderMock->expects($this->once()) + ->method('verifyNotification') + ->with($this->stockItemMock) + ->willReturn(true); + $this->stockItemMock->expects($this->atLeastOnce())->method('setStockStatusChangedAuto')->willReturnSelf(); + $this->stockItemMock->expects($this->once()) + ->method('hasStockStatusChangedAutomaticallyFlag') + ->willReturn(true); + $this->stockItemMock->expects($this->once()) + ->method('getStockStatusChangedAutomaticallyFlag') + ->willReturn(true); + $this->stockItemMock->expects($this->once())->method('getWebsiteId')->willReturn(1); + $this->stockItemMock->expects($this->once())->method('setWebsiteId')->with(1)->willReturnSelf(); + $this->stockItemMock->expects($this->once())->method('getStockId')->willReturn(1); + $this->stockItemMock->expects($this->once())->method('setStockId')->with(1)->willReturnSelf(); + $this->stockItemResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockItemMock) + ->willReturnSelf(); + $this->indexProcessorMock->expects($this->once())->method('reindexRow')->with($productId); + + $this->assertEquals($this->stockItemMock, $this->model->save($this->stockItemMock)); + } + + public function testSaveWithoutProductId() + { + $productId = 1; + + $this->stockItemMock->expects($this->any())->method('getProductId')->willReturn($productId); + $this->productMock->expects($this->once())->method('load')->with($productId)->willReturnSelf(); + $this->productMock->expects($this->once())->method('getId')->willReturn(null); + + $this->assertEquals($this->stockItemMock, $this->model->save($this->stockItemMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotSaveException + */ + public function testSaveException() + { + $productId = 1; + + $this->stockItemMock->expects($this->any())->method('getProductId')->willReturn($productId); + $this->productMock->expects($this->once())->method('load')->with($productId)->willReturnSelf(); + $this->productMock->expects($this->once())->method('getId')->willReturn($productId); + $this->productMock->expects($this->once())->method('getTypeId')->willReturn('typeId'); + $this->stockConfigurationMock->expects($this->once())->method('isQty')->with('typeId')->willReturn(false); + $this->stockItemMock->expects($this->once())->method('setQty')->with(0)->willReturnSelf(); + $this->stockItemMock->expects($this->once())->method('getWebsiteId')->willReturn(1); + $this->stockItemMock->expects($this->once())->method('setWebsiteId')->with(1)->willReturnSelf(); + $this->stockItemMock->expects($this->once())->method('getStockId')->willReturn(1); + $this->stockItemMock->expects($this->once())->method('setStockId')->with(1)->willReturnSelf(); + $this->stockItemResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockItemMock) + ->willThrowException(new \Exception()); + + $this->model->save($this->stockItemMock); + } - $stockItemMock = $this->getMockBuilder('Magento\CatalogInventory\Api\Data\StockItemInterface') + public function testGetList() + { + $criteriaMock = $this->getMockBuilder('Magento\CatalogInventory\Api\StockItemCriteriaInterface') + ->getMock(); + $queryBuilderMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilder') ->disableOriginalConstructor() + ->setMethods(['setCriteria', 'setResource', 'create']) ->getMock(); - $this->indexProcessorMock->expects($this->any()) - ->method('reindexRow') - ->withAnyParameters(); - $this->assertInstanceOf( - 'Magento\CatalogInventory\Api\Data\StockItemInterface', - $this->model->save($stockItemMock, $params) - ); + $queryMock = $this->getMockBuilder('Magento\Framework\DB\QueryInterface') + ->getMock(); + $queryCollectionMock = $this->getMockBuilder('Magento\CatalogInventory\Api\Data\StockItemCollectionInterface') + ->getMock(); + + $this->queryBuilderFactoryMock->expects($this->once())->method('create')->willReturn($queryBuilderMock); + $queryBuilderMock->expects($this->once())->method('setCriteria')->with($criteriaMock)->willReturnSelf(); + $queryBuilderMock->expects($this->once()) + ->method('setResource') + ->with($this->stockItemResourceMock) + ->willReturnSelf(); + $queryBuilderMock->expects($this->once())->method('create')->willReturn($queryMock); + $this->stockItemCollectionMock->expects($this->once())->method('create')->willReturn($queryCollectionMock); + + $this->assertEquals($queryCollectionMock, $this->model->getList($criteriaMock)); } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..dc13237c4677445f25dd6d6107100a8345e61b9c --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php @@ -0,0 +1,186 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CatalogInventory\Test\Unit\Model\Stock; + +use \Magento\CatalogInventory\Model\Stock\StockRepository; + +/** + * Class StockRepositoryTest + */ +class StockRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var StockRepository + */ + protected $model; + + /** + * @var \Magento\CatalogInventory\Model\Stock |\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockMock; + + /** + * @var \Magento\CatalogInventory\Model\Resource\Stock|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockResourceMock; + + /** + * @var Magento\CatalogInventory\Model\StockFactory |\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockFactoryMock; + + /** + * @var Magento\CatalogInventory\Api\Data\StockCollectionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockCollectionMock; + + /** + * @var \Magento\Framework\DB\QueryBuilderFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $queryBuilderFactoryMock; + + /** + * @var \Magento\Framework\DB\MapperFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $mapperMock; + + protected function setUp() + { + + $this->stockMock = $this->getMockBuilder('\Magento\CatalogInventory\Model\Stock') + ->disableOriginalConstructor() + ->getMock(); + + $this->stockResourceMock = $this->getMockBuilder('\Magento\CatalogInventory\Model\Resource\Stock') + ->disableOriginalConstructor() + ->getMock(); + $this->stockFactoryMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Model\StockFactory' + ) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->stockCollectionMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Api\Data\StockCollectionInterfaceFactory' + ) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + + $this->queryBuilderFactoryMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->mapperMock = $this->getMockBuilder('Magento\Framework\DB\MapperFactory') + ->disableOriginalConstructor() + ->getMock(); + + $this->model = new StockRepository( + $this->stockResourceMock, + $this->stockFactoryMock, + $this->stockCollectionMock, + $this->queryBuilderFactoryMock, + $this->mapperMock + ); + } + + public function testSave() + { + $this->stockResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockMock) + ->willReturnSelf(); + + $this->assertEquals($this->stockMock, $this->model->save($this->stockMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotSaveException + */ + public function testSaveException() + { + $this->stockResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockMock) + ->willThrowException(new \Exception()); + + $this->model->save($this->stockMock); + } + + public function testGetList() + { + $criteriaMock = $this->getMockBuilder('Magento\CatalogInventory\Api\StockCriteriaInterface') + ->getMock(); + $queryBuilderMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilder') + ->disableOriginalConstructor() + ->setMethods(['setCriteria', 'setResource', 'create']) + ->getMock(); + $queryMock = $this->getMockBuilder('Magento\Framework\DB\QueryInterface') + ->getMock(); + $queryCollectionMock = $this->getMockBuilder('Magento\CatalogInventory\Api\Data\StockCollectionInterface') + ->getMock(); + + $this->queryBuilderFactoryMock->expects($this->once())->method('create')->willReturn($queryBuilderMock); + $queryBuilderMock->expects($this->once())->method('setCriteria')->with($criteriaMock)->willReturnSelf(); + $queryBuilderMock->expects($this->once()) + ->method('setResource') + ->with($this->stockResourceMock) + ->willReturnSelf(); + $queryBuilderMock->expects($this->once())->method('create')->willReturn($queryMock); + $this->stockCollectionMock->expects($this->once())->method('create')->willReturn($queryCollectionMock); + + $this->assertEquals($queryCollectionMock, $this->model->getList($criteriaMock)); + } + + public function testDelete() + { + $this->stockResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockMock) + ->willReturnSelf(); + + $this->assertTrue($this->model->delete($this->stockMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + */ + public function testDeleteException() + { + $this->stockResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockMock) + ->willThrowException(new \Exception()); + + $this->model->delete($this->stockMock); + } + + public function testDeleteById() + { + $id = 1; + + $this->stockFactoryMock->expects($this->once())->method('create')->willReturn($this->stockMock); + $this->stockResourceMock->expects($this->once())->method('load')->with($this->stockMock, $id); + $this->stockMock->expects($this->once())->method('getId')->willReturn($id); + + $this->assertTrue($this->model->deleteById($id)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + * @expectedExceptionMessage Stock with id "1" does not exist. + */ + public function testDeleteByIdException() + { + $id = 1; + + $this->stockFactoryMock->expects($this->once())->method('create')->willReturn($this->stockMock); + $this->stockResourceMock->expects($this->once())->method('load')->with($this->stockMock, $id); + $this->stockMock->expects($this->once())->method('getId')->willReturn(null); + + $this->assertTrue($this->model->deleteById($id)); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..19eadb2165460d9f9ba2428d652580f6f78a0b6b --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php @@ -0,0 +1,185 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CatalogInventory\Test\Unit\Model\Stock; + +use \Magento\CatalogInventory\Model\Stock\StockStatusRepository; +use \Magento\CatalogInventory\Api\Data as InventoryApiData; + +/** + * Class StockStatusRepositoryTest + */ +class StockStatusRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var StockStatusRepository + */ + protected $model; + + /** + * @var \Magento\CatalogInventory\Model\Stock\Status|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockStatusMock; + + /** + * @var \Magento\CatalogInventory\Model\Resource\Stock\Status|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockStatusResourceMock; + + /** + * @var Magento\CatalogInventory\Model\Stock\StatusFactory |\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockStatusFactoryMock; + + /** + * @var InventoryApiData\StockStatusCollectionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $stockStatusCollectionMock; + + /** + * @var \Magento\Framework\DB\QueryBuilderFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $queryBuilderFactoryMock; + + /** + * @var \Magento\Framework\DB\MapperFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $mapperMock; + + protected function setUp() + { + $this->stockStatusMock = $this->getMockBuilder('\Magento\CatalogInventory\Model\Stock\Status') + ->disableOriginalConstructor() + ->getMock(); + $this->stockStatusResourceMock = $this->getMockBuilder('\Magento\CatalogInventory\Model\Resource\Stock\Status') + ->disableOriginalConstructor() + ->getMock(); + $this->stockStatusFactoryMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Model\Stock\StatusFactory' + ) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->stockStatusCollectionMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Api\Data\StockStatusCollectionInterfaceFactory' + ) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->queryBuilderFactoryMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->mapperMock = $this->getMockBuilder('Magento\Framework\DB\MapperFactory') + ->disableOriginalConstructor() + ->getMock(); + + $this->model = new StockStatusRepository( + $this->stockStatusResourceMock, + $this->stockStatusFactoryMock, + $this->stockStatusCollectionMock, + $this->queryBuilderFactoryMock, + $this->mapperMock + ); + } + + public function testSave() + { + $this->stockStatusResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockStatusMock) + ->willReturnSelf(); + + $this->assertEquals($this->stockStatusMock, $this->model->save($this->stockStatusMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotSaveException + */ + public function testSaveException() + { + $this->stockStatusResourceMock->expects($this->once()) + ->method('save') + ->with($this->stockStatusMock) + ->willThrowException(new \Exception()); + + $this->model->save($this->stockStatusMock); + } + + public function testGetList() + { + $criteriaMock = $this->getMockBuilder('Magento\CatalogInventory\Api\StockStatusCriteriaInterface') + ->getMock(); + $queryBuilderMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilder') + ->disableOriginalConstructor() + ->setMethods(['setCriteria', 'setResource', 'create']) + ->getMock(); + $queryMock = $this->getMockBuilder('Magento\Framework\DB\QueryInterface') + ->getMock(); + $queryCollectionMock = $this->getMockBuilder('Magento\CatalogInventory\Api\Data\StockStatusCollectionInterface') + ->getMock(); + + $this->queryBuilderFactoryMock->expects($this->once())->method('create')->willReturn($queryBuilderMock); + $queryBuilderMock->expects($this->once())->method('setCriteria')->with($criteriaMock)->willReturnSelf(); + $queryBuilderMock->expects($this->once()) + ->method('setResource') + ->with($this->stockStatusResourceMock) + ->willReturnSelf(); + $queryBuilderMock->expects($this->once())->method('create')->willReturn($queryMock); + $this->stockStatusCollectionMock->expects($this->once())->method('create')->willReturn($queryCollectionMock); + + $this->assertEquals($queryCollectionMock, $this->model->getList($criteriaMock)); + } + + public function testDelete() + { + $this->stockStatusResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockStatusMock) + ->willReturnSelf(); + + $this->assertTrue($this->model->delete($this->stockStatusMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + */ + public function testDeleteException() + { + $this->stockStatusResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockStatusMock) + ->willThrowException(new \Exception()); + + $this->model->delete($this->stockStatusMock); + } + + public function testDeleteById() + { + $id = 1; + + $this->stockStatusFactoryMock->expects($this->once())->method('create')->willReturn($this->stockStatusMock); + $this->stockStatusResourceMock->expects($this->once())->method('load')->with($this->stockStatusMock, $id); + + $this->assertTrue($this->model->deleteById($id)); + } + + /** + * @expectedException \Magento\Framework\Exception\CouldNotDeleteException + */ + public function testDeleteByIdException() + { + $id = 1; + + $this->stockStatusFactoryMock->expects($this->once())->method('create')->willReturn($this->stockStatusMock); + $this->stockStatusResourceMock->expects($this->once())->method('load')->with($this->stockStatusMock, $id); + $this->stockStatusResourceMock->expects($this->once()) + ->method('delete') + ->with($this->stockStatusMock) + ->willThrowException(new \Exception()); + + $this->assertTrue($this->model->deleteById($id)); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0c7cdea123e283baf3a5f2f9021e5dcb057fbbf4 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php @@ -0,0 +1,52 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CatalogInventory\Test\Unit\Model; + +/** + * Class StockRegistryTest + */ +class StockRegistryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\CatalogInventory\Model\StockRegistry + */ + protected $model; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $criteria; + + public function setUp() + { + $this->criteria = $this->getMockBuilder('Magento\CatalogInventory\Api\StockItemCriteriaInterface') + ->disableOriginalConstructor() + ->getMock(); + + $criteriaFactory = $this->getMockBuilder('Magento\CatalogInventory\Api\StockItemCriteriaInterfaceFactory') + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $criteriaFactory->expects($this->once())->method('create')->willReturn($this->criteria); + + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->model = $objectManager->getObject( + 'Magento\CatalogInventory\Model\StockRegistry', + [ + 'criteriaFactory' => $criteriaFactory + ] + ); + } + + public function testGetLowStockItems() + { + $this->criteria->expects($this->once())->method('setLimit')->with(1, 0); + $this->criteria->expects($this->once())->method('setWebsiteFilter')->with(1); + $this->criteria->expects($this->once())->method('setQtyFilter')->with('<='); + $this->criteria->expects($this->once())->method('addField')->with('qty'); + $this->model->getLowStockItems(1, 100); + } +} diff --git a/app/code/Magento/CatalogInventory/etc/adminhtml/system.xml b/app/code/Magento/CatalogInventory/etc/adminhtml/system.xml index b72ac2c379371dddd8857a8f3754bf482b4a12d7..4155c546202032ff28065dfff77eee82745e3ed7 100644 --- a/app/code/Magento/CatalogInventory/etc/adminhtml/system.xml +++ b/app/code/Magento/CatalogInventory/etc/adminhtml/system.xml @@ -32,7 +32,7 @@ <validate>validate-number</validate> </field> <field id="display_product_stock_status" translate="label" type="select" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="1"> - <label>Display products availability in stock in the frontend</label> + <label>Display products availability in stock on Storefront.</label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> </field> </group> @@ -58,7 +58,7 @@ <validate>validate-number</validate> </field> <field id="min_qty" translate="label" type="text" sortOrder="5" showInDefault="1" showInWebsite="0" showInStore="0"> - <label>Qty for Item's Status to Become Out of Stock</label> + <label>Out-of-Stock Threshold</label> <validate>validate-number</validate> <backend_model>Magento\CatalogInventory\Model\System\Config\Backend\Minqty</backend_model> </field> diff --git a/app/code/Magento/CatalogInventory/etc/webapi.xml b/app/code/Magento/CatalogInventory/etc/webapi.xml index 80317eccf51a7dd8ba3e7d24fe0497cef61e9df2..fe200c8628cb130aa2f3847283c7b52e0bac3b23 100644 --- a/app/code/Magento/CatalogInventory/etc/webapi.xml +++ b/app/code/Magento/CatalogInventory/etc/webapi.xml @@ -13,7 +13,7 @@ <resource ref="Magento_CatalogInventory::cataloginventory"/> </resources> </route> - <route url="/V1/stockItems/:productSku" method="PUT"> + <route url="/V1/products/:productSku/stockItems/:itemId" method="PUT"> <service class="Magento\CatalogInventory\Api\StockRegistryInterface" method="updateStockItemBySku"/> <resources> <resource ref="Magento_CatalogInventory::cataloginventory"/> diff --git a/app/code/Magento/CatalogInventory/view/frontend/templates/qtyincrements.phtml b/app/code/Magento/CatalogInventory/view/frontend/templates/qtyincrements.phtml index 999ba49d40ac0b4c528422eceba616570a1e22fc..2261d062a8f65d2bbe4e05a249f7fe60a2eeccc2 100644 --- a/app/code/Magento/CatalogInventory/view/frontend/templates/qtyincrements.phtml +++ b/app/code/Magento/CatalogInventory/view/frontend/templates/qtyincrements.phtml @@ -12,6 +12,6 @@ ?> <?php if ($block->getProductQtyIncrements()) : ?> <div class="product pricing"> - <?php echo __('%1 is available for purchase in increments of %2', $block->getProductName(), $block->getProductQtyIncrements()) ?> + <?php echo __('%1 is available to buy in increments of %2', $block->getProductName(), $block->getProductQtyIncrements()) ?> </div> <?php endif ?> diff --git a/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog.php b/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog.php index 9c06d2257e6cc17151ddafa8e1bab7562891d4dc..e268ba220a90c1e67ab0ca0f3fa4eaef83fe26e9 100644 --- a/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog.php +++ b/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog.php @@ -20,7 +20,7 @@ class Catalog extends \Magento\Backend\Block\Widget\Grid\Container { $this->_blockGroup = 'Magento_CatalogRule'; $this->_controller = 'adminhtml_promo_catalog'; - $this->_headerText = __('Catalog Price Rules'); + $this->_headerText = __('Catalog Price Rule'); $this->_addButtonLabel = __('Add New Rule'); parent::_construct(); diff --git a/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Actions.php b/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Actions.php index a1c7136d74c9faf5a69666f3ee1eb3416ce371be..7eac125efeaa9844f69f5def335f7eece0d5e7f6 100644 --- a/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Actions.php +++ b/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Actions.php @@ -65,7 +65,7 @@ class Actions extends Generic implements TabInterface $fieldset = $form->addFieldset( 'action_fieldset', - ['legend' => __('Update Prices Using the Following Information')] + ['legend' => __('Pricing Structure Rules')] ); $fieldset->addField( @@ -75,10 +75,10 @@ class Actions extends Generic implements TabInterface 'label' => __('Apply'), 'name' => 'simple_action', 'options' => [ - 'by_percent' => __('By Percentage of the Original Price'), - 'by_fixed' => __('By Fixed Amount'), - 'to_percent' => __('To Percentage of the Original Price'), - 'to_fixed' => __('To Fixed Amount'), + 'by_percent' => __('Apply as percentage of original'), + 'by_fixed' => __('Apply as fixed amount'), + 'to_percent' => __('Adjust final price to this percentage'), + 'to_fixed' => __('Adjust final price to discount value'), ] ] ); @@ -99,8 +99,8 @@ class Actions extends Generic implements TabInterface 'select', [ 'name' => 'sub_is_enable', - 'label' => __('Enable Discount to Subproducts'), - 'title' => __('Enable Discount to Subproducts'), + 'label' => __('Subproduct discounts'), + 'title' => __('Subproduct discounts'), 'onchange' => 'hideShowSubproductOptions(this);', 'values' => [0 => __('No'), 1 => __('Yes')] ] @@ -113,10 +113,10 @@ class Actions extends Generic implements TabInterface 'label' => __('Apply'), 'name' => 'sub_simple_action', 'options' => [ - 'by_percent' => __('By Percentage of the Original Price'), - 'by_fixed' => __('By Fixed Amount'), - 'to_percent' => __('To Percentage of the Original Price'), - 'to_fixed' => __('To Fixed Amount'), + 'by_percent' => __('Apply as percentage of original'), + 'by_fixed' => __('Apply as fixed amount'), + 'to_percent' => __('Adjust final price to this percentage'), + 'to_fixed' => __('Adjust final price to discount value'), ] ] ); @@ -136,8 +136,8 @@ class Actions extends Generic implements TabInterface 'stop_rules_processing', 'select', [ - 'label' => __('Stop Further Rules Processing'), - 'title' => __('Stop Further Rules Processing'), + 'label' => __('Subsequent rules'), + 'title' => __('Subsequent rules'), 'name' => 'stop_rules_processing', 'options' => ['1' => __('Yes'), '0' => __('No')] ] diff --git a/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Conditions.php b/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Conditions.php index b51ba93f76373d6286488210fd884aa96ab68668..e52687c42cf0a92d72555376807378479b4cb05d 100644 --- a/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Conditions.php +++ b/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Conditions.php @@ -101,7 +101,7 @@ class Conditions extends Generic implements TabInterface $fieldset = $form->addFieldset( 'conditions_fieldset', - ['legend' => __('Conditions (leave blank for all products)')] + ['legend' => __('Conditions (don\'t add conditions if rule is applied to all products)')] )->setRenderer( $renderer ); diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php index 3b20dec460b319b8386ec39fde6ce99298870cfc..f5c53227cf41c7587d110a9b50dab39aae37bd10 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - /** * Backend Catalog Price Rules controller * @@ -36,11 +34,15 @@ class Catalog extends Action protected $_coreRegistry = null; /** + * Date filter instance + * * @var \Magento\Framework\Stdlib\DateTime\Filter\Date */ protected $_dateFilter; /** + * Constructor + * * @param Context $context * @param Registry $coreRegistry * @param Date $dateFilter @@ -53,6 +55,8 @@ class Catalog extends Action } /** + * Init action + * * @return $this */ protected function _initAction() @@ -68,6 +72,8 @@ class Catalog extends Action } /** + * Is access to section allowed + * * @return bool */ protected function _isAllowed() @@ -94,7 +100,7 @@ class Catalog extends Action public function getDirtyRulesNoticeMessage() { $defaultMessage = __( - 'There are rules that have been changed but were not applied. Please, click Apply Rules in order to see immediate effect in the catalog.' + 'We found updated rules that are not applied. Please click "Apply Rules" to update your catalog.' ); return $this->_dirtyRulesNoticeMessage ? $this->_dirtyRulesNoticeMessage : $defaultMessage; } diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/ApplyRules.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/ApplyRules.php index f105be30bd24e0e36ad1ddd693c71cabe664d31c..abe88aa2fccf4da8acfe004f452e9caccc5e6378 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/ApplyRules.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/ApplyRules.php @@ -18,7 +18,7 @@ class ApplyRules extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog */ public function execute() { - $errorMessage = __('Unable to apply rules.'); + $errorMessage = __('We can\'t apply the rules.'); try { /** @var Job $ruleJob */ $ruleJob = $this->_objectManager->get('Magento\CatalogRule\Model\Rule\Job'); diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php index 5806ef74e41cd5d93d147ba617509f4693df7f59..41cca27abd82f0a5d04904274b6987156771ead2 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php @@ -23,7 +23,7 @@ class Delete extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog $model->load($id); $model->delete(); $this->_objectManager->create('Magento\CatalogRule\Model\Flag')->loadSelf()->setState(1)->save(); - $this->messageManager->addSuccess(__('The rule has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the rule.')); $this->_redirect('catalog_rule/*/'); return; } catch (LocalizedException $e) { @@ -37,7 +37,7 @@ class Delete extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog return; } } - $this->messageManager->addError(__('Unable to find a rule to delete.')); + $this->messageManager->addError(__('We can\'t find a rule to delete.')); $this->_redirect('catalog_rule/*/'); } } diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Edit.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Edit.php index 4dbf0caea9deb19ea157e8fd70ed02d058e3ad32..97495f7d0d48fafceae85d8640e4ad125429e0ec 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Edit.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Edit.php @@ -35,7 +35,7 @@ class Edit extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog $this->_coreRegistry->register('current_promo_catalog_rule', $model); $this->_initAction(); - $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Catalog Price Rules')); + $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Catalog Price Rule')); $this->_view->getPage()->getConfig()->getTitle()->prepend( $model->getRuleId() ? $model->getName() : __('New Catalog Price Rule') ); diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Index.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Index.php index d6c52a615cdec0ee2b16f357c93bcbe97098ca5d..fd6533a042c35fb88550397bdf88156ec2f2d603 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Index.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Index.php @@ -19,7 +19,7 @@ class Index extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog } $this->_initAction()->_addBreadcrumb(__('Catalog'), __('Catalog')); - $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Catalog Price Rules')); + $this->_view->getPage()->getConfig()->getTitle()->prepend(__('Catalog Price Rule')); $this->_view->renderLayout(); } } diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php index 383bda38d59fac0451b70cf2ea51dec3f096e391..46a8744cf4ce5882a8d4fe22e72fe5f499a9fd49 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Save.php @@ -57,7 +57,7 @@ class Save extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog $model->save(); - $this->messageManager->addSuccess(__('The rule has been saved.')); + $this->messageManager->addSuccess(__('You saved the rule.')); $this->_objectManager->get('Magento\Backend\Model\Session')->setPageData(false); if ($this->getRequest()->getParam('auto_apply')) { $this->getRequest()->setParam('rule_id', $model->getId()); @@ -75,7 +75,7 @@ class Save extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addError( - __('An error occurred while saving the rule data. Please review the log and try again.') + __('Something went wrong while saving the rule data. Please review the error log.') ); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); $this->_objectManager->get('Magento\Backend\Model\Session')->setPageData($data); diff --git a/app/code/Magento/CatalogRule/Helper/Data.php b/app/code/Magento/CatalogRule/Helper/Data.php index 439cff46006938de35eb744508e7b7424413c2fa..33ff883655675bf067876ac24d74ef0248ed99ce 100644 --- a/app/code/Magento/CatalogRule/Helper/Data.php +++ b/app/code/Magento/CatalogRule/Helper/Data.php @@ -12,13 +12,12 @@ namespace Magento\CatalogRule\Helper; class Data extends \Magento\Framework\App\Helper\AbstractHelper { /** - * Algorithm for calculating price rule + * Algorithm for calculating price by rule * * @param string $actionOperator * @param int $ruleAmount * @param float $price * @return float|int - * @api */ public function calcPriceRule($actionOperator, $ruleAmount, $price) { diff --git a/app/code/Magento/CatalogRule/Model/Indexer/AbstractIndexer.php b/app/code/Magento/CatalogRule/Model/Indexer/AbstractIndexer.php index 13dc23422a50c60ace7d5f0ed87376fba998f04f..dd32624a89912a5a3a8434f2975ed266bda2cb42 100644 --- a/app/code/Magento/CatalogRule/Model/Indexer/AbstractIndexer.php +++ b/app/code/Magento/CatalogRule/Model/Indexer/AbstractIndexer.php @@ -105,7 +105,7 @@ abstract class AbstractIndexer implements IndexerActionInterface, MviewActionInt { if (!$id) { throw new \Magento\Framework\Exception\LocalizedException( - __('Could not rebuild index for undefined product') + __('We can\'t rebuild the index for an undefined product.') ); } $this->doExecuteRow($id); diff --git a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php index 55b77da9849cec49ac94e2af32d15e6caf00aeb8..cef79f4f73706fba4969a990a42bc5836f244701 100755 --- a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php +++ b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php @@ -18,6 +18,15 @@ class IndexBuilder { const SECONDS_IN_DAY = 86400; + /** + * CatalogRuleGroupWebsite columns list + * + * This array contain list of CatalogRuleGroupWebsite table columns + * + * @var array + */ + protected $_catalogRuleGroupWebsiteColumnsList = ['rule_id', 'customer_group_id', 'website_id']; + /** * @var \Magento\Framework\App\Resource */ @@ -415,8 +424,6 @@ class IndexBuilder */ protected function applyAllRules(Product $product = null) { - $write = $this->getWriteAdapter(); - $fromDate = mktime(0, 0, 0, date('m'), date('d') - 1); $toDate = mktime(0, 0, 0, date('m'), date('d') + 1); @@ -499,6 +506,17 @@ class IndexBuilder $this->saveRuleProductPrices($dayPrices); } + return $this->updateCatalogRuleGroupWebsiteData(); + } + + /** + * Update CatalogRuleGroupWebsite data + * + * @return $this + */ + protected function updateCatalogRuleGroupWebsiteData() + { + $write = $this->getWriteAdapter(); $write->delete($this->getTable('catalogrule_group_website'), []); $timestamp = $this->dateTime->gmtTimestamp(); @@ -507,11 +525,15 @@ class IndexBuilder true )->from( $this->getTable('catalogrule_product'), - ['rule_id', 'customer_group_id', 'website_id'] + $this->_catalogRuleGroupWebsiteColumnsList )->where( "{$timestamp} >= from_time AND (({$timestamp} <= to_time AND to_time > 0) OR to_time = 0)" ); - $query = $select->insertFromSelect($this->getTable('catalogrule_group_website')); + $query = $select->insertFromSelect( + $this->getTable('catalogrule_group_website'), + $this->_catalogRuleGroupWebsiteColumnsList + ); + $write->query($query); return $this; @@ -658,7 +680,6 @@ class IndexBuilder $arrData[$key]['latest_start_date'] = $this->dateFormat->formatDate($data['latest_start_date'], false); $arrData[$key]['earliest_end_date'] = $this->dateFormat->formatDate($data['earliest_end_date'], false); } - $adapter->insertOnDuplicate($this->getTable('catalogrule_affected_product'), array_unique($productIds)); $adapter->insertOnDuplicate($this->getTable('catalogrule_product_price'), $arrData); } catch (\Exception $e) { throw $e; diff --git a/app/code/Magento/CatalogRule/Plugin/Indexer/Product/Attribute.php b/app/code/Magento/CatalogRule/Plugin/Indexer/Product/Attribute.php index 254ac9fdbff862b9d37174f882990144458ecbae..4a4450057ea0d5d92659fe003fac53b19538bc89 100644 --- a/app/code/Magento/CatalogRule/Plugin/Indexer/Product/Attribute.php +++ b/app/code/Magento/CatalogRule/Plugin/Indexer/Product/Attribute.php @@ -105,7 +105,7 @@ class Attribute $this->ruleProductProcessor->markIndexerAsInvalid(); $this->messageManager->addWarning( __( - '%1 Catalog Price Rules based on "%2" attribute have been disabled.', + 'You disabled %1 Catalog Price Rules based on "%2" attribute.', $disabledRulesCount, $attributeCode ) diff --git a/app/code/Magento/CatalogRule/Setup/InstallSchema.php b/app/code/Magento/CatalogRule/Setup/InstallSchema.php index 5c4700a3fb0ae645f1861a08a69526b407ed7e1d..68629bbadabce2551c3b3c2c74bcce3f44e26024 100644 --- a/app/code/Magento/CatalogRule/Setup/InstallSchema.php +++ b/app/code/Magento/CatalogRule/Setup/InstallSchema.php @@ -358,22 +358,6 @@ class InstallSchema implements InstallSchemaInterface $installer->getConnection()->createTable($table); - /** - * Create table 'catalogrule_affected_product' - */ - $table = $installer->getConnection() - ->newTable($installer->getTable('catalogrule_affected_product')) - ->addColumn( - 'product_id', - \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, - null, - ['unsigned' => true, 'nullable' => false, 'primary' => true], - 'Product Id' - ) - ->setComment('CatalogRule Affected Product'); - - $installer->getConnection()->createTable($table); - /** * Create table 'catalogrule_group_website' */ diff --git a/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php b/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0d75d688a07a164bb674fa343d97800049173af0 --- /dev/null +++ b/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php @@ -0,0 +1,67 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\CatalogRule\Test\Unit\Helper; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; + +class DataTest extends \PHPUnit_Framework_TestCase +{ + /** + * Helper object + * + * @var \Magento\CatalogRule\Helper\Data + */ + protected $helper; + + protected function setUp() + { + $this->helper = (new ObjectManager($this))->getObject('Magento\CatalogRule\Helper\Data'); + } + + /** + * Test price rule calculation + * + * @param string $actionOperator + * @param int|float $ruleAmount + * @param int|float $price + * @param int|float $expectedAmount + * + * @dataProvider calcPriceRuleDataProvider + */ + public function testCalcPriceRule($actionOperator, $ruleAmount, $price, $expectedAmount) + { + $this->assertEquals($expectedAmount, $this->helper->calcPriceRule($actionOperator, $ruleAmount, $price)); + } + + /** + * Data provider for cal price rule test + * + * @return array + */ + public function calcPriceRuleDataProvider() + { + return [ + ['to_fixed', 10, 10, 10], + ['to_fixed', 0, 10, 0], + ['to_fixed', 10, 0, 0], + ['to_fixed', 0, 0, 0], + ['to_percent', 100, 100, 100], + ['to_percent', 10, 100, 10], + ['to_percent', 10, 70, 7], + ['to_percent', 100, 10, 10], + ['by_fixed', 100, 100, 0], + ['by_fixed', 10, 100, 90], + ['by_fixed', 100, 10, 0], + ['by_percent', 100, 100, 0], + ['by_percent', 100, 10, 0], + ['by_percent', 100, 1, 0], + ['by_percent', 10, 100, 90], + ['by_percent', 10, 10, 9], + ['by_percent', 1, 10, 9.90], + ]; + } +} diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/CronTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/CronTest.php index 07e27c6398a6a8678788390b12e5fd0076cea02e..2d8f4b8b8a6a95955be084fcda3a2a6ad25dab6c 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Model/CronTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/CronTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\CatalogRule\Test\Unit\Model; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -13,23 +11,35 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class CronTest extends \PHPUnit_Framework_TestCase { /** + * Processor + * * @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor|\PHPUnit_Framework_MockObject_MockObject */ protected $ruleProductProcessor; /** + * Cron object + * * @var \Magento\CatalogRule\Model\Cron */ protected $cron; protected function setUp() { - $this->ruleProductProcessor = $this->getMock('Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', - [], [], '', false); - - $this->cron = (new ObjectManager($this))->getObject('Magento\CatalogRule\Model\Cron', [ - 'ruleProductProcessor' => $this->ruleProductProcessor, - ]); + $this->ruleProductProcessor = $this->getMock( + 'Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', + [], + [], + '', + false + ); + + $this->cron = (new ObjectManager($this))->getObject( + 'Magento\CatalogRule\Model\Cron', + [ + 'ruleProductProcessor' => $this->ruleProductProcessor, + ] + ); } public function testDailyCatalogUpdate() diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/AbstractIndexerTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/AbstractIndexerTest.php index dfec1c047ab09db3763e463ff16d120f3d4c50ad..c000ae21d096bb66d0d8a3ec205c5bbf96e7389c 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/AbstractIndexerTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/AbstractIndexerTest.php @@ -99,7 +99,7 @@ class AbstractIndexerTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Could not rebuild index for undefined product + * @expectedExceptionMessage We can't rebuild the index for an undefined product. * * @return void */ diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8c41a3c24276dcad12e5733216b5eb2a21cc3640 --- /dev/null +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php @@ -0,0 +1,213 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\CatalogRule\Test\Unit\Model\Indexer; + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.TooManyFields) + */ +class IndexBuilderTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\CatalogRule\Model\Indexer\IndexBuilder + */ + protected $indexBuilder; + + /** + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resource; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManager; + + /** + * @var \Magento\CatalogRule\Model\Resource\Rule\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $ruleCollectionFactory; + + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $logger; + + /** + * @var \Magento\Framework\Pricing\PriceCurrencyInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $priceCurrency; + + + /** + * @var \Magento\Eav\Model\Config|\PHPUnit_Framework_MockObject_MockObject + */ + protected $eavConfig; + + /** + * @var \Magento\Framework\Stdlib\DateTime|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dateFormat; + + /** + * @var \Magento\Framework\Stdlib\DateTime\DateTime|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dateTime; + + /** + * @var \Magento\Catalog\Model\ProductFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $productFactory; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $connection; + + /** + * @var \Magento\Framework\DB\Select|\PHPUnit_Framework_MockObject_MockObject + */ + protected $select; + + /** + * @var \Zend_Db_Statement_Interface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $db; + + /** + * @var \Magento\Store\Model\Website|\PHPUnit_Framework_MockObject_MockObject + */ + protected $website; + + /** + * @var \Magento\Rule\Model\Condition\Combine|\PHPUnit_Framework_MockObject_MockObject + */ + protected $combine; + + /** + * @var \Magento\CatalogRule\Model\Rule|\PHPUnit_Framework_MockObject_MockObject + */ + protected $rules; + + /** + * @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject + */ + protected $product; + + /** + * @var \Magento\Eav\Model\Entity\Attribute\AbstractAttribute|\PHPUnit_Framework_MockObject_MockObject + */ + protected $attribute; + + /** + * @var \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend|\PHPUnit_Framework_MockObject_MockObject + */ + protected $backend; + + /** + * Set up test + * + * @return void + */ + protected function setUp() + { + $this->resource = $this->getMock( + 'Magento\Framework\App\Resource', + ['getConnection', 'getTableName'], + [], + '', + false + ); + $this->ruleCollectionFactory = $this->getMock( + 'Magento\CatalogRule\Model\Resource\Rule\CollectionFactory', + ['create', 'addFieldToFilter'], + [], + '', + false + ); + $this->backend = $this->getMock( + 'Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend', + [], + [], + '', + false + ); + $this->select = $this->getMock('Magento\Framework\DB\Select', [], [], '', false); + $this->connection = $this->getMock('Magento\Framework\DB\Adapter\AdapterInterface'); + $this->db = $this->getMock('Zend_Db_Statement_Interface', [], [], '', false); + $this->website = $this->getMock('Magento\Store\Model\Website', [], [], '', false); + $this->storeManager = $this->getMock('Magento\Store\Model\StoreManagerInterface', [], [], '', false); + $this->combine = $this->getMock('Magento\Rule\Model\Condition\Combine', [], [], '', false); + $this->rules = $this->getMock('Magento\CatalogRule\Model\Rule', [], [], '', false); + $this->logger = $this->getMock('Psr\Log\LoggerInterface', [], [], '', false); + $this->attribute = $this->getMock('Magento\Eav\Model\Entity\Attribute\AbstractAttribute', [], [], '', false); + $this->priceCurrency = $this->getMock('Magento\Framework\Pricing\PriceCurrencyInterface'); + $this->dateFormat = $this->getMock('Magento\Framework\Stdlib\DateTime', [], [], '', false); + $this->dateTime = $this->getMock('Magento\Framework\Stdlib\DateTime\DateTime', [], [], '', false); + $this->eavConfig = $this->getMock('Magento\Eav\Model\Config', [], [], '', false); + $this->product = $this->getMock('Magento\Catalog\Model\Product', [], [], '', false); + $this->productFactory = $this->getMock('Magento\Catalog\Model\ProductFactory', ['create'], [], '', false); + + $this->connection->expects($this->any())->method('select')->will($this->returnValue($this->select)); + $this->connection->expects($this->any())->method('query')->will($this->returnValue($this->db)); + + $this->select->expects($this->any())->method('distinct')->will($this->returnSelf()); + $this->select->expects($this->any())->method('where')->will($this->returnSelf()); + $this->select->expects($this->any())->method('from')->will($this->returnSelf()); + $this->select->expects($this->any())->method('order')->will($this->returnSelf()); + + $this->resource->expects($this->any())->method('getConnection')->will($this->returnValue($this->connection)); + $this->resource->expects($this->any())->method('getTableName')->will($this->returnArgument(0)); + + $this->storeManager->expects($this->any())->method('getWebsites')->will($this->returnValue([$this->website])); + $this->storeManager->expects($this->any())->method('getWebsite')->will($this->returnValue($this->website)); + + $this->rules->expects($this->any())->method('getId')->will($this->returnValue(1)); + $this->rules->expects($this->any())->method('getWebsiteIds')->will($this->returnValue([1])); + $this->rules->expects($this->any())->method('getConditions')->will($this->returnValue($this->combine)); + $this->rules->expects($this->any())->method('getCustomerGroupIds')->will($this->returnValue([1])); + + $this->ruleCollectionFactory->expects($this->any())->method('create')->will($this->returnSelf()); + $this->ruleCollectionFactory->expects($this->any())->method('addFieldToFilter')->will( + $this->returnValue([$this->rules]) + ); + + $this->product->expects($this->any())->method('load')->will($this->returnSelf()); + $this->product->expects($this->any())->method('getId')->will($this->returnValue(1)); + $this->product->expects($this->any())->method('getWebsiteIds')->will($this->returnValue([1])); + + $this->combine->expects($this->any())->method('validate')->will($this->returnValue(true)); + $this->attribute->expects($this->any())->method('getBackend')->will($this->returnValue($this->backend)); + $this->eavConfig->expects($this->any())->method('getAttribute')->will($this->returnValue($this->attribute)); + $this->productFactory->expects($this->any())->method('create')->will($this->returnValue($this->product)); + + $this->indexBuilder = new \Magento\CatalogRule\Model\Indexer\IndexBuilder( + $this->ruleCollectionFactory, + $this->priceCurrency, + $this->resource, + $this->storeManager, + $this->logger, + $this->eavConfig, + $this->dateFormat, + $this->dateTime, + $this->productFactory + ); + } + + /** + * Test UpdateCatalogRuleGroupWebsiteData + * + * @covers \Magento\CatalogRule\Model\Indexer\IndexBuilder::updateCatalogRuleGroupWebsiteData + * @return void + */ + public function testUpdateCatalogRuleGroupWebsiteData() + { + $this->select->expects($this->once())->method('insertFromSelect')->with('catalogrule_group_website'); + + $this->indexBuilder->reindexByIds([1]); + } +} diff --git a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CategoryTest.php b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CategoryTest.php index 4814767f39d9e8017bd8e45804c5b8a670a2bd1c..59bd89d00579eff03f37dc0293027240c303c5e3 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CategoryTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CategoryTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\CatalogRule\Test\Unit\Plugin\Indexer; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -29,20 +27,37 @@ class CategoryTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $this->productRuleProcessor = $this->getMock('Magento\CatalogRule\Model\Indexer\Product\ProductRuleProcessor', - [], [], '', false); - $this->subject = $this->getMock('Magento\Catalog\Model\Category', ['getAffectedProductIds', '__wakeUp'], [], - '', false); - - $this->plugin = (new ObjectManager($this))->getObject('Magento\CatalogRule\Plugin\Indexer\Category', [ - 'productRuleProcessor' => $this->productRuleProcessor, - ]); + $this->productRuleProcessor = $this->getMock( + 'Magento\CatalogRule\Model\Indexer\Product\ProductRuleProcessor', + [], + [], + '', + false + ); + $this->subject = $this->getMock( + 'Magento\Catalog\Model\Category', + ['getAffectedProductIds', '__wakeUp'], + [], + '', + false + ); + + $this->plugin = (new ObjectManager($this))->getObject( + 'Magento\CatalogRule\Plugin\Indexer\Category', + [ + 'productRuleProcessor' => $this->productRuleProcessor, + ] + ); } public function testAfterSaveWithoutAffectedProductIds() { - $this->subject->expects($this->any())->method('getAffectedProductIds')->will($this->returnValue([])); - $this->productRuleProcessor->expects($this->never())->method('reindexList'); + $this->subject->expects($this->any()) + ->method('getAffectedProductIds') + ->will($this->returnValue([])); + + $this->productRuleProcessor->expects($this->never()) + ->method('reindexList'); $this->assertEquals($this->subject, $this->plugin->afterSave($this->subject, $this->subject)); } @@ -51,15 +66,21 @@ class CategoryTest extends \PHPUnit_Framework_TestCase { $productIds = [1, 2, 3]; - $this->subject->expects($this->any())->method('getAffectedProductIds')->will($this->returnValue($productIds)); - $this->productRuleProcessor->expects($this->once())->method('reindexList')->with($productIds); + $this->subject->expects($this->any()) + ->method('getAffectedProductIds') + ->will($this->returnValue($productIds)); + + $this->productRuleProcessor->expects($this->once()) + ->method('reindexList') + ->with($productIds); $this->assertEquals($this->subject, $this->plugin->afterSave($this->subject, $this->subject)); } public function testAfterDelete() { - $this->productRuleProcessor->expects($this->once())->method('markIndexerAsInvalid'); + $this->productRuleProcessor->expects($this->once()) + ->method('markIndexerAsInvalid'); $this->assertEquals($this->subject, $this->plugin->afterDelete($this->subject, $this->subject)); } diff --git a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CustomerGroupTest.php b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CustomerGroupTest.php index f0c7283f1d4eb081ed736b11591521036d21560d..fb911fb1cdbd7211e3d39b5ea2528587d9c3f343 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CustomerGroupTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CustomerGroupTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\CatalogRule\Test\Unit\Plugin\Indexer; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -13,34 +11,55 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class CustomerGroupTest extends \PHPUnit_Framework_TestCase { /** + * Rule processor mock + * * @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor|\PHPUnit_Framework_MockObject_MockObject */ protected $ruleProductProcessor; /** + * Subject group + * * @var \Magento\Customer\Model\Group|\PHPUnit_Framework_MockObject_MockObject */ protected $subject; /** + * Tested plugin + * * @var \Magento\CatalogRule\Plugin\Indexer\CustomerGroup */ protected $plugin; protected function setUp() { - $this->ruleProductProcessor = $this->getMock('Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', - [], [], '', false); - $this->subject = $this->getMock('Magento\Customer\Model\Group', [], [], '', false); + $this->ruleProductProcessor = $this->getMock( + 'Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', + [], + [], + '', + false + ); + $this->subject = $this->getMock( + 'Magento\Customer\Model\Group', + [], + [], + '', + false + ); - $this->plugin = (new ObjectManager($this))->getObject('Magento\CatalogRule\Plugin\Indexer\CustomerGroup', [ - 'ruleProductProcessor' => $this->ruleProductProcessor, - ]); + $this->plugin = (new ObjectManager($this))->getObject( + 'Magento\CatalogRule\Plugin\Indexer\CustomerGroup', + [ + 'ruleProductProcessor' => $this->ruleProductProcessor, + ] + ); } public function testAfterDelete() { - $this->ruleProductProcessor->expects($this->once())->method('markIndexerAsInvalid'); + $this->ruleProductProcessor->expects($this->once()) + ->method('markIndexerAsInvalid'); $this->assertEquals($this->subject, $this->plugin->afterDelete($this->subject, $this->subject)); } diff --git a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/ImportExportTest.php b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/ImportExportTest.php index eac185dcc129f308874f6c412f24655dbcaaf0b1..68a4dae5ef04fae0434f9af375015454afe8e238 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/ImportExportTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/ImportExportTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\CatalogRule\Test\Unit\Plugin\Indexer; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -13,36 +11,51 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class ImportExportTest extends \PHPUnit_Framework_TestCase { /** + * Indexer processor mock + * * @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor|\PHPUnit_Framework_MockObject_MockObject */ protected $ruleProductProcessor; /** + * Import model mock + * * @var \Magento\ImportExport\Model\Import|\PHPUnit_Framework_MockObject_MockObject */ protected $subject; /** + * Tested plugin + * * @var \Magento\CatalogRule\Plugin\Indexer\ImportExport */ protected $plugin; protected function setUp() { - $this->ruleProductProcessor = $this->getMock('Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', - [], [], '', false); + $this->ruleProductProcessor = $this->getMock( + 'Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', + [], + [], + '', + false + ); $this->subject = $this->getMock('Magento\ImportExport\Model\Import', [], [], '', false); - $this->plugin = (new ObjectManager($this))->getObject('Magento\CatalogRule\Plugin\Indexer\ImportExport', [ - 'ruleProductProcessor' => $this->ruleProductProcessor, - ]); + $this->plugin = (new ObjectManager($this))->getObject( + 'Magento\CatalogRule\Plugin\Indexer\ImportExport', + [ + 'ruleProductProcessor' => $this->ruleProductProcessor, + ] + ); } public function testAfterImportSource() { $result = true; - $this->ruleProductProcessor->expects($this->once())->method('markIndexerAsInvalid'); + $this->ruleProductProcessor->expects($this->once()) + ->method('markIndexerAsInvalid'); $this->assertEquals($result, $this->plugin->afterImportSource($this->subject, $result)); } diff --git a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/WebsiteTest.php b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/WebsiteTest.php index 2fca372e8e4ac7d196b2ac4bff988dc8c57a41f7..39571d32c38003914838a6d702817d09e44e8e76 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/WebsiteTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/WebsiteTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\CatalogRule\Test\Unit\Plugin\Indexer; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; @@ -13,34 +11,49 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class WebsiteTest extends \PHPUnit_Framework_TestCase { /** + * Indexer processor mock + * * @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor|\PHPUnit_Framework_MockObject_MockObject */ protected $ruleProductProcessor; /** + * Website mock + * * @var \Magento\Store\Model\Website|\PHPUnit_Framework_MockObject_MockObject */ protected $subject; /** + * Tested plugin + * * @var \Magento\CatalogRule\Plugin\Indexer\Website */ protected $plugin; protected function setUp() { - $this->ruleProductProcessor = $this->getMock('Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', - [], [], '', false); + $this->ruleProductProcessor = $this->getMock( + 'Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor', + [], + [], + '', + false + ); $this->subject = $this->getMock('Magento\Store\Model\Website', [], [], '', false); - $this->plugin = (new ObjectManager($this))->getObject('Magento\CatalogRule\Plugin\Indexer\Website', [ - 'ruleProductProcessor' => $this->ruleProductProcessor, - ]); + $this->plugin = (new ObjectManager($this))->getObject( + 'Magento\CatalogRule\Plugin\Indexer\Website', + [ + 'ruleProductProcessor' => $this->ruleProductProcessor, + ] + ); } public function testAfterDelete() { - $this->ruleProductProcessor->expects($this->once())->method('markIndexerAsInvalid'); + $this->ruleProductProcessor->expects($this->once()) + ->method('markIndexerAsInvalid'); $this->assertEquals($this->subject, $this->plugin->afterDelete($this->subject, $this->subject)); } diff --git a/app/code/Magento/CatalogRule/etc/acl.xml b/app/code/Magento/CatalogRule/etc/acl.xml index c5216b6f58560ba67841eb803c45a0f8346578ca..3f8941d24f70885bcdcffb0139a180994157a165 100644 --- a/app/code/Magento/CatalogRule/etc/acl.xml +++ b/app/code/Magento/CatalogRule/etc/acl.xml @@ -11,7 +11,7 @@ <resource id="Magento_Backend::admin"> <resource id="Magento_Backend::marketing"> <resource id="Magento_CatalogRule::promo" title="Promotions" sortOrder="10"> - <resource id="Magento_CatalogRule::promo_catalog" title="Catalog Price Rules" sortOrder="10" /> + <resource id="Magento_CatalogRule::promo_catalog" title="Catalog Price Rule" sortOrder="10" /> </resource> </resource> </resource> diff --git a/app/code/Magento/CatalogRule/etc/adminhtml/menu.xml b/app/code/Magento/CatalogRule/etc/adminhtml/menu.xml index 29cde11d5c0b83b77620b7c0c42475bef0016c24..cb0545bf17eb2cb100c33b2c1a76a1ebd4cbdfbc 100644 --- a/app/code/Magento/CatalogRule/etc/adminhtml/menu.xml +++ b/app/code/Magento/CatalogRule/etc/adminhtml/menu.xml @@ -8,6 +8,6 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Backend/etc/menu.xsd"> <menu> <add id="Magento_CatalogRule::promo" title="Promotions" module="Magento_CatalogRule" parent="Magento_Backend::marketing" sortOrder="10" resource="Magento_CatalogRule::promo"/> - <add id="Magento_CatalogRule::promo_catalog" title="Catalog Price Rules" sortOrder="10" module="Magento_CatalogRule" parent="Magento_CatalogRule::promo" action="catalog_rule/promo_catalog/" dependsOnModule="Magento_Catalog" resource="Magento_CatalogRule::promo_catalog"/> + <add id="Magento_CatalogRule::promo_catalog" title="Catalog Price Rule" sortOrder="10" module="Magento_CatalogRule" parent="Magento_CatalogRule::promo" action="catalog_rule/promo_catalog/" dependsOnModule="Magento_Catalog" resource="Magento_CatalogRule::promo_catalog"/> </menu> </config> diff --git a/app/code/Magento/CatalogSearch/view/frontend/templates/advanced/result.phtml b/app/code/Magento/CatalogSearch/view/frontend/templates/advanced/result.phtml index a573a9a02d646f295b5e551e1246a70cf272e3a4..e96c86c5f8aff280f09b6ef0edfadea818f13ad4 100644 --- a/app/code/Magento/CatalogSearch/view/frontend/templates/advanced/result.phtml +++ b/app/code/Magento/CatalogSearch/view/frontend/templates/advanced/result.phtml @@ -23,7 +23,7 @@ <?php else: ?> <div class="message error"> <div> - <?php echo __('No items were found using the following search criteria.');?> <a href="<?php echo $block->getFormUrl(); ?>"><?php echo __('Modify your search'); ?></a> + <?php echo __('We can\'t find any items matching these search criteria.');?> <a href="<?php echo $block->getFormUrl(); ?>"><?php echo __('Modify your search'); ?></a> </div> </div> <?php endif; ?> diff --git a/app/code/Magento/CatalogSearch/view/frontend/templates/result.phtml b/app/code/Magento/CatalogSearch/view/frontend/templates/result.phtml index 9f1c2cec4bc834afde596c0533d7f635f0cd3420..92fe9a3e3c1a6bffa512cf9db299cef7847ceba1 100644 --- a/app/code/Magento/CatalogSearch/view/frontend/templates/result.phtml +++ b/app/code/Magento/CatalogSearch/view/frontend/templates/result.phtml @@ -25,7 +25,7 @@ <div class="message notice"> <div> - <?php echo($block->getNoResultText()) ? $block->getNoResultText() : __('Your search returns no results.') ?> + <?php echo($block->getNoResultText()) ? $block->getNoResultText() : __('Your search returned no results.') ?> <?php echo $block->getAdditionalHtml() ?> <?php if ($messages = $block->getNoteMessages()):?> <?php foreach ($messages as $message):?> diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php index 7394a876366be2966e0ab7a98ca08b7fb0c20af2..0775d1866a45a30aeed2b94c0899757e2481bd06 100644 --- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php @@ -8,7 +8,9 @@ namespace Magento\Checkout\Block\Cart\Item; +use Magento\Checkout\Block\Cart\Item\Renderer\Actions; use Magento\Framework\Pricing\PriceCurrencyInterface; +use Magento\Framework\View\Element\AbstractBlock; use Magento\Quote\Model\Quote\Item; use Magento\Catalog\Pricing\Price\ConfiguredPriceInterface; @@ -120,10 +122,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Set item for render * - * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item + * @param Item $item * @return $this */ - public function setItem(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function setItem(Item $item) { $this->_item = $item; return $this; @@ -316,19 +318,6 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage return $this->getProductOptions(); } - /** - * Get item configure url - * - * @return string - */ - public function getConfigureUrl() - { - return $this->getUrl( - 'checkout/cart/configure', - ['id' => $this->getItem()->getId(), 'product_id' => $this->getItem()->getProduct()->getId()] - ); - } - /** * Get quote item qty * @@ -432,7 +421,7 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Return product additional information block * - * @return \Magento\Framework\View\Element\AbstractBlock + * @return AbstractBlock */ public function getProductAdditionalInformationBlock() { @@ -529,10 +518,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Return the unit price html * - * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item + * @param Item $item * @return string */ - public function getUnitPriceHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getUnitPriceHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.item.price.unit'); @@ -543,10 +532,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Return row total html * - * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item + * @param Item $item * @return string */ - public function getRowTotalHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getRowTotalHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.item.price.row'); @@ -557,10 +546,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Return item price html for sidebar * - * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item + * @param Item $item * @return string */ - public function getSidebarItemPriceHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getSidebarItemPriceHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.cart.item.price.sidebar'); @@ -571,10 +560,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Get unit price excluding tax html * - * @param Item\AbstractItem $item + * @param Item $item * @return string */ - public function getUnitPriceExclTaxHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getUnitPriceExclTaxHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.onepage.review.item.price.unit.excl'); @@ -585,10 +574,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Get unit price including tax html * - * @param Item\AbstractItem $item + * @param Item $item * @return string */ - public function getUnitPriceInclTaxHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getUnitPriceInclTaxHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.onepage.review.item.price.unit.incl'); @@ -599,10 +588,10 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Get row total excluding tax html * - * @param Item\AbstractItem $item + * @param Item $item * @return string */ - public function getRowTotalExclTaxHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getRowTotalExclTaxHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.onepage.review.item.price.rowtotal.excl'); @@ -613,14 +602,32 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage /** * Get row total including tax html * - * @param Item\AbstractItem $item + * @param Item $item * @return string */ - public function getRowTotalInclTaxHtml(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getRowTotalInclTaxHtml(Item $item) { /** @var Renderer $block */ $block = $this->getLayout()->getBlock('checkout.onepage.review.item.price.rowtotal.incl'); $block->setItem($item); return $block->toHtml(); } + + /** + * Get row total including tax html + * + * @param Item $item + * @return string + */ + public function getActions(Item $item) + { + /** @var Actions $block */ + $block = $this->getChildBlock('actions'); + if ($block instanceof Actions) { + $block->setItem($item); + return $block->toHtml(); + } else { + return ''; + } + } } diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php new file mode 100644 index 0000000000000000000000000000000000000000..e3d27d82677a2e7a925f5211b2563462cf69f5a4 --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php @@ -0,0 +1,62 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Block\Cart\Item\Renderer; + +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Framework\View\Element\Text; +use Magento\Quote\Model\Quote\Item; + +class Actions extends Text +{ + /** + * @var Item + */ + protected $item; + + /** + * Returns current quote item + * + * @return Item + */ + public function getItem() + { + return $this->item; + } + + /** + * Set current quote item + * + * @param Item $item + * @return $this + */ + public function setItem(Item $item) + { + $this->item = $item; + return $this; + } + + /** + * Render html output + * + * @return string + */ + protected function _toHtml() + { + $this->setText(''); + + $layout = $this->getLayout(); + foreach ($this->getChildNames() as $child) { + /** @var Generic $childBlock */ + $childBlock = $layout->getBlock($child); + if ($childBlock instanceof Generic) { + $childBlock->setItem($this->getItem()); + $this->addText($layout->renderElement($child, false)); + } + } + + return parent::_toHtml(); + } +} diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Edit.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Edit.php new file mode 100644 index 0000000000000000000000000000000000000000..39cd103a9ee82c191dfb93b696a8df07251925f3 --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Edit.php @@ -0,0 +1,25 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Block\Cart\Item\Renderer\Actions; + +class Edit extends Generic +{ + /** + * Get item configure url + * + * @return string + */ + public function getConfigureUrl() + { + return $this->getUrl( + 'checkout/cart/configure', + [ + 'id' => $this->getItem()->getId(), + 'product_id' => $this->getItem()->getProduct()->getId() + ] + ); + } +} diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php new file mode 100644 index 0000000000000000000000000000000000000000..6ce4f2eb87a700f63b29e6b21c228559a3a782b2 --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php @@ -0,0 +1,59 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Block\Cart\Item\Renderer\Actions; + +use Magento\Framework\View\Element\Template; +use Magento\Quote\Model\Quote\Item; + +class Generic extends Template +{ + /** + * @var Item + */ + protected $item; + + /** + * Returns current quote item + * + * @return Item + */ + public function getItem() + { + return $this->item; + } + + /** + * Set current quote item + * + * @param Item $item + * @return $this + */ + public function setItem(Item $item) + { + $this->item = $item; + return $this; + } + + /** + * Check if product is visible in site visibility + * + * @return bool + */ + public function isProductVisibleInSiteVisibility() + { + return $this->getItem()->getProduct()->isVisibleInSiteVisibility(); + } + + /** + * Check if cart item is virtual + * + * @return bool + */ + public function isVirtual() + { + return (bool)$this->getItem()->getIsVirtual(); + } +} diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Remove.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Remove.php new file mode 100644 index 0000000000000000000000000000000000000000..066afb6a0822335c35069b35d227fa36ae86f19b --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Remove.php @@ -0,0 +1,41 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Block\Cart\Item\Renderer\Actions; + +use Magento\Checkout\Helper\Cart; +use Magento\Framework\View\Element\Template; + +class Remove extends Generic +{ + /** + * @var Cart + */ + protected $cartHelper; + + /** + * @param Template\Context $context + * @param Cart $cartHelper + * @param array $data + */ + public function __construct( + Template\Context $context, + Cart $cartHelper, + array $data = [] + ) { + $this->cartHelper = $cartHelper; + parent::__construct($context, $data); + } + + /** + * Get delete item POST JSON + * + * @return string + */ + public function getDeletePostJson() + { + return $this->cartHelper->getDeletePostJson($this->getItem()); + } +} diff --git a/app/code/Magento/Checkout/Block/Cart/Shipping.php b/app/code/Magento/Checkout/Block/Cart/Shipping.php index 8cf93dd33eaa66b2e65598029299152b508dc991..fd79502fbcb0d30195e19be88f619b2f7491c56c 100644 --- a/app/code/Magento/Checkout/Block/Cart/Shipping.php +++ b/app/code/Magento/Checkout/Block/Cart/Shipping.php @@ -5,8 +5,16 @@ */ namespace Magento\Checkout\Block\Cart; +use Magento\Customer\Api\AddressRepositoryInterface; +use Magento\Customer\Api\CustomerRepositoryInterface; use Magento\Framework\Pricing\PriceCurrencyInterface; +use Magento\Quote\Api\Data\EstimateAddressInterfaceFactory; +use Magento\Quote\Api\ShippingMethodManagementInterface; +use Magento\Quote\Model\QuoteRepository; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart { /** @@ -43,6 +51,31 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart */ protected $priceCurrency; + /** + * @var EstimateAddressInterfaceFactory + */ + protected $estimatedAddressFactory; + + /** + * @var ShippingMethodManagementInterface + */ + protected $shippingMethodManager; + + /** + * @var AddressRepositoryInterface + */ + protected $addressRepository; + + /** + * @var CustomerRepositoryInterface + */ + protected $customerRepository; + + /** + * @var QuoteRepository + */ + protected $quoteRepository; + /** * @param \Magento\Framework\View\Element\Template\Context $context * @param \Magento\Customer\Model\Session $customerSession @@ -50,7 +83,13 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart * @param \Magento\Directory\Block\Data $directoryBlock * @param \Magento\Shipping\Model\CarrierFactoryInterface $carrierFactory * @param PriceCurrencyInterface $priceCurrency + * @param EstimateAddressInterfaceFactory $estimatedAddressFactory + * @param ShippingMethodManagementInterface $shippingMethodManager + * @param AddressRepositoryInterface $addressRepository + * @param CustomerRepositoryInterface $customerRepository + * @param QuoteRepository $quoteRepository * @param array $data + * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( \Magento\Framework\View\Element\Template\Context $context, @@ -59,11 +98,21 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart \Magento\Directory\Block\Data $directoryBlock, \Magento\Shipping\Model\CarrierFactoryInterface $carrierFactory, PriceCurrencyInterface $priceCurrency, + EstimateAddressInterfaceFactory $estimatedAddressFactory, + ShippingMethodManagementInterface $shippingMethodManager, + AddressRepositoryInterface $addressRepository, + CustomerRepositoryInterface $customerRepository, + QuoteRepository $quoteRepository, array $data = [] ) { $this->priceCurrency = $priceCurrency; $this->_directoryBlock = $directoryBlock; $this->_carrierFactory = $carrierFactory; + $this->estimatedAddressFactory = $estimatedAddressFactory; + $this->shippingMethodManager = $shippingMethodManager; + $this->addressRepository = $addressRepository; + $this->customerRepository = $customerRepository; + $this->quoteRepository = $quoteRepository; parent::__construct($context, $customerSession, $checkoutSession, $data); $this->_isScopePrivate = true; } @@ -309,4 +358,39 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart $block->setShippingRate($shippingRate); return $block->toHtml(); } + + /** + * {@inheritDoc} + */ + protected function _beforeToHtml() + { + if ($this->_customerSession->isLoggedIn()) { + $customer = $this->customerRepository->getById($this->_customerSession->getCustomerId()); + if ($defaultShipping = $customer->getDefaultShipping()) { + $address = $this->addressRepository->getById($defaultShipping); + if ($address) { + /** @var \Magento\Quote\Api\Data\EstimateAddressInterface $estimatedAddress */ + $estimatedAddress = $this->estimatedAddressFactory->create(); + $estimatedAddress->setCountryId($address->getCountryId()); + $estimatedAddress->setPostcode($address->getPostcode()); + $estimatedAddress->setRegion((string)$address->getRegion()->getRegion()); + $estimatedAddress->setRegionId($address->getRegionId()); + $this->shippingMethodManager->estimateByAddress($this->getQuote()->getId(), $estimatedAddress); + $this->quoteRepository->save($this->getQuote()); + } + } + } + return parent::_beforeToHtml(); + } + + /** + * Check if multiple countries for shipping is allowed + * + * @return bool + */ + public function isMultipleCountriesAllowed() + { + $collection = $this->_directoryBlock->getCountryCollection(); + return $collection->count() > 1 ? true : false; + } } diff --git a/app/code/Magento/Checkout/Controller/Cart/Add.php b/app/code/Magento/Checkout/Controller/Cart/Add.php index 6bf5cecdfb0e35c6b36a09ca4bebf6bd254cd88d..05bafe1daa1ae6d614fadff393de49607e1194ba 100644 --- a/app/code/Magento/Checkout/Controller/Cart/Add.php +++ b/app/code/Magento/Checkout/Controller/Cart/Add.php @@ -147,7 +147,7 @@ class Add extends \Magento\Checkout\Controller\Cart return $this->goBack($url); } catch (\Exception $e) { - $this->messageManager->addException($e, __('We cannot add this item to your shopping cart')); + $this->messageManager->addException($e, __('We can\'t add this item to your shopping cart right now.')); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); return $this->goBack(); } diff --git a/app/code/Magento/Checkout/Controller/Cart/Addgroup.php b/app/code/Magento/Checkout/Controller/Cart/Addgroup.php index f3f8a349b6a80948ca037c6387c91c10aec3bf71..44260ba75a5d65255dc1f640cd1fff94be97e825 100644 --- a/app/code/Magento/Checkout/Controller/Cart/Addgroup.php +++ b/app/code/Magento/Checkout/Controller/Cart/Addgroup.php @@ -30,7 +30,10 @@ class Addgroup extends \Magento\Checkout\Controller\Cart $this->messageManager->addError($e->getMessage()); } } catch (\Exception $e) { - $this->messageManager->addException($e, __('We cannot add this item to your shopping cart')); + $this->messageManager->addException( + $e, + __('We can\'t add this item to your shopping cart right now.') + ); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); return $this->_goBack(); } diff --git a/app/code/Magento/Checkout/Controller/Cart/CouponPost.php b/app/code/Magento/Checkout/Controller/Cart/CouponPost.php index 81f7631db4ebde05b039b202242ec6876aee3551..1562c3fc54ebdba84714072bd580e378c6d9fca2 100644 --- a/app/code/Magento/Checkout/Controller/Cart/CouponPost.php +++ b/app/code/Magento/Checkout/Controller/Cart/CouponPost.php @@ -80,7 +80,7 @@ class CouponPost extends \Magento\Checkout\Controller\Cart if ($isCodeLengthValid && $couponCode == $this->cart->getQuote()->getCouponCode()) { $this->messageManager->addSuccess( __( - 'The coupon code "%1" was applied.', + 'You used coupon code "%1".', $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($couponCode) ) ); @@ -94,7 +94,7 @@ class CouponPost extends \Magento\Checkout\Controller\Cart $this->cart->save(); } } else { - $this->messageManager->addSuccess(__('The coupon code was canceled.')); + $this->messageManager->addSuccess(__('You canceled the coupon code.')); } } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); diff --git a/app/code/Magento/Checkout/Controller/Cart/Delete.php b/app/code/Magento/Checkout/Controller/Cart/Delete.php index 8b5e2da9ce319ecd52b5d8d6302c0d5b83189a23..3d73a5f0c205a8ec950b088f67d5f3438708f9d9 100644 --- a/app/code/Magento/Checkout/Controller/Cart/Delete.php +++ b/app/code/Magento/Checkout/Controller/Cart/Delete.php @@ -20,7 +20,7 @@ class Delete extends \Magento\Checkout\Controller\Cart try { $this->cart->removeItem($id)->save(); } catch (\Exception $e) { - $this->messageManager->addError(__('We cannot remove the item.')); + $this->messageManager->addError(__('We can\'t remove the item.')); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } } diff --git a/app/code/Magento/Checkout/Controller/Cart/UpdateItemOptions.php b/app/code/Magento/Checkout/Controller/Cart/UpdateItemOptions.php index 83b569541117f680ff951809eeffe95b288fe7c5..f8519d2ee57f922d23fc8fc56ab6d366e0113ba0 100644 --- a/app/code/Magento/Checkout/Controller/Cart/UpdateItemOptions.php +++ b/app/code/Magento/Checkout/Controller/Cart/UpdateItemOptions.php @@ -86,7 +86,7 @@ class UpdateItemOptions extends \Magento\Checkout\Controller\Cart return $this->resultRedirectFactory->create()->setUrl($this->_redirect->getRedirectUrl($cartUrl)); } } catch (\Exception $e) { - $this->messageManager->addException($e, __('We cannot update the item.')); + $this->messageManager->addException($e, __('We can\'t update the item right now.')); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); return $this->_goBack(); } diff --git a/app/code/Magento/Checkout/Controller/Cart/UpdatePost.php b/app/code/Magento/Checkout/Controller/Cart/UpdatePost.php index 31d94cb623031c751834ec5e49b38259eaf820ed..324cd788a97bb2e3f544b7881c4962a4f79a5918 100644 --- a/app/code/Magento/Checkout/Controller/Cart/UpdatePost.php +++ b/app/code/Magento/Checkout/Controller/Cart/UpdatePost.php @@ -23,7 +23,7 @@ class UpdatePost extends \Magento\Checkout\Controller\Cart } catch (\Magento\Framework\Exception\LocalizedException $exception) { $this->messageManager->addError($exception->getMessage()); } catch (\Exception $exception) { - $this->messageManager->addException($exception, __('We cannot update the shopping cart.')); + $this->messageManager->addException($exception, __('We can\'t update the shopping cart.')); } } @@ -57,7 +57,7 @@ class UpdatePost extends \Magento\Checkout\Controller\Cart $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($e->getMessage()) ); } catch (\Exception $e) { - $this->messageManager->addException($e, __('We cannot update the shopping cart.')); + $this->messageManager->addException($e, __('We can\'t update the shopping cart.')); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } } diff --git a/app/code/Magento/Checkout/Controller/Onepage/Index.php b/app/code/Magento/Checkout/Controller/Onepage/Index.php index 5e16fbd5f2f01e44e5a21d625aa72adc280a2d10..991511fc02267a4d6a250fb78576b0feaa08ad14 100644 --- a/app/code/Magento/Checkout/Controller/Onepage/Index.php +++ b/app/code/Magento/Checkout/Controller/Onepage/Index.php @@ -16,7 +16,7 @@ class Index extends \Magento\Checkout\Controller\Onepage public function execute() { if (!$this->_objectManager->get('Magento\Checkout\Helper\Data')->canOnepageCheckout()) { - $this->messageManager->addError(__('The onepage checkout is disabled.')); + $this->messageManager->addError(__('One-page checkout is turned off.')); return $this->resultRedirectFactory->create()->setPath('checkout/cart'); } $quote = $this->getOnepage()->getQuote(); diff --git a/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php b/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php index 205174f25e2e45f29e4dd4549017be97d74f7df2..6ded4bb23236587772dfb218a1faf76e1ee4e010 100644 --- a/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php +++ b/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php @@ -113,7 +113,7 @@ class SaveOrder extends \Magento\Checkout\Controller\Onepage $result->setData('error', true); $result->setData( 'error_messages', - __('Something went wrong processing your order. Please try again later.') + __('Something went wrong while processing your order. Please try again later.') ); } /** diff --git a/app/code/Magento/Checkout/Model/Cart.php b/app/code/Magento/Checkout/Model/Cart.php index 0762ae9e18e9c24e0e1cbb91a32c41d4834168fc..e0d633415a103832fbd71796725dcc6020db7533 100644 --- a/app/code/Magento/Checkout/Model/Cart.php +++ b/app/code/Magento/Checkout/Model/Cart.php @@ -517,7 +517,7 @@ class Cart extends Object implements CartInterface if ($qtyRecalculatedFlag) { $this->messageManager->addNotice( - __('Some products quantities were recalculated because of quantity increment mismatch.') + __('We adjusted product quantities to fit the required increments.') ); } diff --git a/app/code/Magento/Checkout/Model/Type/Onepage.php b/app/code/Magento/Checkout/Model/Type/Onepage.php index ff24c18f2be2820b06edf2540f211f2e8a90958a..dae0433f518ad6d159a555a88a883ec78dc516cf 100644 --- a/app/code/Magento/Checkout/Model/Type/Onepage.php +++ b/app/code/Magento/Checkout/Model/Type/Onepage.php @@ -449,7 +449,7 @@ class Onepage 'error' => 1, // @codingStandardsIgnoreStart 'message' => __( - 'There is already a registered customer using this email address. Please log in using this email address or enter a different email address to register your account.' + 'This email address already belongs to a registered customer. You can sign in or create an account with a different email address.' ) // @codingStandardsIgnoreEnd ]; @@ -783,11 +783,13 @@ class Onepage $quote = $this->getQuote(); if ($quote->isMultipleShippingAddresses()) { - throw new \Magento\Framework\Exception\LocalizedException(__('There are more than one shipping address.')); + throw new \Magento\Framework\Exception\LocalizedException( + __('There are more than one shipping addresses.') + ); } if ($quote->getCheckoutMethod() == self::METHOD_GUEST && !$this->_helper->isAllowedGuestCheckout($quote)) { - throw new \Magento\Framework\Exception\LocalizedException(__('Sorry, guest checkout is not enabled.')); + throw new \Magento\Framework\Exception\LocalizedException(__('Sorry, guest checkout is not available.')); } } @@ -907,7 +909,7 @@ class Onepage $this->messageManager->addSuccess( // @codingStandardsIgnoreStart __( - 'Account confirmation is required. Please, check your e-mail for confirmation link. To resend confirmation email please <a href="%1">click here</a>.', + 'You must confirm your account. Please check your email for the confirmation link or <a href="%1">click here</a> for a new link.', $url ) // @codingStandardsIgnoreEnd diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/EditTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/EditTest.php new file mode 100644 index 0000000000000000000000000000000000000000..122e8c85909b95a459b6578567d17922681fa113 --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/EditTest.php @@ -0,0 +1,77 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\Catalog\Model\Product; +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit; +use Magento\Quote\Model\Quote\Item; + +class EditTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Edit + */ + protected $model; + + /** @var \Magento\Framework\UrlInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $urlBuilderMock; + + protected function setUp() + { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->urlBuilderMock = $this->getMockBuilder('Magento\Framework\UrlInterface') + ->disableOriginalConstructor() + ->getMock(); + + $this->model = $objectManagerHelper->getObject( + 'Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit', + [ + 'urlBuilder' => $this->urlBuilderMock, + ] + ); + } + + public function testGetConfigureUrl() + { + $itemId = 45; + $productId = 12; + $configureUrl = 'configure url'; + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + /** + * @var Product|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->getMock(); + + $itemMock->expects($this->once()) + ->method('getProduct') + ->willReturn($productMock); + $itemMock->expects($this->once()) + ->method('getId') + ->willReturn($itemId); + + $productMock->expects($this->once()) + ->method('getId') + ->willReturn($productId); + + $this->urlBuilderMock->expects($this->once()) + ->method('getUrl') + ->with('checkout/cart/configure', ['id' => $itemId, 'product_id' => $productId]) + ->willReturn($configureUrl); + + $this->model->setItem($itemMock); + $this->assertEquals($configureUrl, $this->model->getConfigureUrl()); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/GenericTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/GenericTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d6c6f0824c67b3b50c1fd7aaa88e2c224e3f61c5 --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/GenericTest.php @@ -0,0 +1,87 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\Catalog\Model\Product; +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Quote\Model\Quote\Item; + +class GenericTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Generic + */ + protected $model; + + protected function setUp() + { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->model = $objectManagerHelper->getObject( + 'Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic', + [] + ); + } + + public function testGetItem() + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $this->assertEquals($this->model, $this->model->setItem($itemMock)); + $this->assertEquals($itemMock, $this->model->getItem()); + } + + public function testIsProductVisibleInSiteVisibility() + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + /** + * @var Product|\PHPUnit_Framework_MockObject_MockObject $productMock + */ + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->getMock(); + + $itemMock->expects($this->once()) + ->method('getProduct') + ->willReturn($productMock); + + $productMock->expects($this->once()) + ->method('isVisibleInSiteVisibility') + ->willReturn(true); + + $this->assertEquals($this->model, $this->model->setItem($itemMock)); + $this->assertTrue($this->model->isProductVisibleInSiteVisibility()); + } + + public function testIsVirtual() + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->setMethods(['getIsVirtual']) + ->getMock(); + + $itemMock->expects($this->once()) + ->method('getIsVirtual') + ->willReturn(true); + + $this->assertEquals($this->model, $this->model->setItem($itemMock)); + $this->assertTrue($this->model->isVirtual()); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/RemoveTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/RemoveTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d2ebb0637ea9df67ed0d6846f48694b8b1ac9faf --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/RemoveTest.php @@ -0,0 +1,57 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove; +use Magento\Checkout\Helper\Cart; +use Magento\Quote\Model\Quote\Item; + +class RemoveTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Remove + */ + protected $model; + + /** @var Cart|\PHPUnit_Framework_MockObject_MockObject */ + protected $cartHelperMock; + + protected function setUp() + { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->cartHelperMock = $this->getMockBuilder('Magento\Checkout\Helper\Cart') + ->disableOriginalConstructor() + ->getMock(); + + $this->model = $objectManagerHelper->getObject( + 'Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove', + [ + 'cartHelper' => $this->cartHelperMock, + ] + ); + } + + public function testGetConfigureUrl() + { + $json = '{json;}'; + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $this->cartHelperMock->expects($this->once()) + ->method('getDeletePostJson') + ->with($itemMock) + ->willReturn($json); + + $this->model->setItem($itemMock); + $this->assertEquals($json, $this->model->getDeletePostJson()); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ActionsTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ActionsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..514648f0a8c6037acac41ffcd9b0519449fe376f --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ActionsTest.php @@ -0,0 +1,110 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Test\Unit\Block\Cart\Item\Renderer; + +use Magento\Checkout\Block\Cart\Item\Renderer\Actions; +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Quote\Model\Quote\Item; + +class ActionsTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Actions + */ + protected $model; + + /** + * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $scopeConfigMock; + + /** + * @var \Magento\Framework\View\LayoutInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $layoutMock; + + protected function setUp() + { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->scopeConfigMock = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') + ->getMockForAbstractClass(); + + $this->layoutMock = $this->getMockBuilder('Magento\Framework\View\LayoutInterface') + ->getMockForAbstractClass(); + + $this->model = $objectManagerHelper->getObject( + 'Magento\Checkout\Block\Cart\Item\Renderer\Actions', + [ + 'scopeConfig' => $this->scopeConfigMock, + 'layout' => $this->layoutMock, + ] + ); + } + + public function testGetItem() + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $this->assertEquals($this->model, $this->model->setItem($itemMock)); + $this->assertEquals($itemMock, $this->model->getItem()); + } + + public function testToHtml() + { + $childNameOne = 'child.1'; + $childNameTextOne = 'child.1 text'; + $childNameTwo = 'child.2'; + $childNames = [$childNameOne, $childNameTwo]; + + $this->scopeConfigMock->expects($this->once()) + ->method('getValue') + ->willReturn(false); + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + $this->model->setItem($itemMock); + + $this->layoutMock->expects($this->once()) + ->method('getChildNames') + ->with($this->model->getNameInLayout()) + ->willReturn($childNames); + + /** @var Generic|\PHPUnit_Framework_MockObject_MockObject $childMockOne */ + $childMockOne = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic') + ->disableOriginalConstructor() + ->getMock(); + $childMockOne->expects($this->once()) + ->method('setItem') + ->with($itemMock); + + $childMockTwo = false; + + $this->layoutMock->expects($this->once()) + ->method('renderElement') + ->with($childNameOne, false) + ->willReturn($childNameTextOne); + $this->layoutMock->expects($this->exactly(2)) + ->method('getBlock') + ->willReturnMap( + [ + [$childNameOne, $childMockOne], + [$childNameTwo, $childMockTwo], + ] + ); + + $this->assertEquals($childNameTextOne, $this->model->toHtml()); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/RendererTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/RendererTest.php index 575eebc4188964d8eb8365f41068006d263e5e6f..0796e0f6363fc2448164178f869b27cb7bc2f6c9 100644 --- a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/RendererTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/RendererTest.php @@ -5,7 +5,8 @@ */ namespace Magento\Checkout\Test\Unit\Block\Cart\Item; -use \Magento\Checkout\Block\Cart\Item\Renderer; +use Magento\Checkout\Block\Cart\Item\Renderer; +use Magento\Quote\Model\Quote\Item; class RendererTest extends \PHPUnit_Framework_TestCase { @@ -42,7 +43,7 @@ class RendererTest extends \PHPUnit_Framework_TestCase 'Magento\Checkout\Block\Cart\Item\Renderer', [ 'imageHelper' => $this->_imageHelper, - 'context' => $context + 'context' => $context, ] ); } @@ -89,7 +90,7 @@ class RendererTest extends \PHPUnit_Framework_TestCase ); $product->expects($this->any())->method('getName')->will($this->returnValue('Parent Product')); - /** @var \Magento\Quote\Model\Quote\Item|\PHPUnit_Framework_MockObject_MockObject $item */ + /** @var Item|\PHPUnit_Framework_MockObject_MockObject $item */ $item = $this->getMock('Magento\Quote\Model\Quote\Item', [], [], '', false); $item->expects($this->any())->method('getProduct')->will($this->returnValue($product)); @@ -147,4 +148,59 @@ class RendererTest extends \PHPUnit_Framework_TestCase $this->assertEquals($priceHtml, $this->_renderer->getProductPriceHtml($product)); } + + public function testGetActions() + { + $blockNameInLayout = 'block.name'; + $blockHtml = 'block html'; + + /** + * @var \Magento\Checkout\Block\Cart\Item\Renderer\Actions|\PHPUnit_Framework_MockObject_MockObject $blockMock + */ + $blockMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Actions') + ->disableOriginalConstructor() + ->getMock(); + + $this->layout->expects($this->once()) + ->method('getChildName') + ->with($this->_renderer->getNameInLayout(), 'actions') + ->willReturn($blockNameInLayout); + $this->layout->expects($this->once()) + ->method('getBlock') + ->with($blockNameInLayout) + ->willReturn($blockMock); + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $blockMock->expects($this->once()) + ->method('setItem') + ->with($itemMock); + $blockMock->expects($this->once()) + ->method('toHtml') + ->willReturn($blockHtml); + + $this->assertEquals($blockHtml, $this->_renderer->getActions($itemMock)); + } + + public function testGetActionsWithNoBlock() + { + $this->layout->expects($this->once()) + ->method('getChildName') + ->with($this->_renderer->getNameInLayout(), 'actions') + ->willReturn(false); + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $this->assertEquals('', $this->_renderer->getActions($itemMock)); + } } diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php index fcb3e58c804dc897df014041384246218b4c2703..13fbfbc990be11852eef14ff41ee0bcbcc708484 100644 --- a/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php @@ -5,16 +5,217 @@ */ namespace Magento\Checkout\Test\Unit\Block\Cart; +use Magento\Checkout\Block\Cart\Shipping; +use Magento\Checkout\Model\Session as CheckoutSession; +use Magento\Customer\Api\AddressRepositoryInterface; +use Magento\Customer\Api\CustomerRepositoryInterface; +use Magento\Customer\Api\Data\AddressInterface; +use Magento\Customer\Model\Session as CustomerSession; +use Magento\Directory\Block\Data as DirectoryData; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\Event\ManagerInterface as EventManager; +use Magento\Framework\Pricing\PriceCurrencyInterface; +use Magento\Framework\View\Element\Template\Context; +use Magento\Framework\View\Layout; +use Magento\Quote\Api\Data\EstimateAddressInterface; +use Magento\Quote\Api\Data\EstimateAddressInterfaceFactory; +use Magento\Quote\Api\ShippingMethodManagementInterface; +use Magento\Quote\Model\Quote; +use Magento\Quote\Model\QuoteRepository; +use Magento\Shipping\Model\CarrierFactoryInterface; +use Magento\Store\Model\ScopeInterface; + +/** + * @SuppressWarnings(PHPMD.TooManyFields) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class ShippingTest extends \PHPUnit_Framework_TestCase { - /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ - protected $objectManager; + /** @var Shipping */ + protected $model; + + /** @var Context |\PHPUnit_Framework_MockObject_MockObject */ + protected $context; + + /** @var CustomerSession |\PHPUnit_Framework_MockObject_MockObject */ + protected $customerSession; + + /** @var CheckoutSession |\PHPUnit_Framework_MockObject_MockObject */ + protected $checkoutSession; + + /** @var DirectoryData |\PHPUnit_Framework_MockObject_MockObject */ + protected $directoryData; + + /** @var CarrierFactoryInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $carrierFactory; + + /** @var PriceCurrencyInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $priceCurrency; + + /** @var EstimateAddressInterfaceFactory |\PHPUnit_Framework_MockObject_MockObject */ + protected $estimatedAddressFactory; + + /** @var ShippingMethodManagementInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $shippingMethodManager; + + /** @var AddressRepositoryInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $addressReporitory; + + /** @var CustomerRepositoryInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $customerRepository; + + /** @var QuoteRepository |\PHPUnit_Framework_MockObject_MockObject */ + protected $quoteRepository; - protected $shippingBlock; + /** @var Layout |\PHPUnit_Framework_MockObject_MockObject */ + protected $layout; + + /** @var EventManager |\PHPUnit_Framework_MockObject_MockObject */ + protected $eventManager; + + /** @var ScopeConfigInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $scopeConfig; + + /** @var EstimateAddressInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $estimatedAddress; + + /** @var AddressInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $address; + + /** @var Quote |\PHPUnit_Framework_MockObject_MockObject */ + protected $quote; protected function setUp() { - $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->prepareContext(); + + $this->customerSession = $this->getMockBuilder('Magento\Customer\Model\Session') + ->disableOriginalConstructor() + ->getMock(); + + $this->checkoutSession = $this->getMockBuilder('Magento\Checkout\Model\Session') + ->disableOriginalConstructor() + ->getMock(); + + $this->directoryData = $this->getMockBuilder('Magento\Directory\Block\Data') + ->disableOriginalConstructor() + ->getMock(); + + $this->carrierFactory = $this->getMockBuilder('Magento\Shipping\Model\CarrierFactoryInterface') + ->getMockForAbstractClass(); + + $this->priceCurrency = $this->getMockBuilder('Magento\Framework\Pricing\PriceCurrencyInterface') + ->getMockForAbstractClass(); + + $this->prepareEstimatedAddress(); + + $this->shippingMethodManager = $this->getMockBuilder('Magento\Quote\Api\ShippingMethodManagementInterface') + ->getMockForAbstractClass(); + + $this->prepareAddressRepository(); + + $this->customerRepository = $this->getMockBuilder('Magento\Customer\Api\CustomerRepositoryInterface') + ->getMockForAbstractClass(); + + $this->prepareQuoteRepository(); + + $this->model = new Shipping( + $this->context, + $this->customerSession, + $this->checkoutSession, + $this->directoryData, + $this->carrierFactory, + $this->priceCurrency, + $this->estimatedAddressFactory, + $this->shippingMethodManager, + $this->addressReporitory, + $this->customerRepository, + $this->quoteRepository + ); + } + + protected function prepareContext() + { + $this->layout = $this->getMockBuilder('Magento\Framework\View\Layout') + ->disableOriginalConstructor() + ->getMock(); + + $this->eventManager = $this->getMockBuilder('Magento\Framework\Event\ManagerInterface') + ->setMethods([ + 'dispatch', + ]) + ->getMockForAbstractClass(); + + $this->scopeConfig = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') + ->setMethods([ + 'getValue', + ]) + ->getMockForAbstractClass(); + + $this->context = $this->getMockBuilder('Magento\Framework\View\Element\Template\Context') + ->disableOriginalConstructor() + ->getMock(); + + $this->context->expects($this->once()) + ->method('getLayout') + ->will($this->returnValue($this->layout)); + + $this->context->expects($this->once()) + ->method('getEventManager') + ->will($this->returnValue($this->eventManager)); + + $this->context->expects($this->once()) + ->method('getScopeConfig') + ->will($this->returnValue($this->scopeConfig)); + } + + protected function prepareEstimatedAddress() + { + $this->estimatedAddress = $this->getMockBuilder('Magento\Quote\Api\Data\EstimateAddressInterface') + ->setMethods([ + 'setCountryId', + 'setPostcode', + 'setRegion', + 'setRegionId', + ]) + ->getMockForAbstractClass(); + + $this->estimatedAddressFactory = $this->getMockBuilder('Magento\Quote\Api\Data\EstimateAddressInterfaceFactory') + ->disableOriginalConstructor() + ->setMethods([ + 'create', + ]) + ->getMock(); + + $this->estimatedAddressFactory->expects($this->any()) + ->method('create') + ->willReturn($this->estimatedAddress); + } + + protected function prepareAddressRepository() + { + $this->address = $this->getMockBuilder('Magento\Customer\Api\Data\AddressInterface') + ->setMethods([ + 'getCountryId', + 'getPostcode', + 'getRegion', + 'getRegionId', + ]) + ->getMockForAbstractClass(); + + $this->addressReporitory = $this->getMockBuilder('Magento\Customer\Api\AddressRepositoryInterface') + ->getMockForAbstractClass(); + } + + protected function prepareQuoteRepository() + { + $this->quoteRepository = $this->getMockBuilder('Magento\Quote\Model\QuoteRepository') + ->disableOriginalConstructor() + ->getMock(); + + $this->quote = $this->getMockBuilder('Magento\Quote\Model\Quote') + ->disableOriginalConstructor() + ->getMock(); } public function testGetShippingPriceHtml() @@ -38,30 +239,234 @@ class ShippingTest extends \PHPUnit_Framework_TestCase ->method('toHtml') ->will($this->returnValue($shippingPriceHtml)); - $layoutMock = $this->getMockBuilder('\Magento\Framework\View\Layout') - ->disableOriginalConstructor() - ->getMock(); - - $layoutMock->expects($this->once()) + $this->layout->expects($this->once()) ->method('getBlock') ->with('checkout.shipping.price') ->will($this->returnValue($priceBlockMock)); - $contextMock = $this->getMockBuilder('\Magento\Framework\View\Element\Template\Context') + $this->assertEquals($shippingPriceHtml, $this->model->getShippingPriceHtml($shippingRateMock)); + } + + public function testBeforeToHtmlCustomerNotLoggedIn() + { + $this->eventManager->expects($this->once()) + ->method('dispatch') + ->with('view_block_abstract_to_html_before', ['block' => $this->model]) + ->willReturnSelf(); + + $this->scopeConfig->expects($this->once()) + ->method('getValue') + ->with('advanced/modules_disable_output/Magento_Checkout', ScopeInterface::SCOPE_STORE) + ->willReturn(false); + + $this->customerSession->expects($this->once()) + ->method('isLoggedIn') + ->willReturn(false); + + $this->assertEquals('', $this->model->toHtml()); + } + + public function testBeforeToHtmlNoDefaultShippingAddress() + { + $customerId = 1; + $defaultShipping = 0; + + $this->eventManager->expects($this->once()) + ->method('dispatch') + ->with('view_block_abstract_to_html_before', ['block' => $this->model]) + ->willReturnSelf(); + + $this->scopeConfig->expects($this->once()) + ->method('getValue') + ->with('advanced/modules_disable_output/Magento_Checkout', ScopeInterface::SCOPE_STORE) + ->willReturn(false); + + $this->customerSession->expects($this->once()) + ->method('isLoggedIn') + ->willReturn(true); + $this->customerSession->expects($this->once()) + ->method('getCustomerId') + ->willReturn($customerId); + + $customerData = $this->getMockBuilder('Magento\Customer\Api\Data\CustomerInterface') + ->setMethods([ + 'getDefaultShipping', + ]) + ->getMockForAbstractClass(); + $customerData->expects($this->once()) + ->method('getDefaultShipping') + ->willReturn($defaultShipping); + + $this->customerRepository->expects($this->once()) + ->method('getById') + ->with($customerId) + ->willReturn($customerData); + + $this->assertEquals('', $this->model->toHtml()); + } + + /** + * @param int $customerId + * @param int $defaultShipping + * @param int $countryId + * @param string $postcode + * @param string $region + * @param int $regionId + * @param int $quoteId + * @dataProvider dataProviderBeforeToHtml + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function testBeforeToHtml( + $customerId, + $defaultShipping, + $countryId, + $postcode, + $region, + $regionId, + $quoteId + ) { + $this->eventManager->expects($this->once()) + ->method('dispatch') + ->with('view_block_abstract_to_html_before', ['block' => $this->model]) + ->willReturnSelf(); + + $this->scopeConfig->expects($this->once()) + ->method('getValue') + ->with('advanced/modules_disable_output/Magento_Checkout', ScopeInterface::SCOPE_STORE) + ->willReturn(false); + + $this->customerSession->expects($this->once()) + ->method('isLoggedIn') + ->willReturn(true); + $this->customerSession->expects($this->once()) + ->method('getCustomerId') + ->willReturn($customerId); + + $customerDataMock = $this->getMockBuilder('Magento\Customer\Api\Data\CustomerInterface') + ->setMethods([ + 'getDefaultShipping', + ]) + ->getMockForAbstractClass(); + $customerDataMock->expects($this->once()) + ->method('getDefaultShipping') + ->willReturn($defaultShipping); + + $this->customerRepository->expects($this->once()) + ->method('getById') + ->with($customerId) + ->willReturn($customerDataMock); + + $this->addressReporitory->expects($this->once()) + ->method('getById') + ->with($defaultShipping) + ->willReturn($this->address); + + $regionMock = $this->getMockBuilder('Magento\Customer\Api\Data\RegionInterface') + ->setMethods([ + 'getRegion', + ]) + ->getMockForAbstractClass(); + $regionMock->expects($this->once()) + ->method('getRegion') + ->willReturn($region); + + $this->address->expects($this->once()) + ->method('getCountryId') + ->willReturn($countryId); + $this->address->expects($this->once()) + ->method('getPostcode') + ->willReturn($postcode); + $this->address->expects($this->once()) + ->method('getRegion') + ->willReturn($regionMock); + $this->address->expects($this->once()) + ->method('getRegionId') + ->willReturn($regionId); + + $this->estimatedAddress->expects($this->once()) + ->method('setCountryId') + ->with($countryId) + ->willReturnSelf(); + $this->estimatedAddress->expects($this->once()) + ->method('setPostcode') + ->with($postcode) + ->willReturnSelf(); + $this->estimatedAddress->expects($this->once()) + ->method('setRegion') + ->with($region) + ->willReturnSelf(); + $this->estimatedAddress->expects($this->once()) + ->method('setRegionId') + ->with($regionId) + ->willReturnSelf(); + + $this->checkoutSession->expects($this->once()) + ->method('getQuote') + ->willReturn($this->quote); + + $this->quote->expects($this->once()) + ->method('getId') + ->willReturn($quoteId); + + $this->shippingMethodManager->expects($this->once()) + ->method('estimateByAddress') + ->with($quoteId, $this->estimatedAddress) + ->willReturnSelf(); + + $this->quoteRepository->expects($this->once()) + ->method('save') + ->with($this->quote) + ->willReturnSelf(); + + $this->assertEquals('', $this->model->toHtml()); + } + + /** + * @return array + */ + public function dataProviderBeforeToHtml() + { + return [ + [1, 1, 1, '12345', '', 1, 1], + [1, 1, 1, '12345', '', 0, 1], + [1, 1, 1, '', '', 0, 1], + [1, 1, 1, '12345', 'California', 0, 1], + [1, 1, 1, '12345', 'California', 1, 1], + ]; + } + + /** + * @param int $count + * @param bool $expectedResult + * @dataProvider dataProviderIsMultipleCountriesAllowed + */ + public function testIsMultipleCountriesAllowed( + $count, + $expectedResult + ) { + $collection = $this->getMockBuilder('Magento\Directory\Model\Resource\Country\Collection') ->disableOriginalConstructor() - ->setMethods(['getLayout']) ->getMock(); + $collection->expects($this->once()) + ->method('count') + ->willReturn($count); - $contextMock->expects($this->once()) - ->method('getLayout') - ->will($this->returnValue($layoutMock)); + $this->directoryData->expects($this->once()) + ->method('getCountryCollection') + ->willReturn($collection); - /** @var \Magento\Checkout\Block\Cart\Shipping $shippingBlock */ - $shippingBlock = $this->objectManager->getObject( - 'Magento\Checkout\Block\Cart\Shipping', - ['context' => $contextMock] - ); + $this->assertEquals($expectedResult, $this->model->isMultipleCountriesAllowed()); + } - $this->assertEquals($shippingPriceHtml, $shippingBlock->getShippingPriceHtml($shippingRateMock)); + /** + * @return array + */ + public function dataProviderIsMultipleCountriesAllowed() + { + return [ + [0, false], + [1, false], + [2, true], + ]; } } diff --git a/app/code/Magento/Checkout/composer.json b/app/code/Magento/Checkout/composer.json index 7aac4e4eeb32402cdcf6a15b14a9a2488203b5a7..572909061f99a33ba2f588192618604966ddcdf2 100644 --- a/app/code/Magento/Checkout/composer.json +++ b/app/code/Magento/Checkout/composer.json @@ -15,7 +15,6 @@ "magento/module-directory": "0.74.0-beta14", "magento/module-eav": "0.74.0-beta14", "magento/module-gift-message": "0.74.0-beta14", - "magento/module-wishlist": "0.74.0-beta14", "magento/module-page-cache": "0.74.0-beta14", "magento/module-theme": "0.74.0-beta14", "magento/module-msrp": "0.74.0-beta14", diff --git a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_index.xml b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_index.xml index d0aeb1702d330c44a65833c0bfef597b5e09c6b0..93554677907714333edd3b3251c3f1a418473628 100644 --- a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_index.xml +++ b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_index.xml @@ -18,6 +18,7 @@ <container name="checkout.cart.form.before" as="form_before" label="Shopping Cart Items Before" htmlTag="div" htmlClass="rewards" before="checkout.cart.form"/> <block class="Magento\Checkout\Block\Cart" name="checkout.cart.form" as="cart-items" template="cart/form.phtml"> <block class="Magento\Framework\View\Element\RendererList" name="checkout.cart.item.renderers" as="renderer.list"/> + <block class="Magento\Framework\View\Element\Text\ListText" name="checkout.cart.order.actions"/> </block> <container name="checkout.cart.widget" as="checkout_cart_widget" label="Shopping Cart Items After"/> <block class="Magento\Checkout\Block\Cart\Shipping" name="checkout.cart.shipping" as="shipping" template="cart/shipping.phtml"/> diff --git a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml index d5462c158bd29ec8124188211368c28bd268c0bf..572820909c24eaf337b6cb1131f1f59199c83972 100644 --- a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml @@ -9,8 +9,18 @@ <update handle="checkout_item_price_renderers"/> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/item/default.phtml"/> - <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/item/default.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.default.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.default.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.default.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> + <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.simple.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.simple.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.simple.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/Checkout/view/frontend/layout/checkout_onepage_failure.xml b/app/code/Magento/Checkout/view/frontend/layout/checkout_onepage_failure.xml index d9e8d61c507a99b377704803e0321ed1d21c840b..b17b2423c18b6dd37767139b97954444a7310479 100644 --- a/app/code/Magento/Checkout/view/frontend/layout/checkout_onepage_failure.xml +++ b/app/code/Magento/Checkout/view/frontend/layout/checkout_onepage_failure.xml @@ -9,7 +9,7 @@ <body> <referenceBlock name="page.main.title"> <action method="setPageTitle"> - <argument translate="true" name="title" xsi:type="string">Your order has been received.</argument> + <argument translate="true" name="title" xsi:type="string">We received your order!</argument> </action> </referenceBlock> <referenceContainer name="content"> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml index a78b7d152131dd4a66c17f4d2e66afbcdfc60019..a5f8db141716f4da993703cfb5ba37f30fa96a02 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml @@ -60,4 +60,6 @@ <input type="hidden" value="" id="update_cart_action_container" /> </div> </form> +<?php echo $block->getChildHtml('checkout.cart.order.actions') ?> <?php echo $block->getChildHtml('shopping.cart.table.after'); ?> + diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/item/default.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/item/default.phtml index a189143ba870fd923daab34f7dad81d062ed393d..e0aa120c9c63ef5b620a66cafa01abbce89a7b68 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/item/default.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/item/default.phtml @@ -118,35 +118,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <tr class="item-actions"> <td colspan="<?php echo $cols;?>"> <div class="actions-toolbar"> - - <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllowInCart()) : ?> - <?php if ($isVisibleProduct): ?> - <a href="#" - data-post='<?php echo $this->helper('Magento\Wishlist\Helper\Data')->getMoveFromCartParams($_item->getId()); ?>' - class="use-ajax action towishlist"> - <span><?php echo __('Move to Wish List'); ?></span> - </a> - <?php endif ?> - <?php endif ?> - - <?php if ($isVisibleProduct): ?> - <a class="action edit" - href="<?php echo $block->getConfigureUrl() ?>" - title="<?php echo $block->escapeHtml(__('Edit item parameters')); ?>"> - <span> - <?php echo __('Edit') ?> - </span> - </a> - <?php endif ?> - - <a href="#" - title="<?php echo $block->escapeHtml(__('Remove item')); ?>" - class="action delete" - data-post='<?php echo $this->helper('Magento\Checkout\Helper\Cart')->getDeletePostJson($_item); ?>'> - <span> - <?php echo __('Remove item')?> - </span> - </a> + <?php echo $block->getActions($_item) ?> </div> </td> </tr> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/edit.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/edit.phtml new file mode 100644 index 0000000000000000000000000000000000000000..4123e6419a32c1f5b6d0eeb04f3013cc0a63ec39 --- /dev/null +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/edit.phtml @@ -0,0 +1,19 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +/** @var $block \Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit */ +?> +<?php if ($block->isProductVisibleInSiteVisibility()): ?> + <a class="action action-edit" + href="<?php echo $block->getConfigureUrl() ?>" + title="<?php echo $block->escapeHtml(__('Edit item parameters')); ?>"> + <span> + <?php echo __('Edit') ?> + </span> + </a> +<?php endif ?> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/remove.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/remove.phtml new file mode 100644 index 0000000000000000000000000000000000000000..bed34897aec6c0f44918036fc3e4624e1dc06626 --- /dev/null +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/remove.phtml @@ -0,0 +1,18 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +/** @var $block \Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove */ +?> +<a href="#" + title="<?php echo $block->escapeHtml(__('Remove item')); ?>" + class="action action-delete" + data-post='<?php echo $block->getDeletePostJson(); ?>'> + <span> + <?php echo __('Remove item')?> + </span> +</a> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml index 7585ca9388f9034e59d9b0a3e3d17434acbb258a..c38df0934ee5923819d4903d39531d1ad2ab7565 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml @@ -30,7 +30,7 @@ <label for="region_id" class="label"><span><?php echo __('State/Province') ?></span></label> <div class="control"> <select id="region_id" name="region_id" title="<?php echo __('State/Province') ?>" <?php if ($block->isStateProvinceRequired()):?> data-validate="{'validate-select':true}" <?php endif;?> > - <option value=""><?php echo __('Please select region, state or province') ?></option> + <option value=""><?php echo __('Please select a region, state or province.') ?></option> </select> <input type="text" id="region" name="region" value="<?php echo $block->escapeHtml($block->getEstimateRegion()) ?>" title="<?php echo __('State/Province') ?>" class="input-text" /> </div> @@ -71,7 +71,8 @@ "form": "#shipping-zip-form", "regionJson": <?php echo $this->helper('Magento\Directory\Helper\Data')->getRegionJson() ?>, "defaultRegion": "<?php echo $block->getEstimateRegionId() ?>", - "countriesWithOptionalZip": <?php echo $this->helper('Magento\Directory\Helper\Data')->getCountriesWithOptionalZip(true) ?> + "countriesWithOptionalZip": <?php echo $this->helper('Magento\Directory\Helper\Data')->getCountriesWithOptionalZip(true) ?>, + "isMultipleCountriesAllowed": <?php echo $block->isMultipleCountriesAllowed() ? 'true' : 'false'; ?> } } } diff --git a/app/code/Magento/Checkout/view/frontend/templates/onepage/billing.phtml b/app/code/Magento/Checkout/view/frontend/templates/onepage/billing.phtml index 951f7355804ec10d93a1403b8c5bf236e583570d..d2468e2aeda0ac1c88329949843696ef2e44aab5 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/onepage/billing.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/onepage/billing.phtml @@ -90,7 +90,7 @@ data-validate="{'validate-select':true}" <?php if ($block->getConfig('general/region/display_all') === 0):?>disabled="disabled"<?php endif; ?> style="display:none;"> - <option value=""><?php echo __('Please select region, state or province') ?></option> + <option value=""><?php echo __('Please select a region, state or province.') ?></option> </select> <input type="text" id="billing:region" diff --git a/app/code/Magento/Checkout/view/frontend/templates/onepage/shipping.phtml b/app/code/Magento/Checkout/view/frontend/templates/onepage/shipping.phtml index 6848faef6f2b9376e9e09bec13140d2a4508ddb9..335269fe4a1c656fb8ad93b7b64c76d38c590b3d 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/onepage/shipping.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/onepage/shipping.phtml @@ -67,7 +67,7 @@ <label class="label" for="shipping:region"><span><?php echo __('State/Province') ?></span></label> <div class="control"> <select id="shipping:region_id" name="shipping[region_id]" title="<?php echo __('State/Province') ?>" class="validate-select" style="display:none;"> - <option value=""><?php echo __('Please select region, state or province') ?></option> + <option value=""><?php echo __('Please select a region, state or province.') ?></option> </select> <input type="text" id="shipping:region" name="shipping[region]" value="<?php echo $block->escapeHtml($block->getAddress()->getRegion()) ?>" title="<?php echo __('State/Province') ?>" class="input-text <?php echo $this->helper('Magento\Customer\Helper\Address')->getAttributeValidationClass('region') ?>" style="display:none;" /> </div> diff --git a/app/code/Magento/Checkout/view/frontend/templates/onepage/shipping_method/available.phtml b/app/code/Magento/Checkout/view/frontend/templates/onepage/shipping_method/available.phtml index 257d8bab74f12f09a1f51a16a8eb190c24d31fa0..439778300fa6dccd9a8e269c087c018632cf54be 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/onepage/shipping_method/available.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/onepage/shipping_method/available.phtml @@ -14,7 +14,7 @@ <?php /** @var $block \Magento\Checkout\Block\Onepage\Shipping\Method\Available */ ?> <?php $_shippingRateGroups = $block->getShippingRates(); ?> <?php if (!$_shippingRateGroups): ?> - <p><?php echo __('Sorry, no quotes are available for this order at this time.') ?></p> + <p><?php echo __('Sorry, no quotes are available for this order right now.') ?></p> <?php else: ?> <dl class="items methods-shipping"> <?php $shippingCodePrice = []; ?> diff --git a/app/code/Magento/Checkout/view/frontend/templates/success.phtml b/app/code/Magento/Checkout/view/frontend/templates/success.phtml index b4d0bba7142182d3419a0602e538a89da579e26c..9a5162afc572fca0447b785fd7b15f4e1b291a5f 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/success.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/success.phtml @@ -15,7 +15,7 @@ <?php else :?> <p><?php echo __('Your order # is: <span>%1</span>.', $block->escapeHtml($block->getOrderId())) ?></p> <?php endif;?> - <p><?php echo __('You will receive an order confirmation email with details of your order and a link to track its progress.') ?></p> + <p><?php echo __('We\'ll email you an order confirmation with details and tracking info.') ?></p> <?php endif;?> <?php echo $block->getAdditionalInfoHtml() ?> diff --git a/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js b/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js index 29789e906e65a43a1f86eeb9ab9da7becb06a8ed..059595059e51bd7cc167c8d6dca289dceaff2440 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js @@ -183,7 +183,7 @@ define([ if (json.isGuestCheckoutAllowed) { if( !guestChecked && !registerChecked ){ - alert( $.mage.__('You can create an account or check out as a guest.') ); + alert( $.mage.__('Please create an account or check out as a guest.') ); return false; } diff --git a/app/code/Magento/Checkout/view/frontend/web/js/opc-payment-info.js b/app/code/Magento/Checkout/view/frontend/web/js/opc-payment-info.js index ac9a1781c49921ae2a7b50b308e19d7667a726c6..103ba0a083a1dc127854422cd763a1c65c02de71 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/opc-payment-info.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/opc-payment-info.js @@ -121,7 +121,7 @@ define([ var methods = this.element.find('[name^="payment["]'); if (methods.length === 0) { - alert($.mage.__("We can't complete your order because you don't have a payment method available.")); + alert($.mage.__('We can\'t complete your order because you don\'t have a payment method set up.')); return false; } diff --git a/app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js b/app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js index 0875a61b5b92995b18d31e0c115ec8905f59fdc4..dfa427d7c4dad0809d612262f329a43d66abdc85 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js @@ -156,7 +156,7 @@ define([ this.element.find(this.options.checkout.registerCustomerPasswordSelector).show(); } else { - alert($.mage.__('You can create an account or check out as a guest.')); + alert($.mage.__('Please create an account or check out as a guest.')); return false; } @@ -427,7 +427,7 @@ define([ var methods = this.element.find('[name="shipping_method"]'); if (methods.length === 0) { - alert($.mage.__('We can\'t ship to this address. Please enter another address or edit this one.')); + alert($.mage.__('We can\'t ship to this address. Please choose another address or edit the current one.')); return false; } @@ -551,7 +551,7 @@ define([ var methods = this.element.find('[name^="payment["]'); if (methods.length === 0) { - alert($.mage.__("We can't complete your order because you don't have a payment method available.")); + alert($.mage.__('We can\'t complete your order because you don\'t have a payment method set up.')); return false; } diff --git a/app/code/Magento/Checkout/view/frontend/web/js/payment.js b/app/code/Magento/Checkout/view/frontend/web/js/payment.js index 8c880cd694bf166f711e99e3a1f435cc76dce883..258531548bc842fd5ff4cf65b05727ec1b641b67 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/payment.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/payment.js @@ -79,7 +79,7 @@ define([ isValid = false; if (methods.length === 0) { - alert($.mage.__("We can't complete your order because you don't have a payment method available.")); + alert($.mage.__('We can\'t complete your order because you don\'t have a payment method set up.')); } else if (this.options.checkoutPrice < this.options.minBalance) { isValid = true; } else if (methods.filter('input:radio:checked').length) { diff --git a/app/code/Magento/Checkout/view/frontend/web/js/region-updater.js b/app/code/Magento/Checkout/view/frontend/web/js/region-updater.js index d48975806a79664906a1ff1ab6954f37ba23f536..d6cef062b1d507b82fcc00b5ee99fbc128d533a5 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/region-updater.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/region-updater.js @@ -21,24 +21,18 @@ define([ isRegionRequired: true, isZipRequired: true, isCountryRequired: true, - currentRegion: null + currentRegion: null, + isMultipleCountriesAllowed: true }, _create: function () { - this.currentRegionOption = this.options.currentRegion; + this._initCountryElement(); + this.currentRegionOption = this.options.currentRegion; this.regionTmpl = mageTemplate(this.options.regionTemplate); this._updateRegion(this.element.find('option:selected').val()); - this.element.on('change', $.proxy(function (e) { - this._updateRegion($(e.target).val()); - }, this)); - - if (this.isCountryRequired) { - this.element.addClass('required-entry'); - } - $(this.options.regionListId).on('change', $.proxy(function (e) { this.setOption = false; this.currentRegionOption = $(e.target).val(); @@ -49,6 +43,21 @@ define([ }, this)); }, + _initCountryElement: function() { + if (this.options.isMultipleCountriesAllowed) { + this.element.parents('div.field').show(); + this.element.on('change', $.proxy(function (e) { + this._updateRegion($(e.target).val()); + }, this)); + if (this.options.isCountryRequired) { + this.element.addClass('required-entry'); + this.element.parents('div.field').addClass('required'); + } + } else { + this.element.parents('div.field').hide(); + } + }, + /** * Remove options from dropdown list * @param {Object} selectElement - jQuery object for dropdown list diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/minicart.js b/app/code/Magento/Checkout/view/frontend/web/js/view/minicart.js index 322718862d97ec4ebe4172dd2ac3bfe6833fafff..373056b389e955be7f910313faf38af2e83cddbb 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/view/minicart.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/view/minicart.js @@ -47,7 +47,7 @@ define([ "button": ":button.update-cart-item" }, "confirmMessage": $.mage.__( - 'Are you sure you would like to remove this item from the shopping cart?' + 'Are you sure you want to remove this item from your Compare Products list?' ) }); } diff --git a/app/code/Magento/Checkout/view/frontend/web/template/authentication.html b/app/code/Magento/Checkout/view/frontend/web/template/authentication.html index c54065bab2510988a32f1e60da6e8ee076183291..263249c03824174fbc03630df6581d5e256b0909 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/authentication.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/authentication.html @@ -25,7 +25,7 @@ <div class="block block-guest"> <div class="block-title"> <strong id="block-guest-heading" role="heading" aria-level="2"> - <!--ko text: $t('Checkout as a Guest')--><!--/ko--> + <!--ko text: $t('Check Out as a Guest')--><!--/ko--> </strong> </div> <div class="block-content" aria-labelledby="block-guest-heading"> @@ -37,11 +37,11 @@ <!-- ko ifnot: isGuestCheckoutAllowed --> <!-- ko if: isCustomerLoginRequired --> <input type="checkbox" name="checkout_method" data-role="checkout-method-register" id="login:register" value="register" checked="checked" style="display: none"/> - <button data-bind="click: setCheckoutMethod" data-role="opc-continue" id="onepage-guest-register-button" type="button" class="action register primary" data-checkout='{"isGuestCheckoutAllowed":false, "registrationUrl":"registerUrl"}'><span data-bind="text: $t('Register')"></span></button> + <button data-bind="click: setCheckoutMethod" data-role="opc-continue" id="onepage-guest-register-button" type="button" class="action register primary" data-checkout='{"isGuestCheckoutAllowed":false, "registrationUrl":"registerUrl"}'><span data-bind="text: $t('Create an Account')"></span></button> <!-- /ko --> <!-- ko ifnot: isCustomerLoginRequired --> <input type="checkbox" name="checkout_method" data-role="checkout-method-register" id="login:register" value="register" checked="checked" style="display: none"/> - <button data-bind="click: setCheckoutMethod" data-role="opc-continue" id="onepage-guest-register-button" type="button" class="action register primary" data-checkout='{"isGuestCheckoutAllowed":true}'><span data-bind="text: $t('Register')"></span></button> + <button data-bind="click: setCheckoutMethod" data-role="opc-continue" id="onepage-guest-register-button" type="button" class="action register primary" data-checkout='{"isGuestCheckoutAllowed":true}'><span data-bind="text: $t('Create an Account')"></span></button> <!-- /ko --> <!-- /ko --> </div> @@ -59,7 +59,7 @@ method="post" data-mage-init='{"validation":{}}'> <fieldset class="fieldset login" data-bind="attr: {'data-hasrequired': $t('* Required Fields')}"> - <div class="field note" data-bind="text: $t('Already registered? Please log in below:')"></div> + <div class="field note" data-bind="text: $t('Already registered? Please sign in below:')"></div> <div class="field email required"> <label class="label" for="login-email"><span data-bind="text: $t('Email')"></span></label> <div class="control"> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/minicart/item/default.html b/app/code/Magento/Checkout/view/frontend/web/template/minicart/item/default.html index a846c85deb4e7b20b0c7c16858bc8e7b67cb765f..7a5432c380b5579dff032a888203426d61ae03ea 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/minicart/item/default.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/minicart/item/default.html @@ -33,7 +33,7 @@ <!-- ko if: options.length --> <div class="product options" data-mage-init='{"collapsible":{"openedState": "active", "saveState": false}}'> - <span data-role="title" class="more toggle"><!-- ko text: $t('View Details') --><!-- /ko --></span> + <span data-role="title" class="more toggle"><!-- ko text: $t('See Details') --><!-- /ko --></span> <div data-role="content" class="product options details content"> <strong class="subtitle"><!-- ko text: $t('Options Details') --><!-- /ko --></strong> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/progress.html b/app/code/Magento/Checkout/view/frontend/web/template/progress.html index af506619bda9516dcb6ca813dcc33dc4a1d3634b..2831a845897496816dd57d0fefadecd98b44390d 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/progress.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/progress.html @@ -74,7 +74,7 @@ <!--/ko--> <!-- ko ifnot : (getShippingRates().length > 0) --> - <!-- ko text: $t('Shipping method has not been selected yet') --><!--/ko--> + <!-- ko text: $t('Please choose a shipping method.') --><!--/ko--> <!--/ko--> </dd> <!--/ko--> diff --git a/app/code/Magento/Checkout/view/frontend/web/template/shipping-method.html b/app/code/Magento/Checkout/view/frontend/web/template/shipping-method.html index 3bb9342bc5722ebd96f5393ca5bbabe4a44424fb..523c1eb3b34f4c2c47d692b4401f945bbe422471 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/shipping-method.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/shipping-method.html @@ -16,7 +16,7 @@ aria-hidden="false" data-bind="fadeVisible: isVisible() && quoteHasShippingAddress()"> <!-- ko if: rates().length == 0 --> - <!-- ko text: $t('Sorry, no quotes are available for this order at this time')--><!-- /ko --> + <!-- ko text: $t('Sorry, no quotes are available for this order right now.')--><!-- /ko --> <!-- /ko --> <!-- ko if: rates().length --> <form class="form methods-shipping" id="co-shipping-method-form" data-bind="submit: setShippingMethod" novalidate="novalidate"> diff --git a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Delete.php b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Delete.php index fba6b572166c142a4e8f6a58275809f295705db8..8ca81a642dfbd81e82b85371ee8bb25aecaa0dfd 100644 --- a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Delete.php +++ b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Delete.php @@ -23,7 +23,7 @@ class Delete extends \Magento\CheckoutAgreements\Controller\Adminhtml\Agreement try { $model->delete(); - $this->messageManager->addSuccess(__('The condition has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the condition.')); $this->_redirect('checkout/*/'); return; } catch (\Magento\Framework\Exception\LocalizedException $e) { diff --git a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Save.php b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Save.php index ddd125d419f6cf3feb5bbdd7e7258bc00bfaf377..760a465693f177deb3b6468b09861744e7e9b080 100644 --- a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Save.php +++ b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Save.php @@ -26,7 +26,7 @@ class Save extends \Magento\CheckoutAgreements\Controller\Adminhtml\Agreement } } else { $model->save(); - $this->messageManager->addSuccess(__('The condition has been saved.')); + $this->messageManager->addSuccess(__('You saved the condition.')); $this->_redirect('checkout/*/'); return; } diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/Delete.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/Delete.php index c5bf68c00e127f199bc23d04f165a333db937035..107b5f4eb9ecc5da560b6a34beb235c976455c3d 100755 --- a/app/code/Magento/Cms/Controller/Adminhtml/Block/Delete.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/Delete.php @@ -26,7 +26,7 @@ class Delete extends \Magento\Cms\Controller\Adminhtml\Block $model->load($id); $model->delete(); // display success message - $this->messageManager->addSuccess(__('The block has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the block.')); // go to grid return $resultRedirect->setPath('*/*/'); } catch (\Exception $e) { diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/Save.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/Save.php index 1fe7e266c91be3609d217d825d2b1a5b5a943881..c6e17f07cbfeecd5167f03bfab480de6084a3128 100755 --- a/app/code/Magento/Cms/Controller/Adminhtml/Block/Save.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/Save.php @@ -36,7 +36,7 @@ class Save extends \Magento\Cms\Controller\Adminhtml\Block // save the data $model->save(); // display success message - $this->messageManager->addSuccess(__('The block has been saved.')); + $this->messageManager->addSuccess(__('You saved the block.')); // clear previously saved data from session $this->_objectManager->get('Magento\Backend\Model\Session')->setFormData(false); diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php index 46b0998de61fd481386bfe840506b715a4d9b692..6858ef9cadf1014d5edd9842035e028847728806 100644 --- a/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php +++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php @@ -65,7 +65,7 @@ class Save extends \Magento\Backend\App\Action try { $model->save(); - $this->messageManager->addSuccess(__('The page has been saved.')); + $this->messageManager->addSuccess(__('You saved this page.')); $this->_objectManager->get('Magento\Backend\Model\Session')->setFormData(false); if ($this->getRequest()->getParam('back')) { return $resultRedirect->setPath('*/*/edit', ['page_id' => $model->getId(), '_current' => true]); diff --git a/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage.php b/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage.php index 154f74fac0ff7c47d8ee3c4ef1dfc9e18171a661..c1fbd62d212129341ce19c777d4c84033c6e2c9b 100644 --- a/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage.php +++ b/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage.php @@ -344,7 +344,7 @@ class Storage extends \Magento\Framework\Object { if (!preg_match(self::DIRECTORY_NAME_REGEXP, $name)) { throw new \Magento\Framework\Exception\LocalizedException( - __('Please correct the folder name. Use only letters, numbers, underscores and dashes.') + __('Please rename the folder using only letters, numbers, underscores and dashes.') ); } diff --git a/app/code/Magento/Cms/Setup/InstallData.php b/app/code/Magento/Cms/Setup/InstallData.php index 32f64b54b5502303c0077d214291bb35fe0a5373..726a8e45f01a369bf28833a02bd972ce67b5a857 100644 --- a/app/code/Magento/Cms/Setup/InstallData.php +++ b/app/code/Magento/Cms/Setup/InstallData.php @@ -107,7 +107,7 @@ class InstallData implements InstallDataInterface <div class="message info"> <span> Please replace this text with you Privacy Policy. - Please add any additional cookies your website uses below (e.g., Google Analytics) + Please add any additional cookies your website uses below (e.g. Google Analytics). </span> </div> <p> @@ -258,7 +258,7 @@ class InstallData implements InstallDataInterface </tr> <tr> <th>FRONTEND</th> - <td>You sesssion ID on the server.</td> + <td>Your session ID on the server.</td> </tr> <tr> <th>GUEST-VIEW</th> diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/DeleteTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/DeleteTest.php index 44335de6ff1b189c610092d619436f83afff1152..c32d11572cf67c614602101942ffd23e47a62614 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/DeleteTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/DeleteTest.php @@ -139,7 +139,7 @@ class DeleteTest extends \PHPUnit_Framework_TestCase $this->messageManagerMock->expects($this->once()) ->method('addSuccess') - ->with(__('The block has been deleted.')); + ->with(__('You deleted the block.')); $this->messageManagerMock->expects($this->never()) ->method('addError'); diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/SaveTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/SaveTest.php index c74fa3e8fe414f5436d782e4e6f530890b663247..0a1c7be6c9541410f366bf990226502df6a61f8f 100644 --- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/SaveTest.php +++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Block/SaveTest.php @@ -210,7 +210,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManagerMock->expects($this->once()) ->method('addSuccess') - ->with(__('The block has been saved.')); + ->with(__('You saved the block.')); $this->sessionMock->expects($this->atLeastOnce())->method('setFormData')->with(false); @@ -294,7 +294,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManagerMock->expects($this->once()) ->method('addSuccess') - ->with(__('The block has been saved.')); + ->with(__('You saved the block.')); $this->sessionMock->expects($this->atLeastOnce())->method('setFormData')->with(false); @@ -341,7 +341,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase $this->messageManagerMock->expects($this->any()) ->method('addSuccess') - ->with(__('The block has been saved.')); + ->with(__('You saved the block.')); $this->messageManagerMock->expects($this->once()) ->method('addError'); diff --git a/app/code/Magento/Config/Controller/Adminhtml/System/Config/Save.php b/app/code/Magento/Config/Controller/Adminhtml/System/Config/Save.php index f5969841a7db1d5653e6f19cdb0765973d1b8310..75b8eb4fd26e38fdd4e3b7a1de6001454cc15f64 100644 --- a/app/code/Magento/Config/Controller/Adminhtml/System/Config/Save.php +++ b/app/code/Magento/Config/Controller/Adminhtml/System/Config/Save.php @@ -169,7 +169,7 @@ class Save extends AbstractConfig } catch (\Exception $e) { $this->messageManager->addException( $e, - __('An error occurred while saving this configuration:') . ' ' . $e->getMessage() + __('Something went wrong while saving this configuration:') . ' ' . $e->getMessage() ); } diff --git a/app/code/Magento/Config/Model/Config/Backend/Currency/DefaultCurrency.php b/app/code/Magento/Config/Model/Config/Backend/Currency/DefaultCurrency.php index c2030b1c734340e7058adf54792c962aea244194..35e8e5688ca0cdf156189145e01abb52d06a7596 100644 --- a/app/code/Magento/Config/Model/Config/Backend/Currency/DefaultCurrency.php +++ b/app/code/Magento/Config/Model/Config/Backend/Currency/DefaultCurrency.php @@ -29,7 +29,7 @@ class DefaultCurrency extends AbstractCurrency if (!in_array($this->getValue(), $this->_getAllowedCurrencies())) { throw new \Magento\Framework\Exception\LocalizedException( - __('Sorry, the default display currency you selected in not available in allowed currencies.') + __('Sorry, the default display currency you selected is not available in allowed currencies.') ); } diff --git a/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php b/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php index 3f5d820c2d46ff3e04a97f469e96dd7d84c0dbe4..8471d5c3d3231c25763964a65275d998ba4fbd20 100644 --- a/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php +++ b/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php @@ -228,14 +228,14 @@ class OptionRepository implements \Magento\ConfigurableProduct\Api\OptionReposit $product->setStoreId($this->storeManager->getStore(Store::ADMIN_CODE)->getId()); $product->save(); } catch (\Exception $e) { - throw new CouldNotSaveException(__('An error occurred while saving option')); + throw new CouldNotSaveException(__('Something went wrong while saving option.')); } $configurableAttribute = $this->configurableAttributeFactory->create(); $configurableAttribute->loadByProductAndAttribute($product, $eavAttribute); } if (!$configurableAttribute->getId()) { - throw new CouldNotSaveException(__('An error occurred while saving option')); + throw new CouldNotSaveException(__('Something went wrong while saving option.')); } return $configurableAttribute->getId(); } diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php index 20d861e695135aabf4c445eea2d4bfdd0eaa0680..f8876143586fd215416d700eb5a2452c4b3c3c36 100644 --- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php +++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php @@ -801,7 +801,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType } if (!isset($_result[0])) { - return __('Cannot add the item to shopping cart')->render(); + return __('You can\'t add the item to shopping cart.')->render(); } /** @@ -874,7 +874,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType */ public function getSpecifyOptionMessage() { - return __('Please specify the product\'s option(s).'); + return __('You need to choose options for your item.'); } /** diff --git a/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php index 086efbbf9f8ff8a995a15eeb283026924322288d..2dc2f6d2c88f2ee28b27916108ea451727845ad6 100644 --- a/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php +++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php @@ -17,7 +17,7 @@ class Configurable extends \Magento\Catalog\Model\Resource\Product\Indexer\Price */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); @@ -63,10 +63,7 @@ class Configurable extends \Magento\Catalog\Model\Resource\Product\Indexer\Price */ protected function _getConfigurableOptionAggregateTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_cfg_opt_agr_idx'); - } - return $this->getTable('catalog_product_index_price_cfg_opt_agr_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_cfg_opt_agr'); } /** @@ -76,10 +73,7 @@ class Configurable extends \Magento\Catalog\Model\Resource\Product\Indexer\Price */ protected function _getConfigurableOptionPriceTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_cfg_opt_idx'); - } - return $this->getTable('catalog_product_index_price_cfg_opt_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_cfg_opt'); } /** diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Block/Cart/Item/Renderer/ConfigurableTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Block/Cart/Item/Renderer/ConfigurableTest.php index 8594a0fb07f30e864b0d9744eb15f260930f0cf0..23f9b9b8ff1439e46352cf30a3567302222b33fc 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Unit/Block/Cart/Item/Renderer/ConfigurableTest.php +++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Block/Cart/Item/Renderer/ConfigurableTest.php @@ -233,7 +233,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase public function testGetOptionList() { - $itemMock = $this->getMock('Magento\Quote\Model\Quote\Item\AbstractItem', [], [], '', false); + $itemMock = $this->getMock('Magento\Quote\Model\Quote\Item', [], [], '', false); $this->_renderer->setItem($itemMock); $this->productConfigMock->expects($this->once())->method('getOptions')->with($itemMock); $this->_renderer->getOptionList(); diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php index a4fcb50da0362d438aa999dc67a57fd7c75ddad9..964627677fd98f95e5c7b35336893464d5eba043 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php +++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php @@ -644,7 +644,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Please specify the product's option(s). + * @expectedExceptionMessage You need to choose options for your item. */ public function testCheckProductBuyStateException() { diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/attribute/set/js.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/attribute/set/js.phtml index f1445c3798d2668b5adb12b29d1efbf042617d2a..486bd4943dbeec9e9972159d9433263ac6a1f287 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/attribute/set/js.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/attribute/set/js.phtml @@ -34,7 +34,7 @@ editSet.submit = editSet.submit.wrap(function(original) { editSet.rightBeforeAppend = editSet.rightBeforeAppend.wrap(function(original, tree, nodeThis, node, newParent) { if (node.attributes.is_configurable == 1) { - alert('<?php echo $block->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the attribute set.')) ?>'); + alert('<?php echo $block->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the product template.')) ?>'); return false; } return original(tree, nodeThis, node, newParent); @@ -42,7 +42,7 @@ editSet.rightBeforeAppend = editSet.rightBeforeAppend.wrap(function(original, tr editSet.rightBeforeInsert = editSet.rightBeforeInsert.wrap(function(original, tree, nodeThis, node, newParent) { if (node.attributes.is_configurable == 1) { - alert('<?php echo $block->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the attribute set.')) ?>'); + alert('<?php echo $block->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the product template.')) ?>'); return false; } return original(tree, nodeThis, node, newParent); diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-js-template.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-js-template.phtml index 2865b30b7710771e8fa63e2542f8f08e08c5c68e..a997ad893456cef5e3ff769f50a3881cdcb8fa12 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-js-template.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-js-template.phtml @@ -149,14 +149,14 @@ <div class="fields-group-2"> <div class="field field-pricing-value"> <div class="control"> - <input type="text" class="pricing-value validate-number" + <input type="text" class="pricing-value validate-number" <?php if(!$block->getCanEditPrice()): ?> 'disabled="disabled"' <?php endif; ?> name="product[configurable_attributes_data][<%- data.attribute.id %>][values][<%- data.option.id %>][pricing_value]" /> </div> </div> <div class="field field-pricing-measure"> <div class="actions dropdown actions-select"> <input type="hidden" value="0" name="product[configurable_attributes_data][<%- data.attribute.id %>][values][<%- data.option.id %>][is_percent]"/> - <button type="button" class="action toggle" data-toggle="dropdown" data-mage-init='{"dropdown":{}}'> + <button type="button" class="action toggle" data-toggle="dropdown" data-mage-init='{"dropdown":{}}' <?php if(!$block->getCanEditPrice()): ?> 'disabled="disabled"' <?php endif; ?>> <span><?php echo $block->getBaseCurrency()->getSymbol() ?></span> </button> <ul class="dropdown" data-role="dropdown-menu" data-mage-init='{"menu":{}}'> diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-template.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-template.phtml index 9a50b287313e96ffbf5d4335e1fb8c9563ee5f8e..dd8a327146c9e87e81db2815df1a84ec4d9afcf2 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-template.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/attribute-template.phtml @@ -118,7 +118,7 @@ $id = $block->escapeHtml($attribute['attribute_id']); <div class="fields-group-2"> <div class="field field-pricing-value"> <div class="control"> - <input type="text" class="pricing-value validate-number" + <input type="text" <?php if (!$block->getCanEditPrice()): ?> disabled="disabled";<?php endif; ?> class="pricing-value validate-number" name="<?php echo $namePrefix ?>[<?php echo $valueIndex ?>][pricing_value]" value="<?php echo $block->escapeHtml($pricingValue); ?>"> @@ -128,7 +128,7 @@ $id = $block->escapeHtml($attribute['attribute_id']); <div class="actions dropdown actions-select"> <input name="<?php echo $namePrefix ?>[<?php echo $valueIndex ?>][is_percent]" type="hidden" value="<?php echo $isPercent ? 1 : 0; ?>"/> - <button type="button" class="action toggle" data-toggle="dropdown" data-mage-init='{"dropdown":{}}'> + <button type="button" class="action toggle" <?php if (!$block->getCanEditPrice()): ?> disabled="disabled" <?php endif; ?> data-toggle="dropdown" data-mage-init='{"dropdown":{}}'> <span><?php echo $isPercent ? __('%') : $block->getBaseCurrency()->getSymbol() ?></span> </button> <ul class="dropdown" data-role="dropdown-menu" data-mage-init='{"menu":{}}'> diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/form.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/form.phtml index a9c558ad9ce46d7fd7eb30e408d2774eae5de2e2..79fda9e439b27351ffe792e1fa585ba3fa069a53 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/form.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/form.phtml @@ -13,7 +13,7 @@ <div class="messages"> <div class="message message-notice notice"> - <div><?php echo __("Attribute set comprising all selected configurable attributes need to be in order to save generated variations.") ?></div> + <div><?php echo __("Product template comprising all selected configurable attributes need to be in order to save generated variations.") ?></div> </div> <div class="message message-error error" style="display: none"></div> </div> @@ -39,7 +39,7 @@ <div class="field required" id="affected-attribute-set-new-name-container" style="display: none"> <label class="label" for="new-attribute-set-name"> - <span><?php echo __('New attribute set name')?></span> + <span><?php echo __('New product template name')?></span> </label> <div class="control"> diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/js.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/js.phtml index 9212be28ee6b9ac32658b90f3d0df179f8facef4..19234616a0e6e67ce97cad87d40af3da3f218aa9 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/js.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/product/configurable/affected-attribute-set-selector/js.phtml @@ -34,7 +34,7 @@ $form .dialog({ - title: '<?php echo __('Choose Affected Attribute Set'); ?>', + title: '<?php echo __('Choose Affected Product Template'); ?>', autoOpen: false, id: '<?php echo $block->getJsId() ?>', width: '75%', diff --git a/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml index ed335b6babce89860d2af06041a59957ce9dcea5..8b303c7a667fcec5c25753db40715ed3e168e8b4 100644 --- a/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml @@ -8,7 +8,12 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable" as="configurable" template="Magento_Checkout::cart/item/default.phtml"/> + <block class="Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable" as="configurable" template="Magento_Checkout::cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.configurable.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.configurable.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.configurable.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php b/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php index bb59c0e78c7425e6c3e38d1428574a7b738758c2..ccaec64fabb98588414aac86ae67c5e8b14bd956 100644 --- a/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php +++ b/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php @@ -1,32 +1,37 @@ <?php /** - * * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Contact\Test\Unit\Controller\Index; class IndexTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Contact\Controller\Index\Index|\PHPUnit_Framework_MockObject_MockObject + * Controller + * + * @var \Magento\Contact\Controller\Index\Index */ protected $_controller; /** + * Scope config mock + * * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $_scopeConfig; /** + * View mock + * * @var \Magento\Framework\App\ViewInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $_view; /** + * Url mock + * * @var \Magento\Framework\UrlInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $_url; @@ -34,7 +39,10 @@ class IndexTest extends \PHPUnit_Framework_TestCase public function setUp() { $this->_scopeConfig = $this->getMockForAbstractClass( - '\Magento\Framework\App\Config\ScopeConfigInterface', ['isSetFlag'], '', false + '\Magento\Framework\App\Config\ScopeConfigInterface', + ['isSetFlag'], + '', + false ); $context = $this->getMock( '\Magento\Framework\App\Action\Context', diff --git a/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php b/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php index 9db82a0300c8dfcc1fb590aa2f7bf329596dd736..609eaddcc4b579de6c613e1855fda232937ea2d2 100644 --- a/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php +++ b/app/code/Magento/Contact/Test/Unit/Controller/IndexTest.php @@ -4,18 +4,20 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Contact\Test\Unit\Controller; class IndexTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Contact\Controller\Index|\PHPUnit_Framework_MockObject_MockObject + * Controller instance + * + * @var \Magento\Contact\Controller\Index */ protected $_controller; /** + * Scope config instance + * * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $_scopeConfig; @@ -23,7 +25,10 @@ class IndexTest extends \PHPUnit_Framework_TestCase public function setUp() { $this->_scopeConfig = $this->getMockForAbstractClass( - '\Magento\Framework\App\Config\ScopeConfigInterface', ['isSetFlag'], '', false + '\Magento\Framework\App\Config\ScopeConfigInterface', + ['isSetFlag'], + '', + false ); $context = $this->getMock( '\Magento\Framework\App\Action\Context', @@ -33,23 +38,21 @@ class IndexTest extends \PHPUnit_Framework_TestCase false ); - $context->expects( - $this->any() - )->method( - 'getRequest' - )->will( - $this->returnValue($this->getMockForAbstractClass('\Magento\Framework\App\RequestInterface', [], '', false)) - ); + $context->expects($this->any()) + ->method('getRequest') + ->will( + $this->returnValue( + $this->getMockForAbstractClass('\Magento\Framework\App\RequestInterface', [], '', false) + ) + ); - $context->expects( - $this->any() - )->method( - 'getResponse' - )->will( - $this->returnValue( - $this->getMockForAbstractClass('\Magento\Framework\App\ResponseInterface', [], '', false) - ) - ); + $context->expects($this->any()) + ->method('getResponse') + ->will( + $this->returnValue( + $this->getMockForAbstractClass('\Magento\Framework\App\ResponseInterface', [], '', false) + ) + ); $this->_controller = new \Magento\Contact\Controller\Index( $context, @@ -61,20 +64,20 @@ class IndexTest extends \PHPUnit_Framework_TestCase } /** + * Dispatch test + * * @expectedException \Magento\Framework\Exception\NotFoundException */ public function testDispatch() { - $this->_scopeConfig->expects( - $this->once() - )->method( - 'isSetFlag' - )->with( - \Magento\Contact\Controller\Index::XML_PATH_ENABLED, - \Magento\Store\Model\ScopeInterface::SCOPE_STORE - )->will( - $this->returnValue(false) - ); + $this->_scopeConfig->expects($this->once()) + ->method('isSetFlag') + ->with( + \Magento\Contact\Controller\Index::XML_PATH_ENABLED, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ->will($this->returnValue(false)); + $this->_controller->dispatch( $this->getMockForAbstractClass('\Magento\Framework\App\RequestInterface', [], '', false) ); diff --git a/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php b/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php index cffd617f422b4327608f4a626a17a5772dc94a12..057cc4672acf0dcf72ce5b5df73a778e8bbd5f57 100644 --- a/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php +++ b/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php @@ -4,28 +4,34 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Contact\Test\Unit\Helper; class DataTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Contact\Helper\Data|\PHPUnit_Framework_MockObject_MockObject + * Helper + * + * @var \Magento\Contact\Helper\Data */ protected $_helper; /** + * Scope config mock + * * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $_scopeConfig; /** + * Customer session mock + * * @var \Magento\Customer\Model\Session|\PHPUnit_Framework_MockObject_MockObject */ protected $_customerSession; /** + * Customer view helper mock + * * @var \Magento\Customer\Helper\View|\PHPUnit_Framework_MockObject_MockObject */ protected $_customerViewHelper; @@ -35,7 +41,9 @@ class DataTest extends \PHPUnit_Framework_TestCase $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $className = '\Magento\Contact\Helper\Data'; $arguments = $objectManagerHelper->getConstructArguments($className); - /** @var \Magento\Framework\App\Helper\Context $context */ + /** + * @var \Magento\Framework\App\Helper\Context $context + */ $context = $arguments['context']; $this->_scopeConfig = $context->getScopeConfig(); $this->_customerSession = $arguments['customerSession']; @@ -58,7 +66,7 @@ class DataTest extends \PHPUnit_Framework_TestCase ->method('getValue') ->will($this->returnValue(null)); - $this->assertTrue(is_null($this->_helper->isEnabled())); + $this->assertTrue(null === $this->_helper->isEnabled()); } public function testGetUserNameNotLoggedIn() @@ -104,8 +112,12 @@ class DataTest extends \PHPUnit_Framework_TestCase $this->_customerSession->expects($this->once()) ->method('isLoggedIn') ->will($this->returnValue(true)); + $customerDataObject = $this->getMock('\Magento\Customer\Api\Data\CustomerInterface', [], [], '', false); - $customerDataObject->expects($this->once())->method('getEmail')->will($this->returnValue('customer@email.com')); + $customerDataObject->expects($this->once()) + ->method('getEmail') + ->will($this->returnValue('customer@email.com')); + $this->_customerSession->expects($this->once()) ->method('getCustomerDataObject') ->will($this->returnValue($customerDataObject)); diff --git a/app/code/Magento/Contact/view/email/submitted_form.html b/app/code/Magento/Contact/view/email/submitted_form.html index 639924aaaef758951cd60590a525a701d905b3f4..5bff540b55d442db04ba85c3e9ea1f6b6591d23b 100644 --- a/app/code/Magento/Contact/view/email/submitted_form.html +++ b/app/code/Magento/Contact/view/email/submitted_form.html @@ -12,7 +12,7 @@ "var data.comment":"Comment"} @--> Name: {{var data.name}} -E-mail: {{var data.email}} +Email: {{var data.email}} Phone Number: {{var data.telephone}} Comment: {{var data.comment}} \ No newline at end of file diff --git a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRates.php b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRates.php index fcd8fa3cb48d300bef4bd7569812edac5800ed3e..08cb0511025c1d582e3c41e82022b822b3676a77 100644 --- a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRates.php +++ b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRates.php @@ -40,10 +40,10 @@ class FetchRates extends \Magento\CurrencySymbol\Controller\Adminhtml\System\Cur $this->messageManager->addWarning($error); } $this->messageManager->addWarning( - __('All possible rates were fetched, please click on "Save" to apply') + __('Click "Save" to apply the rates we found.') ); } else { - $this->messageManager->addSuccess(__('All rates were fetched, please click on "Save" to apply')); + $this->messageManager->addSuccess(__('Click "Save" to apply the rates we found.')); } $backendSession->setRates($rates); diff --git a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Save.php b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Save.php index 02509f2c373468072d4290ac9f19ecd0afb4915b..716ca26e493aa4c86f663b4b62dd46ad0a5b81f4 100644 --- a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Save.php +++ b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/Save.php @@ -27,7 +27,7 @@ class Save extends \Magento\CurrencySymbol\Controller\Adminhtml\System\Currencys try { $this->_objectManager->create('Magento\CurrencySymbol\Model\System\Currencysymbol') ->setCurrencySymbolsData($symbolsDataArray); - $this->messageManager->addSuccess(__('The custom currency symbols were applied.')); + $this->messageManager->addSuccess(__('You applied the custom currency symbols.')); } catch (\Exception $e) { $this->messageManager->addError($e->getMessage()); } diff --git a/app/code/Magento/Customer/Api/AccountManagementInterface.php b/app/code/Magento/Customer/Api/AccountManagementInterface.php index 3a686695721b836c470aa228b30f9c36f3f5ffc4..afd19537fd4c3d43b5b12e38313b2122af7a2bf5 100644 --- a/app/code/Magento/Customer/Api/AccountManagementInterface.php +++ b/app/code/Magento/Customer/Api/AccountManagementInterface.php @@ -77,7 +77,7 @@ interface AccountManagementInterface public function isReadonly($customerId); /** - * Activate a customer account using a key that was sent in a confirmation e-mail. + * Activate a customer account using a key that was sent in a confirmation email. * * @api * @param string $email @@ -88,7 +88,7 @@ interface AccountManagementInterface public function activate($email, $confirmationKey); /** - * Activate a customer account using a key that was sent in a confirmation e-mail. + * Activate a customer account using a key that was sent in a confirmation email. * * @api * @param int $customerId diff --git a/app/code/Magento/Customer/Block/Account/AuthorizationLink.php b/app/code/Magento/Customer/Block/Account/AuthorizationLink.php index 395e884137e4cb81d618dfaa5e416ab58a8f9933..a9bf5043c9623bf7f5f83f96316085ce56044077 100644 --- a/app/code/Magento/Customer/Block/Account/AuthorizationLink.php +++ b/app/code/Magento/Customer/Block/Account/AuthorizationLink.php @@ -66,7 +66,7 @@ class AuthorizationLink extends \Magento\Framework\View\Element\Html\Link */ public function getLabel() { - return $this->isLoggedIn() ? __('Log Out') : __('Log In'); + return $this->isLoggedIn() ? __('Sign Out') : __('Sign In'); } /** diff --git a/app/code/Magento/Customer/Block/Account/Dashboard.php b/app/code/Magento/Customer/Block/Account/Dashboard.php index a21e707a0dbf495036138d06619e531cf74b84b1..6c01684645e0a393004b0d9bf32e049ddd3fa530 100644 --- a/app/code/Magento/Customer/Block/Account/Dashboard.php +++ b/app/code/Magento/Customer/Block/Account/Dashboard.php @@ -173,7 +173,7 @@ class Dashboard extends \Magento\Framework\View\Element\Template return __('You subscribe to our newsletter.'); } - return __('You are currently not subscribed to our newsletter.'); + return __('You don\'t subscribe to our newsletter.'); } /** diff --git a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Orders.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Orders.php index b7aafdd4032ed3c18da45f39f1b2ad07ff9c4e33..8387043fc154194ebe8e8ad1e9dcfdf02495f532 100644 --- a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Orders.php +++ b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Orders.php @@ -111,7 +111,7 @@ class Orders extends \Magento\Backend\Block\Widget\Grid\Extended $this->addColumn( 'created_at', - ['header' => __('Purchase Date'), 'index' => 'created_at', 'type' => 'datetime'] + ['header' => __('Purchased'), 'index' => 'created_at', 'type' => 'datetime'] ); $this->addColumn('billing_name', ['header' => __('Bill-to Name'), 'index' => 'billing_name']); diff --git a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Cart.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Cart.php index be1da04628effa45c596846011d03de346883922..b2adb0316d2ab6241e6d08f535627ed0c9d9aa00 100644 --- a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Cart.php +++ b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Cart.php @@ -72,7 +72,7 @@ class Cart extends \Magento\Backend\Block\Widget\Grid\Extended $this->setSortable(false); $this->setPagerVisibility(false); $this->setFilterVisibility(false); - $this->setEmptyText(__('There are no items in customer\'s shopping cart at the moment')); + $this->setEmptyText(__('There are no items in customer\'s shopping cart.')); } /** diff --git a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Orders.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Orders.php index a2750d15538fe31b704c77ea51b58eb809104b27..adc9caffbf026767e76f459fc10cc5117fff8c00 100644 --- a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Orders.php +++ b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Orders.php @@ -95,7 +95,7 @@ class Orders extends \Magento\Backend\Block\Widget\Grid\Extended $this->addColumn( 'created_at', - ['header' => __('Purchase Date'), 'index' => 'created_at', 'type' => 'datetime'] + ['header' => __('Purchased'), 'index' => 'created_at', 'type' => 'datetime'] ); $this->addColumn('billing_name', ['header' => __('Bill-to Name'), 'index' => 'billing_name']); diff --git a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Wishlist.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Wishlist.php index 7dee117053287c40f3a2e043c6b01943e386fcc7..de0c973ddd167162b11ce9935d71263de1954a54 100644 --- a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Wishlist.php +++ b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Wishlist.php @@ -59,7 +59,7 @@ class Wishlist extends \Magento\Backend\Block\Widget\Grid\Extended $this->setSortable(false); $this->setPagerVisibility(false); $this->setFilterVisibility(false); - $this->setEmptyText(__("There are no items in customer's Wish List at the moment.")); + $this->setEmptyText(__('There are no items in customer\'s shopping cart.')); } /** diff --git a/app/code/Magento/Customer/Block/Adminhtml/Sales/Order/Address/Form/Renderer/Vat.php b/app/code/Magento/Customer/Block/Adminhtml/Sales/Order/Address/Form/Renderer/Vat.php index 7d1ec32fa36a67da03fc24ab4a2585a42e2adf3d..211b310cb7a02eaae4b373c6506360a7857943fa 100644 --- a/app/code/Magento/Customer/Block/Adminhtml/Sales/Order/Address/Form/Renderer/Vat.php +++ b/app/code/Magento/Customer/Block/Adminhtml/Sales/Order/Address/Form/Renderer/Vat.php @@ -62,7 +62,7 @@ class Vat extends \Magento\Backend\Block\Widget\Form\Renderer\Fieldset\Element $validateUrl = $this->_urlBuilder->getUrl('customer/system_config_validatevat/validateAdvanced'); $groupMessage = __( - 'The customer is currently assigned to Customer Group %s.' + 'The customer is now assigned to Customer Group %s.' ) . ' ' . __( 'Would you like to change the Customer Group for this order?' ); @@ -82,10 +82,10 @@ class Vat extends \Magento\Backend\Block\Widget\Form\Renderer\Fieldset\Element 'The VAT ID is valid but no Customer Group is assigned for it.' ), 'vatValidAndGroupChangeMessage' => __( - 'Based on the VAT ID, the customer would belong to the Customer Group %s.' + 'Based on the VAT ID, the customer belongs to the Customer Group %s.' ) . "\n" . $groupMessage, 'vatValidationFailedMessage' => __( - 'There was an error validating the VAT ID. ' + 'Something went wrong while validating the VAT ID.' ), 'vatCustomerGroupMessage' => __( 'The customer would belong to Customer Group %s.' diff --git a/app/code/Magento/Customer/Controller/Account/Confirm.php b/app/code/Magento/Customer/Controller/Account/Confirm.php index 0720cc798af618cab576eba082ea956fc42273db..a61347c7b3890b112c7f023d2950d0f895954d91 100644 --- a/app/code/Magento/Customer/Controller/Account/Confirm.php +++ b/app/code/Magento/Customer/Controller/Account/Confirm.php @@ -128,14 +128,14 @@ class Confirm extends \Magento\Customer\Controller\Account if ($this->addressHelper->getTaxCalculationAddressType() == Address::TYPE_SHIPPING) { // @codingStandardsIgnoreStart $message = __( - 'If you are a registered VAT customer, please click <a href="%1">here</a> to enter you shipping address for proper VAT calculation', + 'If you are a registered VAT customer, please click <a href="%1">here</a> to enter your shipping address for proper VAT calculation.', $this->urlModel->getUrl('customer/address/edit') ); // @codingStandardsIgnoreEnd } else { // @codingStandardsIgnoreStart $message = __( - 'If you are a registered VAT customer, please click <a href="%1">here</a> to enter you billing address for proper VAT calculation', + 'If you are a registered VAT customer, please click <a href="%1">here</a> to enter your billing address for proper VAT calculation.', $this->urlModel->getUrl('customer/address/edit') ); // @codingStandardsIgnoreEnd diff --git a/app/code/Magento/Customer/Controller/Account/Confirmation.php b/app/code/Magento/Customer/Controller/Account/Confirmation.php index 3d9121e414e5cc37a479390c7a857a731228a271..0151d9e6b1ec528f55d5fdea04116b73f8f1827d 100644 --- a/app/code/Magento/Customer/Controller/Account/Confirmation.php +++ b/app/code/Magento/Customer/Controller/Account/Confirmation.php @@ -65,7 +65,7 @@ class Confirmation extends \Magento\Customer\Controller\Account $email, $this->storeManager->getStore()->getWebsiteId() ); - $this->messageManager->addSuccess(__('Please, check your email for confirmation key.')); + $this->messageManager->addSuccess(__('Please check your email for confirmation key.')); } catch (InvalidTransitionException $e) { $this->messageManager->addSuccess(__('This email does not require confirmation.')); } catch (\Exception $e) { diff --git a/app/code/Magento/Customer/Controller/Account/CreatePost.php b/app/code/Magento/Customer/Controller/Account/CreatePost.php index c132eb904d1446ff1bc8d49c4068e1675963e968..bad09bdeff30ddfbc28881968f14560b896244c9 100644 --- a/app/code/Magento/Customer/Controller/Account/CreatePost.php +++ b/app/code/Magento/Customer/Controller/Account/CreatePost.php @@ -249,7 +249,7 @@ class CreatePost extends \Magento\Customer\Controller\Account // @codingStandardsIgnoreStart $this->messageManager->addSuccess( __( - 'Account confirmation is required. Please, check your email for the confirmation link. To resend the confirmation email please <a href="%1">click here</a>.', + 'You must confirm your account. Please check your email for the confirmation link or <a href="%1">click here</a> for a new link.', $email ) ); @@ -277,7 +277,7 @@ class CreatePost extends \Magento\Customer\Controller\Account $this->messageManager->addError($this->escaper->escapeHtml($error->getMessage())); } } catch (\Exception $e) { - $this->messageManager->addException($e, __('Cannot save the customer.')); + $this->messageManager->addException($e, __('We can\'t save the customer.')); } $this->_getSession()->setCustomerFormData($this->getRequest()->getPostValue()); @@ -312,14 +312,14 @@ class CreatePost extends \Magento\Customer\Controller\Account if ($this->addressHelper->getTaxCalculationAddressType() == Address::TYPE_SHIPPING) { // @codingStandardsIgnoreStart $message = __( - 'If you are a registered VAT customer, please click <a href="%1">here</a> to enter you shipping address for proper VAT calculation', + 'If you are a registered VAT customer, please <a href="%1">click here</a> to enter your shipping address for proper VAT calculation.', $this->urlModel->getUrl('customer/address/edit') ); // @codingStandardsIgnoreEnd } else { // @codingStandardsIgnoreStart $message = __( - 'If you are a registered VAT customer, please click <a href="%1">here</a> to enter you billing address for proper VAT calculation', + 'If you are a registered VAT customer, please <a href="%1">click here</a> to enter your billing address for proper VAT calculation.', $this->urlModel->getUrl('customer/address/edit') ); // @codingStandardsIgnoreEnd diff --git a/app/code/Magento/Customer/Controller/Account/EditPost.php b/app/code/Magento/Customer/Controller/Account/EditPost.php index c61860f64004def6eb8bc8a72a04d0ea02a2eaf9..e56a0f5d5941e6e9f5e7098c20acaceff8b01735 100644 --- a/app/code/Magento/Customer/Controller/Account/EditPost.php +++ b/app/code/Magento/Customer/Controller/Account/EditPost.php @@ -97,14 +97,14 @@ class EditPost extends \Magento\Customer\Controller\Account } catch (\Exception $e) { $this->messageManager->addException( $e, - __('A problem was encountered trying to change password.') + __('Something went wrong while changing the password.') ); } } else { - $this->messageManager->addError(__('Confirm your new password')); + $this->messageManager->addError(__('Confirm your new password.')); } } else { - $this->messageManager->addError(__('New password field cannot be empty.')); + $this->messageManager->addError(__('Please enter new password.')); } } @@ -117,7 +117,7 @@ class EditPost extends \Magento\Customer\Controller\Account } catch (\Exception $e) { $this->messageManager->addException( $e, - __('Cannot save the customer.') . $e->getMessage() . '<pre>' . $e->getTraceAsString() . '</pre>' + __('We can\'t save the customer.') . $e->getMessage() . '<pre>' . $e->getTraceAsString() . '</pre>' ); } @@ -127,7 +127,7 @@ class EditPost extends \Magento\Customer\Controller\Account return $resultRedirect; } - $this->messageManager->addSuccess(__('The account information has been saved.')); + $this->messageManager->addSuccess(__('You saved the account information.')); $resultRedirect->setPath('customer/account'); return $resultRedirect; } diff --git a/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php b/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php index fc391f4143525b23d8e88590fa2c5065eeeed664..89b3b2384bea9e03bb73476250d591f1b1afb957 100644 --- a/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php +++ b/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php @@ -67,18 +67,12 @@ class ForgotPasswordPost extends \Magento\Customer\Controller\Account } catch (NoSuchEntityException $e) { // Do nothing, we don't want anyone to use this action to determine which email accounts are registered. } catch (\Exception $exception) { - $this->messageManager->addException($exception, __('Unable to send password reset email.')); + $this->messageManager->addException($exception, __('We\'re unable to send the password reset email.')); $resultRedirect->setPath('*/*/forgotpassword'); return $resultRedirect; } - $email = $this->escaper->escapeHtml($email); // @codingStandardsIgnoreStart - $this->messageManager->addSuccess( - __( - 'If there is an account associated with %1 you will receive an email with a link to reset your password.', - $email - ) - ); + $this->messageManager->addSuccess(__('We\'ll email you a link to reset your password.')); // @codingStandardsIgnoreEnd $resultRedirect->setPath('*/*/'); return $resultRedirect; diff --git a/app/code/Magento/Customer/Controller/Account/LoginPost.php b/app/code/Magento/Customer/Controller/Account/LoginPost.php index 500a2f7b68302ee573f84a0ac597b551c899e36b..a89e64718ffb2554a2e79cf472762fa56c364a82 100644 --- a/app/code/Magento/Customer/Controller/Account/LoginPost.php +++ b/app/code/Magento/Customer/Controller/Account/LoginPost.php @@ -99,10 +99,12 @@ class LoginPost extends \Magento\Customer\Controller\Account $this->messageManager->addError($message); $this->_getSession()->setUsername($login['username']); } catch (\Exception $e) { - $this->messageManager->addError(__('There was an error validating the login and password.')); + $this->messageManager->addError( + __('Something went wrong while validating the login and password.') + ); } } else { - $this->messageManager->addError(__('Login and password are required.')); + $this->messageManager->addError(__('A login and a password are required.')); } } diff --git a/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php b/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php index 2d53034cb6897e21849bed76fdb2a9e80a02ab33..08c8f70675db5a4f34a3d0280627b978afd2cfc1 100644 --- a/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php +++ b/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php @@ -61,7 +61,7 @@ class ResetPasswordPost extends \Magento\Customer\Controller\Account return $resultRedirect; } if (iconv_strlen($password) <= 0) { - $this->messageManager->addError(__('New password field cannot be empty.')); + $this->messageManager->addError(__('Please enter a new password.')); $resultRedirect->setPath('*/*/createPassword', ['id' => $customerId, 'token' => $resetPasswordToken]); return $resultRedirect; } @@ -69,11 +69,11 @@ class ResetPasswordPost extends \Magento\Customer\Controller\Account try { $customerEmail = $this->customerRepository->getById($customerId)->getEmail(); $this->accountManagement->resetPassword($customerEmail, $resetPasswordToken, $password); - $this->messageManager->addSuccess(__('Your password has been updated.')); + $this->messageManager->addSuccess(__('You updated your password.')); $resultRedirect->setPath('*/*/login'); return $resultRedirect; } catch (\Exception $exception) { - $this->messageManager->addError(__('There was an error saving the new password.')); + $this->messageManager->addError(__('Something went wrong while saving the new password.')); $resultRedirect->setPath('*/*/createPassword', ['id' => $customerId, 'token' => $resetPasswordToken]); return $resultRedirect; } diff --git a/app/code/Magento/Customer/Controller/Address/Delete.php b/app/code/Magento/Customer/Controller/Address/Delete.php index 6df5648c821c5405f09966d15039114428dfbc41..6dfa17be32b107e723e9ec81f359eee0230085dc 100644 --- a/app/code/Magento/Customer/Controller/Address/Delete.php +++ b/app/code/Magento/Customer/Controller/Address/Delete.php @@ -20,7 +20,7 @@ class Delete extends \Magento\Customer\Controller\Address $address = $this->_addressRepository->getById($addressId); if ($address->getCustomerId() === $this->_getSession()->getCustomerId()) { $this->_addressRepository->deleteById($addressId); - $this->messageManager->addSuccess(__('The address has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the address.')); } else { $this->messageManager->addError(__('We can\'t delete the address right now.')); } diff --git a/app/code/Magento/Customer/Controller/Address/FormPost.php b/app/code/Magento/Customer/Controller/Address/FormPost.php index 86af07c52935b87ffde0dbac2cf428896b9c693b..1cb96534130e2ba57f3ca6dda9ac4e2d278e42ed 100644 --- a/app/code/Magento/Customer/Controller/Address/FormPost.php +++ b/app/code/Magento/Customer/Controller/Address/FormPost.php @@ -89,7 +89,7 @@ class FormPost extends \Magento\Customer\Controller\Address try { $address = $this->_extractAddress(); $this->_addressRepository->save($address); - $this->messageManager->addSuccess(__('The address has been saved.')); + $this->messageManager->addSuccess(__('You saved the address.')); $url = $this->_buildUrl('*/*/index', ['_secure' => true]); return $this->resultRedirectFactory->create()->setUrl($this->_redirect->success($url)); } catch (InputException $e) { @@ -98,7 +98,7 @@ class FormPost extends \Magento\Customer\Controller\Address $this->messageManager->addError($error->getMessage()); } } catch (\Exception $e) { - $this->messageManager->addException($e, __('Cannot save address.')); + $this->messageManager->addException($e, __('We can\'t save the address.')); } $this->_getSession()->setAddressFormData($this->getRequest()->getPostValue()); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Group/Delete.php b/app/code/Magento/Customer/Controller/Adminhtml/Group/Delete.php index 60cbfe172b0e6dd71cf348826daa1142ebe47b92..17af771114ffc3fce19876b555d276d7ca4e1434 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Group/Delete.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Group/Delete.php @@ -23,7 +23,7 @@ class Delete extends \Magento\Customer\Controller\Adminhtml\Group if ($id) { try { $this->groupRepository->deleteById($id); - $this->messageManager->addSuccess(__('The customer group has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the customer group.')); } catch (NoSuchEntityException $e) { $this->messageManager->addError(__('The customer group no longer exists.')); return $resultRedirect->setPath('customer/*/'); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Group/Save.php b/app/code/Magento/Customer/Controller/Adminhtml/Group/Save.php index 614abdb1c686cccd324c4f44c5dfa8ddf2679e2a..a842d8653b3398a5effa2d4b8872849b50b3abcc 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Group/Save.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Group/Save.php @@ -91,7 +91,7 @@ class Save extends \Magento\Customer\Controller\Adminhtml\Group $this->groupRepository->save($customerGroup); - $this->messageManager->addSuccess(__('The customer group has been saved.')); + $this->messageManager->addSuccess(__('You saved the customer group.')); $resultRedirect->setPath('customer/group'); } catch (\Exception $e) { $this->messageManager->addError($e->getMessage()); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Edit.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Edit.php index cc024c507011aa41f6258ff83748fd9e06840e61..7a0fa4df782dc926d4e7240ef69144c73cb043c1 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Edit.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Edit.php @@ -42,7 +42,7 @@ class Edit extends \Magento\Customer\Controller\Adminhtml\Index //do nothing } } catch (NoSuchEntityException $e) { - $this->messageManager->addException($e, __('An error occurred while editing the customer.')); + $this->messageManager->addException($e, __('Something went wrong while editing the customer.')); $resultRedirect = $this->resultRedirectFactory->create(); $resultRedirect->setPath('customer/*/index'); return $resultRedirect; diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/ResetPassword.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/ResetPassword.php index bd74b364b82266759ee55ee967a9327293e5a396..c330eedde0fff30bc960dcacaa7c7e3867690fe1 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/ResetPassword.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/ResetPassword.php @@ -30,7 +30,7 @@ class ResetPassword extends \Magento\Customer\Controller\Adminhtml\Index \Magento\Customer\Model\AccountManagement::EMAIL_REMINDER, $customer->getWebsiteId() ); - $this->messageManager->addSuccess(__('Customer will receive an email with a link to reset password.')); + $this->messageManager->addSuccess(__('The customer will receive an email with a link to reset password.')); } catch (NoSuchEntityException $exception) { $resultRedirect->setPath('customer/index'); return $resultRedirect; @@ -43,7 +43,7 @@ class ResetPassword extends \Magento\Customer\Controller\Adminhtml\Index } catch (\Exception $exception) { $this->messageManager->addException( $exception, - __('An error occurred while resetting customer password.') + __('Something went wrong while resetting customer password.') ); } $resultRedirect->setPath( diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php index 986895f4d7c23234f56bb3f03f101f1b39cb324b..7e5dfa946452313a05977bd4a94d0870246e782a 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php @@ -269,7 +269,7 @@ class Save extends \Magento\Customer\Controller\Adminhtml\Index $this->_getSession()->setCustomerData($originalRequestData); $returnToEdit = true; } catch (\Exception $exception) { - $this->messageManager->addException($exception, __('An error occurred while saving the customer.')); + $this->messageManager->addException($exception, __('Something went wrong while saving the customer.')); $this->_getSession()->setCustomerData($originalRequestData); $returnToEdit = true; } diff --git a/app/code/Magento/Customer/Controller/Ajax/Login.php b/app/code/Magento/Customer/Controller/Ajax/Login.php index ef8cf2cef15ee5ef9d5886149250484b5bc56d1a..8491d5b08e4092774ed5b441d6d0010c63456c80 100644 --- a/app/code/Magento/Customer/Controller/Ajax/Login.php +++ b/app/code/Magento/Customer/Controller/Ajax/Login.php @@ -116,7 +116,7 @@ class Login extends \Magento\Framework\App\Action\Action } catch (\Exception $e) { $response = [ 'errors' => true, - 'message' => __('There was an error validating the username and password.') + 'message' => __('Something went wrong while validating the login and password.') ]; } /** @var \Magento\Framework\Controller\Result\Json $resultJson */ diff --git a/app/code/Magento/Customer/Model/AccountManagement.php b/app/code/Magento/Customer/Model/AccountManagement.php index 75ca7bdf731e07db9fddf8c6c1e9419ba83e0197..faa64b8140b07e4b0d6818bc40a8a78c0f4cce81 100644 --- a/app/code/Magento/Customer/Model/AccountManagement.php +++ b/app/code/Magento/Customer/Model/AccountManagement.php @@ -326,11 +326,13 @@ class AccountManagement implements AccountManagementInterface } /** - * Activate a customer account using a key that was sent in a confirmation e-mail. + * Activate a customer account using a key that was sent in a confirmation email. * * @param \Magento\Customer\Api\Data\CustomerInterface $customer * @param string $confirmationKey * @return \Magento\Customer\Api\Data\CustomerInterface + * @throws \Magento\Framework\Exception\State\InvalidTransitionException + * @throws \Magento\Framework\Exception\State\InputMismatchException */ private function activateCustomer($customer, $confirmationKey) { @@ -494,7 +496,7 @@ class AccountManagement implements AccountManagementInterface $websiteId = $customer->getWebsiteId(); if ($this->isCustomerInStore($websiteId, $customer->getStoreId())) { - throw new InputException(__('Customer already exists in this store.')); + throw new InputException(__('This customer already exists in this store.')); } // Existing password hash will be used from secured customer data registry when saving customer } @@ -514,7 +516,7 @@ class AccountManagement implements AccountManagementInterface $customer = $this->customerRepository->save($customer, $hash); } catch (AlreadyExistsException $e) { throw new InputMismatchException( - __('Customer with the same email already exists in associated website.') + __('A customer with the same email already exists in an associated website.') ); } catch (LocalizedException $e) { throw $e; @@ -620,7 +622,7 @@ class AccountManagement implements AccountManagementInterface $hash = $customerSecure->getPasswordHash(); if (!$this->encryptor->validateHash($currentPassword, $hash)) { throw new InvalidEmailOrPasswordException( - __('Password doesn\'t match for this account.')); + __('The password doesn\'t match this account.')); } $customerSecure->setRpToken(null); $customerSecure->setRpTokenCreatedAt(null); @@ -650,13 +652,13 @@ class AccountManagement implements AccountManagementInterface if ($length < self::MIN_PASSWORD_LENGTH) { throw new InputException( __( - 'The password must have at least %1 characters.', + 'Please enter a password with at least %1 characters.', self::MIN_PASSWORD_LENGTH ) ); } if ($this->stringHelper->strlen(trim($password)) != $length) { - throw new InputException(__('The password can not begin or end with a space.')); + throw new InputException(__('The password can\'t begin or end with a space.')); } } @@ -806,7 +808,9 @@ class AccountManagement implements AccountManagementInterface $types = $this->getTemplateTypes(); if (!isset($types[$type])) { - throw new \Magento\Framework\Exception\LocalizedException(__('Wrong transactional account email type')); + throw new \Magento\Framework\Exception\LocalizedException( + __('Please correct the transactional account email type.') + ); } if (!$storeId) { diff --git a/app/code/Magento/Customer/Model/Config/Share.php b/app/code/Magento/Customer/Model/Config/Share.php index 8af6d52a9891dac9edb85a667a6595202467fe7c..2b1cddc76719819d63676936773930ae826aa671 100644 --- a/app/code/Magento/Customer/Model/Config/Share.php +++ b/app/code/Magento/Customer/Model/Config/Share.php @@ -108,7 +108,7 @@ class Share extends \Magento\Framework\App\Config\Value implements \Magento\Fram //@codingStandardsIgnoreStart throw new \Magento\Framework\Exception\LocalizedException( __( - 'Cannot share customer accounts globally because some customer accounts with the same emails exist on multiple websites and cannot be merged.' + 'We can\'t share customer accounts globally when the accounts share identical email addresses on more than one website.' ) ); //@codingStandardsIgnoreEnd diff --git a/app/code/Magento/Customer/Model/Customer.php b/app/code/Magento/Customer/Model/Customer.php index c00ab143dde9c09b8d427ea81a4570b38f2e478e..6cc9db5d12676b11ee38d47310a7a4a9d225d844 100644 --- a/app/code/Magento/Customer/Model/Customer.php +++ b/app/code/Magento/Customer/Model/Customer.php @@ -781,7 +781,9 @@ class Customer extends \Magento\Framework\Model\AbstractModel $types = $this->getTemplateTypes(); if (!isset($types[$type])) { - throw new \Magento\Framework\Exception\LocalizedException(__('Wrong transactional account email type')); + throw new \Magento\Framework\Exception\LocalizedException( + __('Please correct the transactional account email type.') + ); } if (!$storeId) { @@ -1024,15 +1026,15 @@ class Customer extends \Magento\Framework\Model\AbstractModel $entityType = $this->_config->getEntityType('customer'); $attribute = $this->_config->getAttribute($entityType, 'dob'); if ($attribute->getIsRequired() && '' == trim($this->getDob())) { - $errors[] = __('The Date of Birth is required.'); + $errors[] = __('Please enter a date of birth.'); } $attribute = $this->_config->getAttribute($entityType, 'taxvat'); if ($attribute->getIsRequired() && '' == trim($this->getTaxvat())) { - $errors[] = __('The TAX/VAT number is required.'); + $errors[] = __('Please enter a TAX/VAT number.'); } $attribute = $this->_config->getAttribute($entityType, 'gender'); if ($attribute->getIsRequired() && '' == trim($this->getGender())) { - $errors[] = __('Gender is required.'); + $errors[] = __('Please enter a gender.'); } $transport = new \Magento\Framework\Object( @@ -1264,7 +1266,7 @@ class Customer extends \Magento\Framework\Model\AbstractModel { if (!is_string($passwordLinkToken) || empty($passwordLinkToken)) { throw new AuthenticationException( - __('Invalid password reset token.') + __('Please enter a valid password reset token.') ); } $this->_getResource()->changeResetPasswordLinkToken($this, $passwordLinkToken); diff --git a/app/code/Magento/Customer/Model/Customer/Attribute/Backend/Password.php b/app/code/Magento/Customer/Model/Customer/Attribute/Backend/Password.php index 23ebcb64d01388ba83576cf209b442656394592b..992c63cf893f541fef9b1458542cd922b5a7e433 100644 --- a/app/code/Magento/Customer/Model/Customer/Attribute/Backend/Password.php +++ b/app/code/Magento/Customer/Model/Customer/Attribute/Backend/Password.php @@ -49,7 +49,7 @@ class Password extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBacke if ($length > 0) { if ($length < self::MIN_PASSWORD_LENGTH) { throw new LocalizedException( - __('The password must have at least %1 characters.', self::MIN_PASSWORD_LENGTH) + __('Please enter a password with at least %1 characters.', self::MIN_PASSWORD_LENGTH) ); } @@ -63,7 +63,7 @@ class Password extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBacke 1 ) == ' ' ) { - throw new LocalizedException(__('The password can not begin or end with a space.')); + throw new LocalizedException(__('The password can\'t begin or end with a space.')); } $object->setPasswordHash($object->hashPassword($password)); diff --git a/app/code/Magento/Customer/Model/Resource/Customer.php b/app/code/Magento/Customer/Model/Resource/Customer.php index 57da7ca88c578f5c10e00f78583dfd9846289313..682e429411b7806b6c4695fcacaaecade20a7c88 100644 --- a/app/code/Magento/Customer/Model/Resource/Customer.php +++ b/app/code/Magento/Customer/Model/Resource/Customer.php @@ -82,7 +82,7 @@ class Customer extends \Magento\Eav\Model\Entity\AbstractEntity parent::_beforeSave($customer); if (!$customer->getEmail()) { - throw new ValidatorException(__('Customer email is required')); + throw new ValidatorException(__('Please enter a customer email.')); } $adapter = $this->_getWriteAdapter(); @@ -106,7 +106,7 @@ class Customer extends \Magento\Eav\Model\Entity\AbstractEntity $result = $adapter->fetchOne($select, $bind); if ($result) { throw new AlreadyExistsException( - __('Customer with the same email already exists in associated website.') + __('A customer with the same email already exists in an associated website.') ); } @@ -254,7 +254,7 @@ class Customer extends \Magento\Eav\Model\Entity\AbstractEntity if ($customer->getSharingConfig()->isWebsiteScope()) { if (!$customer->hasData('website_id')) { throw new \Magento\Framework\Exception\LocalizedException( - __('Customer website ID must be specified when using the website scope') + __('A customer website ID must be specified when using the website scope.') ); } $bind['website_id'] = (int)$customer->getWebsiteId(); diff --git a/app/code/Magento/Customer/Model/Resource/Group.php b/app/code/Magento/Customer/Model/Resource/Group.php index 49b79e0fe776c3107133ffaa8def71d3270af7fe..6dc9888d7715024c2edb1d84158b0407df5a79c5 100644 --- a/app/code/Magento/Customer/Model/Resource/Group.php +++ b/app/code/Magento/Customer/Model/Resource/Group.php @@ -74,7 +74,7 @@ class Group extends \Magento\Framework\Model\Resource\Db\AbstractDb { if ($group->usesAsDefault()) { throw new \Magento\Framework\Exception\LocalizedException( - __('The group "%1" cannot be deleted', $group->getCode()) + __('You can\'t delete group "%1".', $group->getCode()) ); } return parent::_beforeDelete($group); diff --git a/app/code/Magento/Customer/Test/Unit/Block/Account/AuthorizationLinkTest.php b/app/code/Magento/Customer/Test/Unit/Block/Account/AuthorizationLinkTest.php index 55580fc8bcfe9ae76ba1d1a63e1a46bfbde547cb..3d74163212f6a76d521f9d1b3751cac6dc06a197 100644 --- a/app/code/Magento/Customer/Test/Unit/Block/Account/AuthorizationLinkTest.php +++ b/app/code/Magento/Customer/Test/Unit/Block/Account/AuthorizationLinkTest.php @@ -59,7 +59,7 @@ class AuthorizationLinkTest extends \PHPUnit_Framework_TestCase ->method('getValue') ->will($this->returnValue(true)); - $this->assertEquals('Log Out', $this->_block->getLabel()); + $this->assertEquals('Sign Out', $this->_block->getLabel()); } public function testGetLabelLoggedOut() @@ -68,7 +68,7 @@ class AuthorizationLinkTest extends \PHPUnit_Framework_TestCase ->method('getValue') ->will($this->returnValue(false)); - $this->assertEquals('Log In', $this->_block->getLabel()); + $this->assertEquals('Sign In', $this->_block->getLabel()); } public function testGetHrefLoggedIn() diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php index 5cd7ecfbdc66c79def68545b8fcb1d7e634566b8..f3dee06b411415dc659cc43419cf585aef909165 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php @@ -317,8 +317,8 @@ class ConfirmTest extends \PHPUnit_Framework_TestCase { return [ [1, 1, false, null, __('Thank you for registering with')], - [1, 1, true, Address::TYPE_BILLING, __('enter you billing address for proper VAT calculation')], - [1, 1, true, Address::TYPE_SHIPPING, __('enter you shipping address for proper VAT calculation')], + [1, 1, true, Address::TYPE_BILLING, __('enter your billing address for proper VAT calculation')], + [1, 1, true, Address::TYPE_SHIPPING, __('enter your shipping address for proper VAT calculation')], ]; } diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePostTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePostTest.php index 41115e5ac8649409c8c6f1bb8499955edbd5b7b1..c765dc83939220720c4c397a09c333fd852ddfdc 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePostTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePostTest.php @@ -407,7 +407,7 @@ class CreatePostTest extends \PHPUnit_Framework_TestCase AccountManagementInterface::ACCOUNT_CONFIRMATION_REQUIRED, false, Address::TYPE_SHIPPING, - 'Account confirmation is required', + 'An account confirmation is required', ], [ 1, diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php index eabe54ae5d46deb4fca77f3c0a8ebb8f7c06a3e4..60cf3b1348f7d343caa99a262db581d9a2caf452 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/EditPostTest.php @@ -397,7 +397,7 @@ class EditPostTest extends \PHPUnit_Framework_TestCase $this->messageManager ->expects($this->once()) ->method('addSuccess') - ->with('The account information has been saved.'); + ->with('You saved the account information.'); $this->redirectResultMock ->expects($this->once()) diff --git a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ResetPasswordTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ResetPasswordTest.php index 336877afcab7e52e0061276a6014abf672a8b9bf..a4a9df750dceb1cf517cb53faf1e841dc8058c2b 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ResetPasswordTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/ResetPasswordTest.php @@ -396,7 +396,7 @@ class ResetPasswordTest extends \PHPUnit_Framework_TestCase 'addException' )->with( $this->equalTo($exception), - $this->equalTo('An error occurred while resetting customer password.') + $this->equalTo('Something went wrong while resetting customer password.') ); $this->_testedObject->execute(); @@ -455,7 +455,7 @@ class ResetPasswordTest extends \PHPUnit_Framework_TestCase )->method( 'addSuccess' )->with( - $this->equalTo('Customer will receive an email with a link to reset password.') + $this->equalTo('The customer will receive an email with a link to reset password.') ); // verify redirect diff --git a/app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php b/app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php index eeaa18aa02bd24ec917371b4752424dd5bfeac58..a1a684f9c71aa91d26856187e0d5f9a2e7682bcf 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php @@ -171,16 +171,16 @@ class CustomerTest extends \PHPUnit_Framework_TestCase array_merge($data, ['email' => 'wrong@email']), ['Please correct this email address: "wrong@email".'] ], - [array_diff_key($data, ['dob' => '']), ['The Date of Birth is required.']], - [array_diff_key($data, ['taxvat' => '']), ['The TAX/VAT number is required.']], - [array_diff_key($data, ['gender' => '']), ['Gender is required.']], + [array_diff_key($data, ['dob' => '']), ['Please enter a date of birth.']], + [array_diff_key($data, ['taxvat' => '']), ['Please enter a TAX/VAT number.']], + [array_diff_key($data, ['gender' => '']), ['Please enter a gender.']], [$data, true], ]; } /** * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Wrong transactional account email type + * @expectedExceptionMessage Please correct the transactional account email type. */ public function testSendNewAccountEmailException() { diff --git a/app/code/Magento/Customer/etc/adminhtml/system.xml b/app/code/Magento/Customer/etc/adminhtml/system.xml index f79f0e9db3f075503499f38478ffc3b1e88980f7..8ccba94947f04b0b2b1b42eafb5803482b29acc3 100644 --- a/app/code/Magento/Customer/etc/adminhtml/system.xml +++ b/app/code/Magento/Customer/etc/adminhtml/system.xml @@ -82,8 +82,8 @@ <backend_model>Magento\Customer\Model\Config\Backend\CreateAccount\DisableAutoGroupAssignDefault</backend_model> </field> <field id="vat_frontend_visibility" translate="label" type="select" sortOrder="58" showInDefault="1" showInWebsite="1" showInStore="0"> - <label>Show VAT Number on Frontend</label> - <comment>To show VAT number on frontend, set Show VAT Number on Frontend option to Yes.</comment> + <label>Show VAT Number on Storefront</label> + <comment>To show VAT number on Storefront, set "Show VAT Number on Storefront" option to Yes.</comment> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> </field> <field id="email_domain" translate="label" type="text" sortOrder="60" showInDefault="1" showInWebsite="1" showInStore="1"> diff --git a/app/code/Magento/Customer/view/adminhtml/templates/system/config/validatevat.phtml b/app/code/Magento/Customer/view/adminhtml/templates/system/config/validatevat.phtml index 56f09823bb3b4e6ffe731a5e3ba735012a880979..5fc873ad7490db438e78e4aa3229dc889ea634bd 100644 --- a/app/code/Magento/Customer/view/adminhtml/templates/system/config/validatevat.phtml +++ b/app/code/Magento/Customer/view/adminhtml/templates/system/config/validatevat.phtml @@ -27,11 +27,11 @@ require(['prototype'], function(){ new Ajax.Request('<?php echo $block->getAjaxUrl() ?>', { parameters: params, onSuccess: function(response) { - result = '<?php echo __('VAT Number is Invalid') ?>'; + result = '<?php echo __('Please enter a valid VAT number.') ?>'; try { response = response.responseText; if (response == 1) { - result = '<?php echo __('VAT Number is Valid') ?>'; + result = '<?php echo __('VAT Number is valid.') ?>'; validationMessage.removeClassName('hidden').addClassName('success') } else { validationMessage.removeClassName('hidden').addClassName('error') diff --git a/app/code/Magento/Customer/view/adminhtml/templates/tab/view/personal_info.phtml b/app/code/Magento/Customer/view/adminhtml/templates/tab/view/personal_info.phtml index 90d849d33f5d0fdeb7c7005cac40cc1973e23692..eb03596398341b2fb9ccf8d8e65aa197f58091bf 100644 --- a/app/code/Magento/Customer/view/adminhtml/templates/tab/view/personal_info.phtml +++ b/app/code/Magento/Customer/view/adminhtml/templates/tab/view/personal_info.phtml @@ -39,7 +39,7 @@ $createDateStore = $block->getStoreCreateDate(); <td><?php echo $block->getIsConfirmedStatus() ?></td> </tr> <tr> - <th><?php echo __('Account Created on:') ?></th> + <th><?php echo __('Account Created:') ?></th> <td><?php echo $createDateAdmin ?></td> </tr> <?php if ($createDateAdmin != $createDateStore): ?> diff --git a/app/code/Magento/Customer/view/email/account_new.html b/app/code/Magento/Customer/view/email/account_new.html index a979c99c42e866e872d94f2b1f0b85715647c30a..86344c09ced23b0ccf1e7a9bd8740f18c1c361bb 100644 --- a/app/code/Magento/Customer/view/email/account_new.html +++ b/app/code/Magento/Customer/view/email/account_new.html @@ -33,14 +33,14 @@ body,td { color:#2f2f2f; font:11px/1.35em Verdana, Arial, Helvetica, sans-serif; <tr> <td valign="top"> <h1 style="font-size:22px; font-weight:normal; line-height:22px; margin:0 0 11px 0;">Dear {{escapehtml var=$customer.name}},</h1> - <p style="font-size:12px; line-height:16px; margin:0 0 16px 0;">Welcome to {{var store.getFrontendName()}}. To log in when visiting our site just click <a href="{{store url='customer/account/'}}" style="color:#1E7EC8;">Login</a> or <a href="{{store url='customer/account/'}}" style="color:#1E7EC8;">My Account</a> at the top of every page, and then enter your e-mail address and password.</p> + <p style="font-size:12px; line-height:16px; margin:0 0 16px 0;">Welcome to {{var store.getFrontendName()}}. To sign in when visiting our site just click <a href="{{store url='customer/account/'}}" style="color:#1E7EC8;">Login</a> or <a href="{{store url='customer/account/'}}" style="color:#1E7EC8;">My Account</a> at the top of every page, and then enter your email address and password.</p> <p style="border:1px solid #E0E0E0; font-size:12px; line-height:16px; margin:0; padding:13px 18px; background:#f9f9f9;"> - Use the following values when prompted to log in:<br/> - <strong>E-mail</strong>: {{var customer.email}}<br/> + Use the following values when prompted to sign in:<br/> + <strong>Email</strong>: {{var customer.email}}<br/> <strong>Password</strong>: Only you know that! (Hint: It’s the password you created at {{var store.getFrontendName()}})<br/> Forgot your Account password? No problems. Click <a href="{{store url='customer/account/createPassword/' _query_id=$customer.id _query_token=$customer.rp_token}}">here</a> to reset it.</p> </p> - <p style="font-size:12px; line-height:16px; margin:0 0 8px 0;">When you log in to your account, you will be able to do the following:</p> + <p style="font-size:12px; line-height:16px; margin:0 0 8px 0;">When you sign in to your account, you will be able to do the following:</p> <ul style="font-size:12px; line-height:16px; margin:0 0 16px 0; padding:0;"> <li style="list-style:none inside; padding:0 0 0 10px;">– Proceed through checkout faster when making a purchase</li> <li style="list-style:none inside; padding:0 0 0 10px;">– Check the status of orders</li> diff --git a/app/code/Magento/Customer/view/email/account_new_confirmation.html b/app/code/Magento/Customer/view/email/account_new_confirmation.html index 8e36cd4940ed1e5355a14dfca01bfa2eb440fe3a..501f45ed0f8576923ab537d11da7ffcd75a36efe 100644 --- a/app/code/Magento/Customer/view/email/account_new_confirmation.html +++ b/app/code/Magento/Customer/view/email/account_new_confirmation.html @@ -36,11 +36,11 @@ body,td { color:#2f2f2f; font:11px/1.35em Verdana, Arial, Helvetica, sans-serif; <tr> <td valign="top"> <h1 style="font-size:22px; font-weight:normal; line-height:22px; margin:0 0 11px 0;">Dear {{escapehtml var=$customer.name}},</h1> - <p style="font-size:12px; line-height:16px; margin:0 0 16px 0;">Your e-mail {{var customer.email}} must be confirmed before using it to log in to our store.</p> - <p style="font-size:12px; line-height:16px; margin:0 0 8px 0;">To confirm the e-mail and instantly log in, please, use <a href="{{store url="customer/account/confirm/" _query_id=$customer.id _query_key=$customer.confirmation _query_back_url=$back_url}}" style="color:#1E7EC8;">this confirmation link</a>. This link is valid only once.</p> + <p style="font-size:12px; line-height:16px; margin:0 0 16px 0;">Your email {{var customer.email}} must be confirmed before using it to sign in to our store.</p> + <p style="font-size:12px; line-height:16px; margin:0 0 8px 0;">To confirm the email and instantly sign in, please, use <a href="{{store url="customer/account/confirm/" _query_id=$customer.id _query_key=$customer.confirmation _query_back_url=$back_url}}" style="color:#1E7EC8;">this confirmation link</a>. This link is valid only once.</p> <p style="border:1px solid #E0E0E0; font-size:12px; line-height:16px; margin:0 0 16px 0; padding:13px 18px; background:#f9f9f9;"> - Use the following values when prompted to log in:<br/> - <strong>E-mail:</strong> {{var customer.email}}<br/> + Use the following values when prompted to sign in:<br/> + <strong>Email:</strong> {{var customer.email}}<br/> <strong>Password:</strong> Only you know that! (Hint: It’s the password you created at {{var store.getFrontendName()|escape}})<br/> Forgot your Account password? No problems. Click <a href="{{store url="customer/account/createPassword/" _query_id=$customer.id _query_token=$customer.rp_token}}">here</a> to reset it. </p> diff --git a/app/code/Magento/Customer/view/email/account_new_confirmed.html b/app/code/Magento/Customer/view/email/account_new_confirmed.html index 14d5a488015ba127a907f5621e35a25ee1fe08e6..e6b7f3e93799b8efa624c3410ced72a97328b514 100644 --- a/app/code/Magento/Customer/view/email/account_new_confirmed.html +++ b/app/code/Magento/Customer/view/email/account_new_confirmed.html @@ -33,8 +33,8 @@ body,td { color:#2f2f2f; font:11px/1.35em Verdana, Arial, Helvetica, sans-serif; <tr> <td valign="top"> <h1 style="font-size:22px; font-weight:normal; line-height:22px; margin:0 0 11px 0;">Dear {{escapehtml var=$customer.name}},</h1> - <p style="font-size:12px; line-height:16px; margin:0 0 16px 0;">Welcome to {{var store.getFrontendName()}}. To log in when visiting our site just click <a href="{{store url="customer/account/"}}" style="color:#1E7EC8;">Login</a> or <a href="{{store url="customer/account/"}}" style="color:#1E7EC8;">My Account</a> at the top of every page, and then enter your e-mail address and password.</p> - <p style="font-size:12px; line-height:16px; margin:0 0 8px 0;">When you log in to your account, you will be able to do the following:</p> + <p style="font-size:12px; line-height:16px; margin:0 0 16px 0;">Welcome to {{var store.getFrontendName()}}. To sign in when visiting our site just click <a href="{{store url="customer/account/"}}" style="color:#1E7EC8;">Sign In</a> or <a href="{{store url="customer/account/"}}" style="color:#1E7EC8;">My Account</a> at the top of every page, and then enter your email address and password.</p> + <p style="font-size:12px; line-height:16px; margin:0 0 8px 0;">When you sign in to your account, you will be able to do the following:</p> <ul style="font-size:12px; line-height:16px; margin:0 0 16px 0; padding:0;"> <li style="list-style:none inside; padding:0 0 0 10px;">– Proceed through checkout faster when making a purchase</li> <li style="list-style:none inside; padding:0 0 0 10px;">– Check the status of orders</li> diff --git a/app/code/Magento/Customer/view/frontend/layout/customer_account_logoutsuccess.xml b/app/code/Magento/Customer/view/frontend/layout/customer_account_logoutsuccess.xml index 9d94c7ef08df3124c67ad0e2725ae8abe1996326..adebacc5bacce04aada49bef761031890956b214 100644 --- a/app/code/Magento/Customer/view/frontend/layout/customer_account_logoutsuccess.xml +++ b/app/code/Magento/Customer/view/frontend/layout/customer_account_logoutsuccess.xml @@ -9,7 +9,7 @@ <body> <referenceBlock name="page.main.title"> <action method="setPageTitle"> - <argument name="title" translate="true" xsi:type="string">You are now logged out</argument> + <argument name="title" translate="true" xsi:type="string">You are signed out.</argument> </action> </referenceBlock> <referenceContainer name="content"> diff --git a/app/code/Magento/Customer/view/frontend/layout/default.xml b/app/code/Magento/Customer/view/frontend/layout/default.xml index 9e45480b4fc2dbf7b1d9041f6d6b9e99e40659ab..fa2df7eb340a2ea9fdb3b117e51f7ce6c988f215 100644 --- a/app/code/Magento/Customer/view/frontend/layout/default.xml +++ b/app/code/Magento/Customer/view/frontend/layout/default.xml @@ -15,7 +15,7 @@ </block> <block class="Magento\Customer\Block\Account\RegisterLink" name="register-link"> <arguments> - <argument name="label" xsi:type="string" translate="true">Register</argument> + <argument name="label" xsi:type="string" translate="true">Create an Account</argument> </arguments> </block> <block class="Magento\Customer\Block\Account\AuthorizationLink" name="authorization-link" diff --git a/app/code/Magento/Customer/view/frontend/templates/account/dashboard/info.phtml b/app/code/Magento/Customer/view/frontend/templates/account/dashboard/info.phtml index af711971ec3bbd264a66a601212c0a3a81a3d848..6659f62b175c436698a22d53b82f25ff94d15e7c 100644 --- a/app/code/Magento/Customer/view/frontend/templates/account/dashboard/info.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/account/dashboard/info.phtml @@ -38,9 +38,9 @@ <div class="box-content"> <p> <?php if ($block->getIsSubscribed()): ?> - <?php echo __("You are currently subscribed to 'General Subscription'.") ?> + <?php echo __('You subscribe to "General Subscription".') ?> <?php else: ?> - <?php echo __('You are currently not subscribed to any newsletter.') ?> + <?php echo __('You don\'t subscribe to our newsletter.') ?> <?php endif; ?> </p> <?php /* Extensions placeholder */ ?> diff --git a/app/code/Magento/Customer/view/frontend/templates/address/book.phtml b/app/code/Magento/Customer/view/frontend/templates/address/book.phtml index ca5b016ee62bbc78fb6e5c81d5d30079ffe409d5..1f1a472fb7282757f19531a32162cd39fc4551a9 100644 --- a/app/code/Magento/Customer/view/frontend/templates/address/book.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/address/book.phtml @@ -86,7 +86,7 @@ <?php endforeach; ?> </ol> <?php else: ?> - <p class="empty"><?php echo __('You have no additional address entries in your address book.') ?></p> + <p class="empty"><?php echo __('You have no other address entries in your address book.') ?></p> <?php endif ?> </div> </div> diff --git a/app/code/Magento/Customer/view/frontend/templates/address/edit.phtml b/app/code/Magento/Customer/view/frontend/templates/address/edit.phtml index e3af1854aa5b5539db93e0b02966b3493b1f2908..75736960880274d78a37ceb35b2fab5f1c2c450c 100644 --- a/app/code/Magento/Customer/view/frontend/templates/address/edit.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/address/edit.phtml @@ -81,7 +81,7 @@ <label class="label" for="region_id"><span><?php echo __('State/Province') ?></span></label> <div class="control"> <select id="region_id" name="region_id" title="<?php echo __('State/Province') ?>" class="validate-select" <?php echo(!$block->getConfig('general/region/display_all')) ? ' disabled="disabled"' : '';?>> - <option value=""><?php echo __('Please select region, state or province') ?></option> + <option value=""><?php echo __('Please select a region, state or province.') ?></option> </select> <input type="text" id="region" name="region" value="<?php echo $block->escapeHtml($block->getRegion()) ?>" title="<?php echo __('State/Province') ?>" class="input-text <?php echo $this->helper('Magento\Customer\Helper\Address')->getAttributeValidationClass('region') ?>"<?php echo(!$block->getConfig('general/region/display_all')) ? ' disabled="disabled"' : '';?>/> </div> diff --git a/app/code/Magento/Customer/view/frontend/templates/form/confirmation.phtml b/app/code/Magento/Customer/view/frontend/templates/form/confirmation.phtml index 72d35663bd434758926d855953ea3185d8e6e412..24a8a5382d6746c811124ea9d5ea2bc3d4c66167 100644 --- a/app/code/Magento/Customer/view/frontend/templates/form/confirmation.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/form/confirmation.phtml @@ -9,7 +9,7 @@ ?> <form action="" method="post" id="form-validate" class="form send confirmation" data-mage-init='{"validation":{}}'> <fieldset class="fieldset" data-hasrequired="<?php echo __('* Required Fields') ?>"> - <p class="field note"><?php echo __('Please enter your email below and we will send you the confirmation link for it.') ?></p> + <p class="field note"><?php echo __('Please enter your email below and we will send you the confirmation link.') ?></p> <div class="field email required"> <label for="email_address" class="label"><span><?php echo __('Email') ?></span></label> <div class="control"> @@ -22,7 +22,7 @@ <button type="submit" class="action send primary"><span><?php echo __('Send confirmation link') ?></span></button> </div> <div class="secondary"> - <a href="<?php echo $block->getLoginUrl() ?>" class="action back"><span><?php echo __('Back to Login') ?></span></a> + <a href="<?php echo $block->getLoginUrl() ?>" class="action back"><span><?php echo __('Back to Sign In') ?></span></a> </div> </div> </form> diff --git a/app/code/Magento/Customer/view/frontend/templates/form/forgotpassword.phtml b/app/code/Magento/Customer/view/frontend/templates/form/forgotpassword.phtml index b190e036eb7d305cabb98235369cc86aeaac20e6..fcb9d44aff84c4d2da38b86083837fc808d20304 100644 --- a/app/code/Magento/Customer/view/frontend/templates/form/forgotpassword.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/form/forgotpassword.phtml @@ -15,7 +15,7 @@ id="form-validate" data-mage-init='{"validation":{}}'> <fieldset class="fieldset" data-hasrequired="<?php echo __('* Required Fields') ?>"> - <div class="field note"><?php echo __('Please enter your email address below. You will receive a link to reset your password.'); ?></div> + <div class="field note"><?php echo __('Please enter your email address below to receive a password reset link.'); ?></div> <div class="field email required"> <label for="email_address" class="label"><span><?php echo __('Email') ?></span></label> <div class="control"> diff --git a/app/code/Magento/Customer/view/frontend/templates/form/login.phtml b/app/code/Magento/Customer/view/frontend/templates/form/login.phtml index 6d15f8936ed74111a4b529a46420b79bae0b6180..3c8137c84e783ee5b77b4bf88c5eaf551c685b65 100644 --- a/app/code/Magento/Customer/view/frontend/templates/form/login.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/form/login.phtml @@ -28,7 +28,7 @@ data-mage-init='{"validation":{}}'> <?php echo $block->getBlockHtml('formkey'); ?> <fieldset class="fieldset login" data-hasrequired="<?php echo __('* Required Fields') ?>"> - <div class="field note"><?php echo __('If you have an account with us, log in using your email address.') ?></div> + <div class="field note"><?php echo __('If you have an account, sign in with your email address.') ?></div> <div class="field email required"> <label class="label" for="email"><span><?php echo __('Email') ?></span></label> <div class="control"> diff --git a/app/code/Magento/Customer/view/frontend/templates/form/register.phtml b/app/code/Magento/Customer/view/frontend/templates/form/register.phtml index 934a7481cb65afdf0fa4b98cdc422f62f822ccd8..e70d8a7fda763612890bc3277d16a6363191fa49 100644 --- a/app/code/Magento/Customer/view/frontend/templates/form/register.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/form/register.phtml @@ -103,7 +103,7 @@ <label for="region_id" class="label"><span><?php echo __('State/Province') ?></span></label> <div class="control"> <select id="region_id" name="region_id" title="<?php echo __('State/Province') ?>" class="validate-select" style="display:none;"> - <option value=""><?php echo __('Please select region, state or province') ?></option> + <option value=""><?php echo __('Please select a region, state or province.') ?></option> </select> <input type="text" id="region" name="region" value="<?php echo $block->escapeHtml($block->getRegion()) ?>" title="<?php echo __('State/Province') ?>" class="input-text <?php echo $this->helper('Magento\Customer\Helper\Address')->getAttributeValidationClass('region') ?>" style="display:none;"> </div> @@ -135,7 +135,7 @@ <?php endif; ?> <fieldset class="fieldset create account" data-hasrequired="<?php echo __('* Required Fields') ?>"> - <legend class="legend"><span><?php echo __('Login Information') ?></span></legend><br> + <legend class="legend"><span><?php echo __('Sign-in Information') ?></span></legend><br> <div class="field password required"> <label for="password" class="label"><span><?php echo __('Password') ?></span></label> @@ -153,7 +153,7 @@ </fieldset> <div class="actions-toolbar"> <div class="primary"> - <button type="submit" class="action submit primary" title="<?php echo __('Create account') ?>"><span><?php echo __('Create account') ?></span></button> + <button type="submit" class="action submit primary" title="<?php echo __('Create an Account') ?>"><span><?php echo __('Create an Account') ?></span></button> </div> <div class="secondary"> <a class="action back" href="<?php echo $block->escapeUrl($block->getBackUrl()) ?>"><span><?php echo __('Back') ?></span></a> diff --git a/app/code/Magento/Customer/view/frontend/templates/logout.phtml b/app/code/Magento/Customer/view/frontend/templates/logout.phtml index c6e9fb05d3f4d76ca42cc2392aebe3a928b493f7..24335090a2b45f4dcc284af9590d3e22b130b8d1 100644 --- a/app/code/Magento/Customer/view/frontend/templates/logout.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/logout.phtml @@ -4,7 +4,7 @@ * See COPYING.txt for license details. */ ?> -<p><?php echo __('You have logged out and will be redirected to our homepage in 5 seconds.') ?></p> +<p><?php echo __('You have signed out and will go to our homepage in 5 seconds.') ?></p> <script> require([ "jquery", diff --git a/app/code/Magento/Customer/view/frontend/templates/newcustomer.phtml b/app/code/Magento/Customer/view/frontend/templates/newcustomer.phtml index e4609e91131483a037adc9d592d72d6455cb2f09..23167146ba63040336038b927d3d5f35fc508dfc 100644 --- a/app/code/Magento/Customer/view/frontend/templates/newcustomer.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/newcustomer.phtml @@ -20,10 +20,10 @@ <strong id="block-new-customer-heading" role="heading" aria-level="2"><?php echo __('New Customers') ?></strong> </div> <div class="block-content" aria-labelledby="block-new-customer-heading"> - <p><?php echo __('By creating an account with our store, you will be able to move through the checkout process faster, store multiple shipping addresses, view and track your orders in your account and more.') ?></p> + <p><?php echo __('Creating an account has many benefits: check out faster, keep more than one address, track orders and more.') ?></p> <div class="actions-toolbar"> <div class="primary"> - <a href="<?php echo $block->getCreateAccountUrl() ?>" class="action create primary"><span><?php echo __('Register') ?></span></a> + <a href="<?php echo $block->getCreateAccountUrl() ?>" class="action create primary"><span><?php echo __('Create an Account') ?></span></a> </div> </div> </div> diff --git a/app/code/Magento/CustomerImportExport/Model/Export/Address.php b/app/code/Magento/CustomerImportExport/Model/Export/Address.php index bfe77d3e13c450aa353d8bb7af894494bd81f0ca..539cca19721adf98332fa87cc8016900e762677c 100644 --- a/app/code/Magento/CustomerImportExport/Model/Export/Address.php +++ b/app/code/Magento/CustomerImportExport/Model/Export/Address.php @@ -90,7 +90,7 @@ class Address extends \Magento\ImportExport\Model\Export\Entity\AbstractEav * * In form of: * - * [customer e-mail] => array( + * [customer email] => array( * [website id 1] => customer_id 1, * [website id 2] => customer_id 2, * ... => ... , diff --git a/app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php b/app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php index 1795e57545047755f27221192ec4d385e7f8abf9..1c20c89fe1ac203ab9e58b18e6efc61e89699c5f 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php @@ -106,14 +106,14 @@ abstract class AbstractCustomer extends \Magento\ImportExport\Model\Import\Entit $data ); - $this->addMessageTemplate(self::ERROR_WEBSITE_IS_EMPTY, __('Website is not specified')); - $this->addMessageTemplate(self::ERROR_EMAIL_IS_EMPTY, __('E-mail is not specified')); - $this->addMessageTemplate(self::ERROR_INVALID_WEBSITE, __("Invalid value in website column")); - $this->addMessageTemplate(self::ERROR_INVALID_EMAIL, __('E-mail is invalid')); - $this->addMessageTemplate(self::ERROR_VALUE_IS_REQUIRED, __("Required attribute '%s' has an empty value")); + $this->addMessageTemplate(self::ERROR_WEBSITE_IS_EMPTY, __('Please specify a website.')); + $this->addMessageTemplate(self::ERROR_EMAIL_IS_EMPTY, __('Please specify an email.')); + $this->addMessageTemplate(self::ERROR_INVALID_WEBSITE, __('We found an invalid value in a website column.')); + $this->addMessageTemplate(self::ERROR_INVALID_EMAIL, __('Please enter a valid email.')); + $this->addMessageTemplate(self::ERROR_VALUE_IS_REQUIRED, __('Please make sure attribute "%s" is not empty.')); $this->addMessageTemplate( self::ERROR_CUSTOMER_NOT_FOUND, - __("Customer with such email and website code doesn't exist") + __('We can\'t find a customer who matches this email and website code.') ); $this->_initCustomers($data)->_initWebsites(true); diff --git a/app/code/Magento/CustomerImportExport/Model/Import/Address.php b/app/code/Magento/CustomerImportExport/Model/Import/Address.php index c14103870f1908fa1f9340a987634151b0c72398..bad0fde1d88d6597adc3b17670269cf7c97b6775 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/Address.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/Address.php @@ -288,12 +288,12 @@ class Address extends AbstractCustomer $this->addMessageTemplate(self::ERROR_ADDRESS_ID_IS_EMPTY, __('Customer address id column is not specified')); $this->addMessageTemplate( self::ERROR_ADDRESS_NOT_FOUND, - __("Customer address for such customer doesn't exist") + __('We can\'t find that customer address.') ); - $this->addMessageTemplate(self::ERROR_INVALID_REGION, __('Region is invalid')); + $this->addMessageTemplate(self::ERROR_INVALID_REGION, __('Please enter a valid region.')); $this->addMessageTemplate( self::ERROR_DUPLICATE_PK, - __('Row with such email, website and address id combination was already found.') + __('We found another row with this email, website and address ID combination.') ); $this->_initAttributes(); diff --git a/app/code/Magento/CustomerImportExport/Model/Import/Customer.php b/app/code/Magento/CustomerImportExport/Model/Import/Customer.php index 1d9e2b6fa9208d3d2e842ab42384d1a501871cc3..40c8bbf49cc584d3c3b76d5ff4b63c9c9e8d5e9b 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/Customer.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/Customer.php @@ -176,7 +176,10 @@ class Customer extends AbstractCustomer $this->_permanentAttributes[] = self::COLUMN_WEBSITE; $this->_indexValueAttributes[] = 'group_id'; - $this->addMessageTemplate(self::ERROR_DUPLICATE_EMAIL_SITE, __('E-mail is duplicated in import file')); + $this->addMessageTemplate( + self::ERROR_DUPLICATE_EMAIL_SITE, + __('This email is found more than once in the import file.') + ); $this->addMessageTemplate( self::ERROR_ROW_IS_ORPHAN, __('Orphan rows that will be skipped due default row errors') @@ -185,8 +188,11 @@ class Customer extends AbstractCustomer self::ERROR_INVALID_STORE, __('Invalid value in Store column (store does not exists?)') ); - $this->addMessageTemplate(self::ERROR_EMAIL_SITE_NOT_FOUND, __('E-mail and website combination is not found')); - $this->addMessageTemplate(self::ERROR_PASSWORD_LENGTH, __('Invalid password length')); + $this->addMessageTemplate( + self::ERROR_EMAIL_SITE_NOT_FOUND, + __('We can\'t find that email and website combination.') + ); + $this->addMessageTemplate(self::ERROR_PASSWORD_LENGTH, __('Please enter a password with a valid length.')); $this->_initStores(true)->_initAttributes(); diff --git a/app/code/Magento/CustomerImportExport/Model/Resource/Import/Customer/Storage.php b/app/code/Magento/CustomerImportExport/Model/Resource/Import/Customer/Storage.php index 1b6310463347d81302357aa53ea168cda55c0cf6..36b9c38a16a1e8375f7dbd56eedafdac29dbb3bc 100644 --- a/app/code/Magento/CustomerImportExport/Model/Resource/Import/Customer/Storage.php +++ b/app/code/Magento/CustomerImportExport/Model/Resource/Import/Customer/Storage.php @@ -24,7 +24,7 @@ class Storage /** * Existing customers information. In form of: * - * [customer e-mail] => array( + * [customer email] => array( * [website id 1] => customer_id 1, * [website id 2] => customer_id 2, * ... => ... , diff --git a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Launch.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Launch.php index 05878003f284a8302cf55f4c51b10f9be8d50dfc..2a19e481791f3f53fa8f84ad2b3843daf9607096 100644 --- a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Launch.php +++ b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Launch.php @@ -159,7 +159,7 @@ class Launch extends \Magento\DesignEditor\Controller\Adminhtml\System\Design\Ed $this->_redirect('adminhtml/*/'); return; } catch (\Exception $e) { - $this->messageManager->addException($e, __('Sorry, something went wrong.')); + $this->messageManager->addException($e, __('Sorry, something went wrong. That\'s all we know.')); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); $this->_redirect('adminhtml/*/'); return; diff --git a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Revert.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Revert.php index d2b47b2815926c1955a90897ca4e075f86c3873f..6da421c70359184f0ccc56858a2a3178e349f374 100644 --- a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Revert.php +++ b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Revert.php @@ -34,13 +34,13 @@ class Revert extends \Magento\DesignEditor\Controller\Adminhtml\System\Design\Ed switch ($revertTo) { case 'last_saved': $copyService->copy($virtualTheme, $stagingTheme); - $message = __('Theme "%1" reverted to last saved state', $virtualTheme->getThemeTitle()); + $message = __('Theme "%1" reverted to last saved state.', $virtualTheme->getThemeTitle()); break; case 'physical': $physicalTheme = $virtualTheme->getDomainModel(ThemeInterface::TYPE_VIRTUAL)->getPhysicalTheme(); $copyService->copy($physicalTheme, $stagingTheme); - $message = __('Theme "%1" reverted to last default state', $virtualTheme->getThemeTitle()); + $message = __('Theme "%1" reverted to last default state.', $virtualTheme->getThemeTitle()); break; default: @@ -51,7 +51,7 @@ class Revert extends \Magento\DesignEditor\Controller\Adminhtml\System\Design\Ed $response = ['message' => $message]; } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); - $response = ['error' => true, 'message' => __('Unknown error')]; + $response = ['error' => true, 'message' => __('Something went wrong. That\'s all we know.')]; } /** @var $jsonHelper \Magento\Framework\Json\Helper\Data */ $jsonHelper = $this->_objectManager->get('Magento\Framework\Json\Helper\Data'); diff --git a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Save.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Save.php index 33321d063c0cc6fd5675ef00ac09cd9766c20166..92c4f1427f92b4993e6f9419a3790867b79880cf 100644 --- a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Save.php +++ b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Save.php @@ -30,7 +30,7 @@ class Save extends \Magento\DesignEditor\Controller\Adminhtml\System\Design\Edit $response = ['message' => $message]; } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); - $response = ['error' => true, 'message' => __('Sorry, something went wrong.')]; + $response = ['error' => true, 'message' => __('Sorry, something went wrong. That\'s all we know.')]; } /** @var $jsonHelper \Magento\Framework\Json\Helper\Data */ diff --git a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/RemoveQuickStyleImage.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/RemoveQuickStyleImage.php index 7f30a689d5530dad2b96885bca2c76156294313d..d45e6905fa0b833b90a0bc5cc9f0b34706272d4d 100644 --- a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/RemoveQuickStyleImage.php +++ b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/RemoveQuickStyleImage.php @@ -45,7 +45,7 @@ class RemoveQuickStyleImage extends \Magento\DesignEditor\Controller\Adminhtml\S $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } catch (\Exception $e) { $errorMessage = __( - 'Something went wrong uploading the image.' . + 'Something went wrong while uploading the image.' . ' Please check the file format and try again (JPEG, GIF, or PNG).' ); $response = ['error' => true, 'message' => $errorMessage]; diff --git a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/RemoveStoreLogo.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/RemoveStoreLogo.php index 3911e9a51b57a088189c3c8a2502195ec2784f86..26645878c0f0de5cd4910e487897d6a4d2b98638 100644 --- a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/RemoveStoreLogo.php +++ b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/RemoveStoreLogo.php @@ -54,7 +54,7 @@ class RemoveStoreLogo extends \Magento\DesignEditor\Controller\Adminhtml\System\ $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } catch (\Exception $e) { $errorMessage = __( - 'Something went wrong uploading the image.' . + 'Something went wrong while uploading the image.' . ' Please check the file format and try again (JPEG, GIF, or PNG).' ); $response = ['error' => true, 'message' => $errorMessage]; diff --git a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/SaveImageSizing.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/SaveImageSizing.php index 42e971eb4efa854f5c64569e134744cd91fdfece..d26a89802e089ddc16e17d09e0bcc2be87b5efb0 100644 --- a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/SaveImageSizing.php +++ b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/SaveImageSizing.php @@ -33,7 +33,7 @@ class SaveImageSizing extends \Magento\DesignEditor\Controller\Adminhtml\System\ ); $imageSizing = $imageSizingValidator->validate($configuration->getAllControlsData(), $imageSizing); $configuration->saveData($imageSizing); - $result = ['success' => true, 'message' => __('We saved the image sizes.')]; + $result = ['success' => true, 'message' => __('You saved the image sizes.')]; } catch (CoreException $e) { $result = ['error' => true, 'message' => $e->getMessage()]; $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); diff --git a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/SaveQuickStyles.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/SaveQuickStyles.php index 7f0b66fd15d4b2f29db94a6d5257a81289d04eb6..b2bc0a54afe50e83dfeb80ae6f74d7bd0e8758f2 100644 --- a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/SaveQuickStyles.php +++ b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/SaveQuickStyles.php @@ -35,7 +35,7 @@ class SaveQuickStyles extends \Magento\DesignEditor\Controller\Adminhtml\System\ $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } catch (\Exception $e) { $errorMessage = __( - 'Something went wrong uploading the image.' . + 'Something went wrong while uploading the image.' . ' Please check the file format and try again (JPEG, GIF, or PNG).' ); $response = ['error' => true, 'message' => $errorMessage]; diff --git a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/UploadQuickStyleImage.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/UploadQuickStyleImage.php index d77ad32b12a908f85a885e509d5766ac1e9e2ace..8ab88dda212582a112bde1700d8d8c865a390c5b 100644 --- a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/UploadQuickStyleImage.php +++ b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/UploadQuickStyleImage.php @@ -43,7 +43,7 @@ class UploadQuickStyleImage extends \Magento\DesignEditor\Controller\Adminhtml\S $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } catch (\Exception $e) { $errorMessage = __( - 'Something went wrong uploading the image.' . + 'Something went wrong while uploading the image.' . ' Please check the file format and try again (JPEG, GIF, or PNG).' ); $response = ['error' => true, 'message' => $errorMessage]; diff --git a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/UploadStoreLogo.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/UploadStoreLogo.php index e2e962e721c428a167e581ac197fc3902def951e..224dcb4185fd17156673f281d63ae3cc48cb4090 100644 --- a/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/UploadStoreLogo.php +++ b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/UploadStoreLogo.php @@ -48,7 +48,7 @@ class UploadStoreLogo extends \Magento\DesignEditor\Controller\Adminhtml\System\ $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } catch (\Exception $e) { $errorMessage = __( - 'Something went wrong uploading the image.' . + 'Something went wrong while uploading the image.' . ' Please check the file format and try again (JPEG, GIF, or PNG).' ); $response = ['error' => true, 'message' => $errorMessage]; diff --git a/app/code/Magento/DesignEditor/view/adminhtml/templates/editor/tools/code/js.phtml b/app/code/Magento/DesignEditor/view/adminhtml/templates/editor/tools/code/js.phtml index 4e26d52a4cd5d532f8a11b2de08baf674ff40663..f0f38865ea22d6b4720066664f2e61428f9577b3 100644 --- a/app/code/Magento/DesignEditor/view/adminhtml/templates/editor/tools/code/js.phtml +++ b/app/code/Magento/DesignEditor/view/adminhtml/templates/editor/tools/code/js.phtml @@ -208,7 +208,7 @@ require([ }); }, this), error: $.proxy(function () { - alert($.mage.__('Sorry, something went wrong.')); + alert($.mage.__('Sorry, something went wrong. That\'s all we know.')); }, this) }); } diff --git a/app/code/Magento/DesignEditor/view/adminhtml/web/js/custom-css.js b/app/code/Magento/DesignEditor/view/adminhtml/web/js/custom-css.js index 1455c9a71012e44f7f168c7bf1914e3e90c31d2f..0c9a267b6261c02ad1829e6ab9907f2922a0f97d 100644 --- a/app/code/Magento/DesignEditor/view/adminhtml/web/js/custom-css.js +++ b/app/code/Magento/DesignEditor/view/adminhtml/web/js/custom-css.js @@ -70,7 +70,7 @@ define([ this._prepareUpdateButton(); }, this), error: function() { - alert($.mage.__('Sorry, something went wrong.')); + alert($.mage.__('Sorry, something went wrong. That\'s all we know.')); } }); $('.vde-tools-content').trigger('resize.vdeToolsResize'); diff --git a/app/code/Magento/DesignEditor/view/adminhtml/web/js/image-sizing.js b/app/code/Magento/DesignEditor/view/adminhtml/web/js/image-sizing.js index 5ee0a8767a743942194b901bae016fe9a4b3a684..02012572e2ebc6e112cfd0533fb49a84e4b8e2e6 100644 --- a/app/code/Magento/DesignEditor/view/adminhtml/web/js/image-sizing.js +++ b/app/code/Magento/DesignEditor/view/adminhtml/web/js/image-sizing.js @@ -174,7 +174,7 @@ define([ this.element.trigger('refreshIframe'); }, this), error: $.proxy(function() { - alert($.mage.__('Sorry, something went wrong.')); + alert($.mage.__('Sorry, something went wrong. That\'s all we know.')); }, this) }); } diff --git a/app/code/Magento/DesignEditor/view/adminhtml/web/js/quick-style-element.js b/app/code/Magento/DesignEditor/view/adminhtml/web/js/quick-style-element.js index 28820ebe322415c8d9bed3401e0977cd552ffd53..5894637bb0d12a8723fbfa1ee961eb1a5ce511b6 100644 --- a/app/code/Magento/DesignEditor/view/adminhtml/web/js/quick-style-element.js +++ b/app/code/Magento/DesignEditor/view/adminhtml/web/js/quick-style-element.js @@ -70,7 +70,7 @@ define([ this.element.trigger('refreshIframe'); }, this), error: function() { - alert($.mage.__('Sorry, something went wrong.')); + alert($.mage.__('Sorry, something went wrong. That\'s all we know.')); } }); } diff --git a/app/code/Magento/DesignEditor/view/adminhtml/web/js/quick-style-uploader.js b/app/code/Magento/DesignEditor/view/adminhtml/web/js/quick-style-uploader.js index 04fc0919ea8774af2400442b86ec92e2ba91dbe5..65c87581364819b4e4c76feeb3e44e5dd372e964 100644 --- a/app/code/Magento/DesignEditor/view/adminhtml/web/js/quick-style-uploader.js +++ b/app/code/Magento/DesignEditor/view/adminhtml/web/js/quick-style-uploader.js @@ -101,7 +101,7 @@ define([ } }, this), error: function() { - alert($.mage.__('Sorry, something went wrong.')); + alert($.mage.__('Sorry, something went wrong. That\'s all we know.')); } }); }, diff --git a/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-assign.js b/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-assign.js index ee24310855c7a74399760809e6a6184ec5ad4caa..15b31ef6e6c0101edad80fd4a330af88838dfbdd 100644 --- a/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-assign.js +++ b/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-assign.js @@ -408,7 +408,7 @@ define([ this.assignThemeSuccess(response, stores, themeId); }, this), error: $.proxy(function() { - var message = $.mage.__('Sorry, something went wrong.'); + var message = $.mage.__('Sorry, something went wrong. That\'s all we know.'); this._dialog.messages.set(message, 'error'); }, this) }); diff --git a/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-save.js b/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-save.js index e350d1ac8ff38ab1259800b04fa61a79d599da7d..a5e335bcfb02c3b9733e135afb8c7eaba15c4b04 100644 --- a/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-save.js +++ b/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-save.js @@ -122,7 +122,7 @@ define([ dialog.open(); }, this), error: function() { - alert($.mage.__('Error: unknown error.')); + alert($.mage.__('Something went wrong. That\'s all we know.')); } }); }, diff --git a/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-selector.js b/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-selector.js index dc092ec2ace035fd44403a33ee6724cc6d69ff59..be314eaf9f082f96e44c063a6afb40fea3727077 100644 --- a/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-selector.js +++ b/app/code/Magento/DesignEditor/view/adminhtml/web/js/theme-selector.js @@ -108,7 +108,7 @@ define([ }, this), error: $.proxy(function() { this._cancelEdit(); - alert($.mage.__('Sorry, something went wrong.')); + alert($.mage.__('Sorry, something went wrong. That\'s all we know.')); }, this) }); }, diff --git a/app/code/Magento/Dhl/Block/Adminhtml/Unitofmeasure.php b/app/code/Magento/Dhl/Block/Adminhtml/Unitofmeasure.php index 24d343f61c55fa5d40450181aeb0472f1b4763fe..2118fb588a6fe3e6c1d8910ccb4e58cbce847b47 100644 --- a/app/code/Magento/Dhl/Block/Adminhtml/Unitofmeasure.php +++ b/app/code/Magento/Dhl/Block/Adminhtml/Unitofmeasure.php @@ -65,7 +65,7 @@ class Unitofmeasure extends \Magento\Config\Block\System\Config\Form\Field $this->setDivideOrderWeightNoteKg( $this->escapeJsQuote( __( - 'This allows breaking total order weight into smaller pieces if it exceeds %1 %2 to ensure accurate calculation of shipping charges.', + 'Select this to allow DHL to optimize shipping charges by splitting the order if it exceeds %1 %2.', $kgWeight, 'kg' ) @@ -84,7 +84,7 @@ class Unitofmeasure extends \Magento\Config\Block\System\Config\Form\Field $this->setDivideOrderWeightNoteLbp( $this->escapeJsQuote( __( - 'This allows breaking total order weight into smaller pieces if it exceeds %1 %2 to ensure accurate calculation of shipping charges.', + 'Select this to allow DHL to optimize shipping charges by splitting the order if it exceeds %1 %2.', $weight, 'pounds' ) diff --git a/app/code/Magento/Dhl/Model/Carrier.php b/app/code/Magento/Dhl/Model/Carrier.php index dc2388e4e0c5606d3fbc3ff45c0a36d97d128da4..3943551de3fcf17fcd2cc2b099b2a95620b5c53c 100644 --- a/app/code/Magento/Dhl/Model/Carrier.php +++ b/app/code/Magento/Dhl/Model/Carrier.php @@ -916,7 +916,7 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin $bodyXml = $this->_xmlElFactory->create(['data' => $responseBody]); $code = $bodyXml->xpath('//GetQuoteResponse/Note/Condition/ConditionCode'); if (isset($code[0]) && (int)$code[0] == self::CONDITION_CODE_SERVICE_DATE_UNAVAILABLE) { - $debugPoint['info'] = sprintf(__("DHL service is not available at %s date"), $date); + $debugPoint['info'] = sprintf(__('DHL service is not available on %s.'), $date); } else { break; } @@ -1030,7 +1030,7 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin */ protected function _parseResponse($response) { - $responseError = __('The response is in wrong format.'); + $responseError = __('Please enter a response in the correct format.'); if (strlen(trim($response)) > 0) { if (strpos(trim($response), '<?xml') === 0) { @@ -1147,7 +1147,7 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin if (!isset($rates[$currencyCode]) || !$totalEstimate) { $totalEstimate = false; $this->_errors[] = __( - 'We had to skip DHL method %1 because we couldn\'t find exchange rate %2 (Base Currency).', + 'We had to skip DHL method %1 because we can\'t find exchange rate %2 (Base Currency).', $currencyCode, $baseCurrencyCode ); @@ -1262,7 +1262,7 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin { //Skip by item validation if there is no items in request if (!count($this->getAllItems($request))) { - $this->_errors[] = __('There is no items in this order'); + $this->_errors[] = __('There are no items in this order.'); } $countryParams = $this->getCountryParams( @@ -1273,7 +1273,7 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin ) ); if (!$countryParams->getData()) { - $this->_errors[] = __('Please, specify origin country'); + $this->_errors[] = __('Please specify an origin country.'); } if (!empty($this->_errors)) { @@ -1339,7 +1339,7 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin if ($params['width'] || $params['length'] || $params['height']) { $minValue = $this->_getMinDimension($params['dimension_units']); if ($params['width'] < $minValue || $params['length'] < $minValue || $params['height'] < $minValue) { - $message = __('Height, width and length should be equal or greater than %1', $minValue); + $message = __('Height, width and length should be equal or greater than %1.', $minValue); throw new \Magento\Framework\Exception\LocalizedException($message); } } @@ -1771,7 +1771,7 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin */ protected function _parseXmlTrackingResponse($trackings, $response) { - $errorTitle = __('Unable to retrieve tracking'); + $errorTitle = __('For some reason we can\'t retrieve tracking info right now.'); $resultArr = []; if (strlen(trim($response)) > 0) { @@ -1795,7 +1795,7 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin $awbinfoData = []; $trackNum = isset($awbinfo->AWBNumber) ? (string)$awbinfo->AWBNumber : ''; if (!is_object($awbinfo) || !$awbinfo->ShipmentInfo) { - $this->_errors[$trackNum] = __('Unable to retrieve tracking'); + $this->_errors[$trackNum] = __('For some reason we can\'t retrieve tracking info right now.'); continue; } $shipmentInfo = $awbinfo->ShipmentInfo; diff --git a/app/code/Magento/Dhl/etc/adminhtml/system.xml b/app/code/Magento/Dhl/etc/adminhtml/system.xml index 89f4d3f763176d95a7352fb21133ea27c721441e..c9a14fecf5d73ec06feee1a7bbf38a7f1c57c915 100644 --- a/app/code/Magento/Dhl/etc/adminhtml/system.xml +++ b/app/code/Magento/Dhl/etc/adminhtml/system.xml @@ -50,7 +50,7 @@ </field> <field id="divide_order_weight" translate="label comment" type="select" sortOrder="130" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Divide Order Weight</label> - <comment>This allows breaking total order weight into smaller pieces if it exeeds 70 kg to ensure accurate calculation of shipping charges.</comment> + <comment>Select this to allow DHL to optimize shipping charges by splitting the order if it exceeds 70 kg.</comment> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> </field> <field id="unit_of_measure" translate="label" type="select" sortOrder="140" showInDefault="1" showInWebsite="1" showInStore="1"> diff --git a/app/code/Magento/Directory/Block/Data.php b/app/code/Magento/Directory/Block/Data.php index 9df3c512994106d3827b39bf404a63a8ba9512f8..08242cb6e25dc0fb494970fef8839820e4b26dec 100644 --- a/app/code/Magento/Directory/Block/Data.php +++ b/app/code/Magento/Directory/Block/Data.php @@ -3,10 +3,6 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - -/** - * Directory data block - */ namespace Magento\Directory\Block; class Data extends \Magento\Framework\View\Element\Template @@ -84,6 +80,20 @@ class Data extends \Magento\Framework\View\Element\Template return $collection; } + /** + * Retrieve list of top destinations countries + * + * @return array + */ + protected function getTopDestinations() + { + $destinations = (string)$this->_scopeConfig->getValue( + 'general/country/destinations', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ); + return !empty($destinations) ? explode(',', $destinations) : []; + } + /** * @param null|string $defValue * @param string $name @@ -102,7 +112,9 @@ class Data extends \Magento\Framework\View\Element\Template if ($cache) { $options = unserialize($cache); } else { - $options = $this->getCountryCollection()->toOptionArray(); + $options = $this->getCountryCollection() + ->setForegroundCountries($this->getTopDestinations()) + ->toOptionArray(); $this->_configCacheType->save(serialize($options), $cacheKey); } $html = $this->getLayout()->createBlock( diff --git a/app/code/Magento/Directory/Model/Resource/Region/Collection.php b/app/code/Magento/Directory/Model/Resource/Region/Collection.php index c41af5db80819d74407d6618c113535cb0b45e56..37d67636b7da70d5319e8a5f233ed4bf2395aaa8 100644 --- a/app/code/Magento/Directory/Model/Resource/Region/Collection.php +++ b/app/code/Magento/Directory/Model/Resource/Region/Collection.php @@ -194,7 +194,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac if (count($options) > 0) { array_unshift( $options, - ['title ' => null, 'value' => null, 'label' => __('Please select region, state or province')] + ['title ' => null, 'value' => null, 'label' => __('Please select a region, state or province.')] ); } return $options; diff --git a/app/code/Magento/Directory/Test/Unit/Block/DataTest.php b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9d5fb0635bd667381ab5cd3f2cba90bc16736cae --- /dev/null +++ b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php @@ -0,0 +1,329 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Directory\Test\Unit\Block; + +use Magento\Directory\Block\Data; +use Magento\Directory\Helper\Data as HelperData; +use Magento\Directory\Model\Resource\Country\Collection as CountryCollection; +use Magento\Directory\Model\Resource\Country\CollectionFactory as CountryCollectionFactory; +use Magento\Directory\Model\Resource\Region\CollectionFactory as RegionCollectionFactory; +use Magento\Framework\App\Cache\Type\Config; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\Json\EncoderInterface; +use Magento\Framework\View\Element\Template\Context; +use Magento\Framework\View\LayoutInterface; +use Magento\Store\Model\ScopeInterface; +use Magento\Store\Model\Store; +use Magento\Store\Model\StoreManagerInterface; + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class DataTest extends \PHPUnit_Framework_TestCase +{ + /** @var Data */ + protected $model; + + /** @var Context |\PHPUnit_Framework_MockObject_MockObject */ + protected $context; + + /** @var HelperData |\PHPUnit_Framework_MockObject_MockObject */ + protected $helperData; + + /** @var EncoderInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $jsonEncoder; + + /** @var Config |\PHPUnit_Framework_MockObject_MockObject */ + protected $cacheTypeConfig; + + /** @var RegionCollectionFactory |\PHPUnit_Framework_MockObject_MockObject */ + protected $regionCollectionFactory; + + /** @var CountryCollectionFactory |\PHPUnit_Framework_MockObject_MockObject */ + protected $countryCollectionFactory; + + /** @var ScopeConfigInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $scopeConfig; + + /** @var StoreManagerInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $storeManager; + + /** @var Store |\PHPUnit_Framework_MockObject_MockObject */ + protected $store; + + /** @var CountryCollection |\PHPUnit_Framework_MockObject_MockObject */ + protected $countryCollection; + + /** @var LayoutInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $layout; + + protected function setUp() + { + $this->prepareContext(); + + $this->helperData = $this->getMockBuilder('Magento\Directory\Helper\Data') + ->disableOriginalConstructor() + ->getMock(); + + $this->jsonEncoder = $this->getMockBuilder('Magento\Framework\Json\EncoderInterface') + ->getMockForAbstractClass(); + + $this->cacheTypeConfig = $this->getMockBuilder('Magento\Framework\App\Cache\Type\Config') + ->disableOriginalConstructor() + ->getMock(); + + $this->regionCollectionFactory = $this->getMockBuilder( + 'Magento\Directory\Model\Resource\Region\CollectionFactory' + ) + ->disableOriginalConstructor() + ->getMock(); + + $this->prepareCountryCollection(); + + $this->model = new Data( + $this->context, + $this->helperData, + $this->jsonEncoder, + $this->cacheTypeConfig, + $this->regionCollectionFactory, + $this->countryCollectionFactory + ); + } + + protected function prepareContext() + { + $this->store = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + + $this->scopeConfig = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') + ->getMockForAbstractClass(); + + $this->storeManager = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') + ->getMockForAbstractClass(); + + $this->storeManager->expects($this->any()) + ->method('getStore') + ->willReturn($this->store); + + $this->layout = $this->getMockBuilder('Magento\Framework\View\LayoutInterface') + ->getMockForAbstractClass(); + + $this->context = $this->getMockBuilder('Magento\Framework\View\Element\Template\Context') + ->disableOriginalConstructor() + ->getMock(); + + $this->context->expects($this->any()) + ->method('getScopeConfig') + ->willReturn($this->scopeConfig); + + $this->context->expects($this->any()) + ->method('getStoreManager') + ->willReturn($this->storeManager); + + $this->context->expects($this->any()) + ->method('getLayout') + ->willReturn($this->layout); + } + + protected function prepareCountryCollection() + { + $this->countryCollection = $this->getMockBuilder('Magento\Directory\Model\Resource\Country\Collection') + ->disableOriginalConstructor() + ->getMock(); + + $this->countryCollectionFactory = $this->getMockBuilder( + 'Magento\Directory\Model\Resource\Country\CollectionFactory' + ) + ->disableOriginalConstructor() + ->setMethods([ + 'create' + ]) + ->getMock(); + + $this->countryCollectionFactory->expects($this->any()) + ->method('create') + ->willReturn($this->countryCollection); + } + + /** + * @param string $storeCode + * @param int $defaultCountry + * @param string $destinations + * @param array $expectedDestinations + * @param array $options + * @param string $resultHtml + * @dataProvider dataProviderGetCountryHtmlSelect + */ + public function testGetCountryHtmlSelect( + $storeCode, + $defaultCountry, + $destinations, + $expectedDestinations, + $options, + $resultHtml + ) { + $this->helperData->expects($this->once()) + ->method('getDefaultCountry') + ->willReturn($defaultCountry); + + $this->store->expects($this->once()) + ->method('getCode') + ->willReturn($storeCode); + + $this->cacheTypeConfig->expects($this->once()) + ->method('load') + ->with('DIRECTORY_COUNTRY_SELECT_STORE_' . $storeCode) + ->willReturn(false); + $this->cacheTypeConfig->expects($this->once()) + ->method('save') + ->with(serialize($options), 'DIRECTORY_COUNTRY_SELECT_STORE_' . $storeCode) + ->willReturnSelf(); + + $this->scopeConfig->expects($this->once()) + ->method('getValue') + ->with('general/country/destinations', ScopeInterface::SCOPE_STORE) + ->willReturn($destinations); + + $this->countryCollection->expects($this->once()) + ->method('loadByStore') + ->willReturnSelf(); + $this->countryCollection->expects($this->any()) + ->method('setForegroundCountries') + ->with($expectedDestinations) + ->willReturnSelf(); + $this->countryCollection->expects($this->once()) + ->method('toOptionArray') + ->willReturn($options); + + $elementHtmlSelect = $this->mockElementHtmlSelect($defaultCountry, $options, $resultHtml); + + $this->layout->expects($this->once()) + ->method('createBlock') + ->willReturn($elementHtmlSelect); + + $this->assertEquals($resultHtml, $this->model->getCountryHtmlSelect()); + } + + /** + * 1. Store code + * 2. Default Country ID + * 3. Top Destinations + * 4. Exploded Top Destinations + * 5. Result options + * + * @return array + */ + public function dataProviderGetCountryHtmlSelect() + { + return [ + [ + 'default', + 1, + '', + [], + [ + [ + 'value' => 'US', + 'label' => 'United States', + ], + ], + 'result html', + ], + [ + 'default', + 1, + 'US', + [ + 0 => 'US', + ], + [ + [ + 'value' => 'US', + 'label' => 'United States', + ], + ], + 'result html', + ], + [ + 'default', + 1, + 'US,GB', + [ + 0 => 'US', + 1 => 'GB', + ], + [ + [ + 'value' => 'US', + 'label' => 'United States', + ], + [ + 'value' => 'GB', + 'label' => 'Great Britain', + ], + ], + 'result html', + ], + ]; + } + + /** + * @param $defaultCountry + * @param $options + * @param $resultHtml + * @return \PHPUnit_Framework_MockObject_MockObject + */ + protected function mockElementHtmlSelect($defaultCountry, $options, $resultHtml) + { + $name = 'country_id'; + $id = 'country'; + $title = 'Country'; + + $elementHtmlSelect = $this->getMockBuilder('Magento\Framework\View\Element\Html\Select') + ->disableOriginalConstructor() + ->setMethods([ + 'setName', + 'setId', + 'setTitle', + 'setValue', + 'setOptions', + 'setExtraParams', + 'getHtml', + ]) + ->getMock(); + + $elementHtmlSelect->expects($this->once()) + ->method('setName') + ->with($name) + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('setId') + ->with($id) + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('setTitle') + ->with(__($title)) + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('setValue') + ->with($defaultCountry) + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('setOptions') + ->with($options) + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('setExtraParams') + ->with('data-validate="{\'validate-select\':true}"') + ->willReturnSelf(); + $elementHtmlSelect->expects($this->once()) + ->method('getHtml') + ->willReturn($resultHtml); + + return $elementHtmlSelect; + } +} diff --git a/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php b/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php index 699e44fe150db1c3f052928ebbe89f212e24eacb..2416dc5d4c9efde09c4dcbcb23d60a700c5c97c5 100644 --- a/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php +++ b/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php @@ -30,8 +30,8 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer * @param \Magento\Framework\Url\Helper\Data $urlHelper * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param PriceCurrencyInterface $priceCurrency - * @param \Magento\Downloadable\Helper\Catalog\Product\Configuration $downloadableProductConfiguration * @param \Magento\Framework\Module\Manager $moduleManager + * @param \Magento\Downloadable\Helper\Catalog\Product\Configuration $downloadableProductConfiguration * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ diff --git a/app/code/Magento/Downloadable/Controller/Download/Link.php b/app/code/Magento/Downloadable/Controller/Download/Link.php index 0c0cd1bbe8544c02137b5e0d853112b908b59c8f..28a5f0bc58654dd953bf1cd271dda094678529bd 100644 --- a/app/code/Magento/Downloadable/Controller/Download/Link.php +++ b/app/code/Magento/Downloadable/Controller/Download/Link.php @@ -58,12 +58,12 @@ class Link extends \Magento\Downloadable\Controller\Download ); if ($product->getId()) { $notice = __( - 'Please log in to download your product or purchase <a href="%1">%2</a>.', + 'Please sign in to download your product or purchase <a href="%1">%2</a>.', $product->getProductUrl(), $product->getName() ); } else { - $notice = __('Please log in to download your product.'); + $notice = __('Please sign in to download your product.'); } $this->messageManager->addNotice($notice); $session->authenticate($this); diff --git a/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php b/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php index accf63a02ea487aeb397b6dc83987364145259c9..4245dede4be09a31918bc40c0814e7d8f628134f 100644 --- a/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php +++ b/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php @@ -20,7 +20,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); @@ -68,10 +68,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getDownloadableLinkPriceTable() { - if ($this->useIdxTable()) { - return $this->getTable('catalog_product_index_price_downlod_idx'); - } - return $this->getTable('catalog_product_index_price_downlod_tmp'); + return $this->tableStrategy->getTableName('catalog_product_index_price_downlod'); } /** diff --git a/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkTest.php b/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkTest.php index 0efd1ada35ea060876f9887f5ffdc3d3ae748d0b..da584a79ca48e13293ac092f0e3b0243eb7f7231 100644 --- a/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkTest.php +++ b/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkTest.php @@ -275,7 +275,7 @@ class LinkTest extends \PHPUnit_Framework_TestCase $this->product->expects($this->once())->method('getName')->willReturn('product_name'); $this->messageManager->expects($this->once()) ->method('addNotice') - ->with('Please log in to download your product or purchase <a href="product_url">product_name</a>.'); + ->with('Please sign in to download your product or purchase <a href="product_url">product_name</a>.'); $this->session->expects($this->once())->method('authenticate')->with($this->link)->willReturn(true); $this->objectManager->expects($this->at(4)) ->method('create') diff --git a/app/code/Magento/Downloadable/composer.json b/app/code/Magento/Downloadable/composer.json index fb54763027f3ed9b61617b4c2e2ae63a92ddab6a..b28ee43df4619e46d9314a36a88369cb34ce7a94 100644 --- a/app/code/Magento/Downloadable/composer.json +++ b/app/code/Magento/Downloadable/composer.json @@ -13,7 +13,6 @@ "magento/module-sales": "0.74.0-beta14", "magento/module-checkout": "0.74.0-beta14", "magento/module-directory": "0.74.0-beta14", - "magento/module-wishlist": "0.74.0-beta14", "magento/module-gift-message": "0.74.0-beta14", "magento/module-catalog-inventory": "0.74.0-beta14", "magento/module-msrp": "0.74.0-beta14", diff --git a/app/code/Magento/Downloadable/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Downloadable/view/frontend/layout/checkout_cart_item_renderers.xml index 7a152eff590fc3608cbec1644a13a9b674b1160e..f6307cf7f80f69f3e424dd155b80f8b5cbbeba20 100644 --- a/app/code/Magento/Downloadable/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/Downloadable/view/frontend/layout/checkout_cart_item_renderers.xml @@ -8,7 +8,12 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\Downloadable\Block\Checkout\Cart\Item\Renderer" as="downloadable" template="checkout/cart/item/default.phtml"/> + <block class="Magento\Downloadable\Block\Checkout\Cart\Item\Renderer" as="downloadable" template="checkout/cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.downloadable.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.downloadable.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.downloadable.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> <referenceBlock name="additional.product.info"> <block class="Magento\Downloadable\Block\Checkout\Cart\Item\Renderer" name="downloadable.product.links" template="Magento_Downloadable::checkout/links.phtml"/> diff --git a/app/code/Magento/Downloadable/view/frontend/templates/checkout/cart/item/default.phtml b/app/code/Magento/Downloadable/view/frontend/templates/checkout/cart/item/default.phtml index 62441265c7402ef642fcc8027a3a2beb7d93b788..e45c33bba790ddcf3d0cf97ab7130fc0185fd65c 100644 --- a/app/code/Magento/Downloadable/view/frontend/templates/checkout/cart/item/default.phtml +++ b/app/code/Magento/Downloadable/view/frontend/templates/checkout/cart/item/default.phtml @@ -104,22 +104,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <tr class="item-actions"> <td colspan="<?php echo $cols;?>"> <div class="actions-toolbar"> - <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllowInCart()) : ?> - <?php if ($isVisibleProduct): ?> - <a href="#" data-post='<?php echo $this->helper('Magento\Wishlist\Helper\Data')->getMoveFromCartParams($_item->getId()); ?>' class="use-ajax action towishlist"> - <span><?php echo __('Move to Wish List'); ?></span> - </a> - <?php endif ?> - <?php endif ?> - <?php if ($isVisibleProduct): ?> - <a class="action edit" href="<?php echo $block->getConfigureUrl() ?>" title="<?php echo __('Edit item parameters') ?>"><span><?php echo __('Edit') ?></span></a> - <?php endif ?> - <button title="<?php echo __('Remove item') ?>" - type="button" - class="action delete" - data-post='<?php echo $this->helper('Magento\Checkout\Helper\Cart')->getDeletePostJson($_item); ?>'> - <span><?php echo __('Remove item')?></span> - </button> + <?php echo $block->getActions($_item) ?> </div> </td> </tr> diff --git a/app/code/Magento/Email/Block/Adminhtml/Template/Edit/Form.php b/app/code/Magento/Email/Block/Adminhtml/Template/Edit/Form.php index cc10d6112ddaaf5c890675ae50df2ae9579d845a..c05c1e44ad12bf2262d31344fdd44ed02be1f379 100644 --- a/app/code/Magento/Email/Block/Adminhtml/Template/Edit/Form.php +++ b/app/code/Magento/Email/Block/Adminhtml/Template/Edit/Form.php @@ -77,7 +77,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'used_currently_for', 'label', [ - 'label' => __('Used Currently For'), + 'label' => __('Now Used For'), 'container_id' => 'used_currently_for', 'after_element_html' => '<script>require(["prototype"], function () {' . (!$this->getEmailTemplate()->getSystemConfigPathsWhereUsedCurrently() ? '$(\'' . diff --git a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Delete.php b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Delete.php index fb512eaf866d99630a5f6e54a4dc4757e0bfd041..89a80f1dffc818569b22a52d3356e0e6a7bf2d8c 100644 --- a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Delete.php +++ b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Delete.php @@ -22,7 +22,7 @@ class Delete extends \Magento\Email\Controller\Adminhtml\Email\Template if (count($template->getSystemConfigPathsWhereUsedCurrently()) == 0) { $template->delete(); // display success message - $this->messageManager->addSuccess(__('The email template has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the email template.')); $this->_objectManager->get('Magento\Framework\App\ReinitableConfig')->reinit(); // go to grid $this->_redirect('adminhtml/*/'); diff --git a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Save.php b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Save.php index 29285d077072aaed2bc6daa4f425076e2d6a7030..5ccf91202530c24352dc0c9b4cd4e544d4979c24 100644 --- a/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Save.php +++ b/app/code/Magento/Email/Controller/Adminhtml/Email/Template/Save.php @@ -53,7 +53,7 @@ class Save extends \Magento\Email\Controller\Adminhtml\Email\Template $template->save(); $this->_objectManager->get('Magento\Backend\Model\Session')->setFormData(false); - $this->messageManager->addSuccess(__('The email template has been saved.')); + $this->messageManager->addSuccess(__('You saved the email template.')); $this->_redirect('adminhtml/*'); } catch (\Exception $e) { $this->_objectManager->get( diff --git a/app/code/Magento/Email/Model/AbstractTemplate.php b/app/code/Magento/Email/Model/AbstractTemplate.php index 4eba984b8fcfa243c684cce9019a51444cad3283..4b92506e5118417cdba79e7b8556afd8974fe8da 100644 --- a/app/code/Magento/Email/Model/AbstractTemplate.php +++ b/app/code/Magento/Email/Model/AbstractTemplate.php @@ -71,22 +71,26 @@ abstract class AbstractTemplate extends AbstractModel implements TemplateTypesIn * @param \Magento\Framework\Registry $registry * @param \Magento\Store\Model\App\Emulation $appEmulation * @param \Magento\Store\Model\StoreManagerInterface $storeManager + * @param \Magento\Framework\Model\Resource\AbstractResource $resource + * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data */ public function __construct( \Magento\Framework\Model\Context $context, - \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, + \Magento\Framework\View\DesignInterface $design, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Store\Model\StoreManagerInterface $storeManager, - array $data = [] + array $data = [], + \Magento\Framework\Model\Resource\AbstractResource $resource = null, + \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null ) { $this->_design = $design; $this->_area = isset($data['area']) ? $data['area'] : null; $this->_store = isset($data['store']) ? $data['store'] : null; $this->_appEmulation = $appEmulation; $this->_storeManager = $storeManager; - parent::__construct($context, $registry, null, null, $data); + parent::__construct($context, $registry, $resource, $resourceCollection, $data); } /** diff --git a/app/code/Magento/Email/Model/BackendTemplate.php b/app/code/Magento/Email/Model/BackendTemplate.php index c8bc6b34398e0c492f9123cfaeedc8182da23299..e95278407067921ce22144ee327204e518b60625 100644 --- a/app/code/Magento/Email/Model/BackendTemplate.php +++ b/app/code/Magento/Email/Model/BackendTemplate.php @@ -38,8 +38,8 @@ class BackendTemplate extends Template */ public function __construct( \Magento\Framework\Model\Context $context, - \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, + \Magento\Framework\View\DesignInterface $design, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\Filesystem $filesystem, @@ -53,8 +53,8 @@ class BackendTemplate extends Template ) { parent::__construct( $context, - $design, $registry, + $design, $appEmulation, $storeManager, $filesystem, diff --git a/app/code/Magento/Email/Model/Template.php b/app/code/Magento/Email/Model/Template.php index 577393b498924af0885edb1affd4f97c6feec9bb..a349f5d9ed0708300e369fb97800dc258f3ded2d 100644 --- a/app/code/Magento/Email/Model/Template.php +++ b/app/code/Magento/Email/Model/Template.php @@ -156,10 +156,10 @@ class Template extends \Magento\Email\Model\AbstractTemplate implements \Magento /** * @param \Magento\Framework\Model\Context $context - * @param \Magento\Framework\View\DesignInterface $design * @param \Magento\Framework\Registry $registry + * @param \Magento\Framework\View\DesignInterface $design * @param \Magento\Store\Model\App\Emulation $appEmulation - * @param \Magento\Store\Model\StoreManagerInterface $storeManager + * @param StoreManagerInterface $storeManager * @param \Magento\Framework\Filesystem $filesystem * @param \Magento\Framework\View\Asset\Repository $assetRepo * @param \Magento\Framework\View\FileSystem $viewFileSystem @@ -167,13 +167,15 @@ class Template extends \Magento\Email\Model\AbstractTemplate implements \Magento * @param Template\FilterFactory $emailFilterFactory * @param Template\Config $emailConfig * @param array $data + * @param \Magento\Framework\Model\Resource\AbstractResource $resource + * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( \Magento\Framework\Model\Context $context, - \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, + \Magento\Framework\View\DesignInterface $design, \Magento\Store\Model\App\Emulation $appEmulation, StoreManagerInterface $storeManager, \Magento\Framework\Filesystem $filesystem, @@ -182,7 +184,9 @@ class Template extends \Magento\Email\Model\AbstractTemplate implements \Magento \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Email\Model\Template\FilterFactory $emailFilterFactory, \Magento\Email\Model\Template\Config $emailConfig, - array $data = [] + array $data = [], + \Magento\Framework\Model\Resource\AbstractResource $resource = null, + \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null ) { $this->_scopeConfig = $scopeConfig; $this->_filesystem = $filesystem; @@ -190,7 +194,16 @@ class Template extends \Magento\Email\Model\AbstractTemplate implements \Magento $this->_viewFileSystem = $viewFileSystem; $this->_emailFilterFactory = $emailFilterFactory; $this->_emailConfig = $emailConfig; - parent::__construct($context, $design, $registry, $appEmulation, $storeManager, $data); + parent::__construct( + $context, + $registry, + $design, + $appEmulation, + $storeManager, + $data, + $resource, + $resourceCollection + ); } /** @@ -603,7 +616,7 @@ class Template extends \Magento\Email\Model\AbstractTemplate implements \Magento { $code = $this->getTemplateCode(); if (empty($code)) { - throw new \Magento\Framework\Exception\MailException(__('The template Name must not be empty.')); + throw new \Magento\Framework\Exception\MailException(__('Please enter a template name.')); } if ($this->_getResource()->checkCodeUsage($this)) { throw new \Magento\Framework\Exception\MailException(__('Duplicate Of Template Name')); diff --git a/app/code/Magento/Email/Setup/InstallSchema.php b/app/code/Magento/Email/Setup/InstallSchema.php index 4b349973479bff4fb8e226524fe3e15f4a77775b..05931d6105662a56a9003e882d5a8a636521f94e 100644 --- a/app/code/Magento/Email/Setup/InstallSchema.php +++ b/app/code/Magento/Email/Setup/InstallSchema.php @@ -33,7 +33,7 @@ class InstallSchema implements InstallSchemaInterface \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], - 'Template Id' + 'Template ID' )->addColumn( 'template_code', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, diff --git a/app/code/Magento/Email/Test/Unit/Model/TemplateTest.php b/app/code/Magento/Email/Test/Unit/Model/TemplateTest.php index 47d4e8e0929ac4722552617b51d069385d24d2be..3c89c3a8532971729ea0a7fcbb408ef0854fb2a3 100644 --- a/app/code/Magento/Email/Test/Unit/Model/TemplateTest.php +++ b/app/code/Magento/Email/Test/Unit/Model/TemplateTest.php @@ -122,8 +122,8 @@ class TemplateTest extends \PHPUnit_Framework_TestCase ->setConstructorArgs( [ $this->context, - $this->design, $this->registry, + $this->design, $this->appEmulation, $this->storeManager, $this->filesystem, @@ -758,8 +758,8 @@ class TemplateTest extends \PHPUnit_Framework_TestCase )->setConstructorArgs( [ $this->getMock('Magento\Framework\Model\Context', [], [], '', false), - $this->getMock('Magento\Theme\Model\View\Design', [], [], '', false), $this->getMock('Magento\Framework\Registry', [], [], '', false), + $this->getMock('Magento\Theme\Model\View\Design', [], [], '', false), $this->getMock('Magento\Store\Model\App\Emulation', [], [], '', false), $this->getMock('Magento\Store\Model\StoreManager', [], [], '', false), $this->getMock('Magento\Framework\Filesystem', [], [], '', false), diff --git a/app/code/Magento/Email/view/adminhtml/templates/template/edit.phtml b/app/code/Magento/Email/view/adminhtml/templates/template/edit.phtml index 2d9e527653d9e8be2c84b3a0b90757297ea562f6..96b6789adca87d7f6f99d5ea8ae95bf6f8854e7f 100644 --- a/app/code/Magento/Email/view/adminhtml/templates/template/edit.phtml +++ b/app/code/Magento/Email/view/adminhtml/templates/template/edit.phtml @@ -109,7 +109,7 @@ require([ }, stripTags: function () { - if(!window.confirm("<?php echo __('Are you sure that you want to strip tags?') ?>")) { + if(!window.confirm("<?php echo __('Are you sure you want to strip tags?') ?>")) { return false; } this.unconvertedText = $('template_text').value; @@ -160,7 +160,7 @@ require([ }, deleteTemplate: function() { - if(window.confirm("<?php echo __('Are you sure that you want to delete this template?') ?>")) { + if(window.confirm("<?php echo __('Are you sure you want to delete this template?') ?>")) { window.location.href = '<?php echo $block->getDeleteUrl() ?>'; } }, @@ -205,7 +205,7 @@ require([ } }.bind(this)); } else { - alert('<?php echo __('Failed to load template. See error log for details.') ?>'); + alert('<?php echo __('The template did not load. Please review the log for details.') ?>'); } }.bind(this) }); diff --git a/app/code/Magento/Fedex/Model/Carrier.php b/app/code/Magento/Fedex/Model/Carrier.php index 66f266dd1a8450611cba7a72e55e406a135e6caa..db802c1912e2c9ca34d2ba5a1c89d989d11b79fd 100644 --- a/app/code/Magento/Fedex/Model/Carrier.php +++ b/app/code/Magento/Fedex/Model/Carrier.php @@ -506,7 +506,7 @@ class Carrier extends AbstractCarrierOnline implements \Magento\Shipping\Model\C { $costArr = []; $priceArr = []; - $errorTitle = 'Unable to retrieve tracking'; + $errorTitle = 'For some reason we can\'t retrieve tracking info right now.'; if (is_object($response)) { if ($response->HighestSeverity == 'FAILURE' || $response->HighestSeverity == 'ERROR') { @@ -736,7 +736,7 @@ class Carrier extends AbstractCarrierOnline implements \Magento\Shipping\Model\C $errorTitle = 'Response is in the wrong format.'; } } else { - $errorTitle = 'Unable to retrieve tracking'; + $errorTitle = 'For some reason we can\'t retrieve tracking info right now.'; } $result = $this->_rateFactory->create(); @@ -1139,7 +1139,9 @@ class Carrier extends AbstractCarrierOnline implements \Magento\Shipping\Model\C $error->setCarrier('fedex'); $error->setCarrierTitle($this->getConfigData('title')); $error->setTracking($trackingValue); - $error->setErrorMessage($errorTitle ? $errorTitle : __('Unable to retrieve tracking')); + $error->setErrorMessage( + $errorTitle ? $errorTitle : __('For some reason we can\'t retrieve tracking info right now.') + ); $this->_result->append($error); } } diff --git a/app/code/Magento/Fedex/etc/wsdl/RateService_v10.wsdl b/app/code/Magento/Fedex/etc/wsdl/RateService_v10.wsdl index 71d40621665b6c686fa594aaf303d2eb300d0447..6ae04ccee077560ab8b015acffaaa20d9e00df7e 100644 --- a/app/code/Magento/Fedex/etc/wsdl/RateService_v10.wsdl +++ b/app/code/Magento/Fedex/etc/wsdl/RateService_v10.wsdl @@ -3558,7 +3558,7 @@ </xs:simpleType> <xs:simpleType name="ReturnEMailAllowedSpecialServiceType"> <xs:annotation> - <xs:documentation>These values are used to control the availability of certain special services at the time when a customer uses the e-mail label link to create a return shipment.</xs:documentation> + <xs:documentation>These values are used to control the availability of certain special services at the time when a customer uses the email label link to create a return shipment.</xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> <xs:enumeration value="SATURDAY_DELIVERY"/> @@ -4106,7 +4106,7 @@ </xs:element> <xs:element name="PendingShipmentDetail" type="ns:PendingShipmentDetail" minOccurs="0"> <xs:annotation> - <xs:documentation>This field should be populated for pending shipments (e.g. e-mail label) It is required by a PENDING_SHIPMENT special service type.</xs:documentation> + <xs:documentation>This field should be populated for pending shipments (e.g. email label) It is required by a PENDING_SHIPMENT special service type.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="ShipmentDryIceDetail" type="ns:ShipmentDryIceDetail" minOccurs="0"> @@ -4150,7 +4150,7 @@ </xs:element> <xs:element name="EMailDetail" type="ns:ShippingDocumentEMailDetail" minOccurs="0"> <xs:annotation> - <xs:documentation>Specifies how to e-mail document images.</xs:documentation> + <xs:documentation>Specifies how to email document images.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="PrintDetail" type="ns:ShippingDocumentPrintDetail" minOccurs="0"> @@ -4176,17 +4176,17 @@ </xs:simpleType> <xs:complexType name="ShippingDocumentEMailDetail"> <xs:annotation> - <xs:documentation>Specifies how to e-mail shipping documents.</xs:documentation> + <xs:documentation>Specifies how to email shipping documents.</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="EMailRecipients" type="ns:ShippingDocumentEMailRecipient" minOccurs="0" maxOccurs="unbounded"> <xs:annotation> - <xs:documentation>Provides the roles and email addresses for e-mail recipients.</xs:documentation> + <xs:documentation>Provides the roles and email addresses for email recipients.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="Grouping" type="ns:ShippingDocumentEMailGroupingType" minOccurs="0"> <xs:annotation> - <xs:documentation>Identifies the convention by which documents are to be grouped as e-mail attachments.</xs:documentation> + <xs:documentation>Identifies the convention by which documents are to be grouped as email attachments.</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> @@ -4199,7 +4199,7 @@ </xs:simpleType> <xs:complexType name="ShippingDocumentEMailRecipient"> <xs:annotation> - <xs:documentation>Specifies an individual recipient of e-mailed shipping document(s).</xs:documentation> + <xs:documentation>Specifies an individual recipient of emailed shipping document(s).</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="RecipientType" type="ns:EMailNotificationRecipientType" minOccurs="0"> diff --git a/app/code/Magento/Fedex/etc/wsdl/RateService_v9.wsdl b/app/code/Magento/Fedex/etc/wsdl/RateService_v9.wsdl index 6cc5074785ac0c891b2f869996aee61ec1b92be4..efbf75076c2cb14dfe1cfc7020efbf849ad91d65 100644 --- a/app/code/Magento/Fedex/etc/wsdl/RateService_v9.wsdl +++ b/app/code/Magento/Fedex/etc/wsdl/RateService_v9.wsdl @@ -3598,7 +3598,7 @@ </xs:simpleType> <xs:simpleType name="ReturnEMailAllowedSpecialServiceType"> <xs:annotation> - <xs:documentation>These values are used to control the availability of certain special services at the time when a customer uses the e-mail label link to create a return shipment.</xs:documentation> + <xs:documentation>These values are used to control the availability of certain special services at the time when a customer uses the email label link to create a return shipment.</xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> <xs:enumeration value="SATURDAY_DELIVERY"/> @@ -3991,7 +3991,7 @@ </xs:element> <xs:element name="PendingShipmentDetail" type="ns:PendingShipmentDetail" minOccurs="0"> <xs:annotation> - <xs:documentation>This field should be populated for pending shipments (e.g. e-mail label) It is required by a PENDING_SHIPMENT special service type.</xs:documentation> + <xs:documentation>This field should be populated for pending shipments (e.g. email label) It is required by a PENDING_SHIPMENT special service type.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="ShipmentDryIceDetail" type="ns:ShipmentDryIceDetail" minOccurs="0"> @@ -4035,7 +4035,7 @@ </xs:element> <xs:element name="EMailDetail" type="ns:ShippingDocumentEMailDetail" minOccurs="0"> <xs:annotation> - <xs:documentation>Specifies how to e-mail document images.</xs:documentation> + <xs:documentation>Specifies how to email document images.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="PrintDetail" type="ns:ShippingDocumentPrintDetail" minOccurs="0"> @@ -4061,17 +4061,17 @@ </xs:simpleType> <xs:complexType name="ShippingDocumentEMailDetail"> <xs:annotation> - <xs:documentation>Specifies how to e-mail shipping documents.</xs:documentation> + <xs:documentation>Specifies how to email shipping documents.</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="EMailRecipients" type="ns:ShippingDocumentEMailRecipient" minOccurs="0" maxOccurs="unbounded"> <xs:annotation> - <xs:documentation>Provides the roles and email addresses for e-mail recipients.</xs:documentation> + <xs:documentation>Provides the roles and email addresses for email recipients.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="Grouping" type="ns:ShippingDocumentEMailGroupingType" minOccurs="0"> <xs:annotation> - <xs:documentation>Identifies the convention by which documents are to be grouped as e-mail attachments.</xs:documentation> + <xs:documentation>Identifies the convention by which documents are to be grouped as email attachments.</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> @@ -4084,7 +4084,7 @@ </xs:simpleType> <xs:complexType name="ShippingDocumentEMailRecipient"> <xs:annotation> - <xs:documentation>Specifies an individual recipient of e-mailed shipping document(s).</xs:documentation> + <xs:documentation>Specifies an individual recipient of emailed shipping document(s).</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="RecipientType" type="ns:EMailNotificationRecipientType" minOccurs="0"> diff --git a/app/code/Magento/Fedex/etc/wsdl/ShipService_v10.wsdl b/app/code/Magento/Fedex/etc/wsdl/ShipService_v10.wsdl index 6f19ffa115d50c7c88da5ded93ca6c47bdceebdf..6c43af98ef682e1526dff115a4ce9a4bf1b7fcb8 100644 --- a/app/code/Magento/Fedex/etc/wsdl/ShipService_v10.wsdl +++ b/app/code/Magento/Fedex/etc/wsdl/ShipService_v10.wsdl @@ -3811,7 +3811,7 @@ </xs:simpleType> <xs:simpleType name="ReturnEMailAllowedSpecialServiceType"> <xs:annotation> - <xs:documentation>These values are used to control the availability of certain special services at the time when a customer uses the e-mail label link to create a return shipment.</xs:documentation> + <xs:documentation>These values are used to control the availability of certain special services at the time when a customer uses the email label link to create a return shipment.</xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> <xs:enumeration value="SATURDAY_DELIVERY"/> @@ -4410,7 +4410,7 @@ </xs:element> <xs:element name="PendingShipmentDetail" type="ns:PendingShipmentDetail" minOccurs="0"> <xs:annotation> - <xs:documentation>This field should be populated for pending shipments (e.g. e-mail label) It is required by a PENDING_SHIPMENT special service type.</xs:documentation> + <xs:documentation>This field should be populated for pending shipments (e.g. email label) It is required by a PENDING_SHIPMENT special service type.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="ShipmentDryIceDetail" type="ns:ShipmentDryIceDetail" minOccurs="0"> @@ -4490,7 +4490,7 @@ </xs:element> <xs:element name="EMailDetail" type="ns:ShippingDocumentEMailDetail" minOccurs="0"> <xs:annotation> - <xs:documentation>Specifies how to e-mail document images.</xs:documentation> + <xs:documentation>Specifies how to email document images.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="PrintDetail" type="ns:ShippingDocumentPrintDetail" minOccurs="0"> @@ -4516,17 +4516,17 @@ </xs:simpleType> <xs:complexType name="ShippingDocumentEMailDetail"> <xs:annotation> - <xs:documentation>Specifies how to e-mail shipping documents.</xs:documentation> + <xs:documentation>Specifies how to email shipping documents.</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="EMailRecipients" type="ns:ShippingDocumentEMailRecipient" minOccurs="0" maxOccurs="unbounded"> <xs:annotation> - <xs:documentation>Provides the roles and email addresses for e-mail recipients.</xs:documentation> + <xs:documentation>Provides the roles and email addresses for email recipients.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="Grouping" type="ns:ShippingDocumentEMailGroupingType" minOccurs="0"> <xs:annotation> - <xs:documentation>Identifies the convention by which documents are to be grouped as e-mail attachments.</xs:documentation> + <xs:documentation>Identifies the convention by which documents are to be grouped as email attachments.</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> @@ -4539,7 +4539,7 @@ </xs:simpleType> <xs:complexType name="ShippingDocumentEMailRecipient"> <xs:annotation> - <xs:documentation>Specifies an individual recipient of e-mailed shipping document(s).</xs:documentation> + <xs:documentation>Specifies an individual recipient of emailed shipping document(s).</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="RecipientType" type="ns:EMailNotificationRecipientType" minOccurs="0"> diff --git a/app/code/Magento/Fedex/etc/wsdl/ShipService_v9.wsdl b/app/code/Magento/Fedex/etc/wsdl/ShipService_v9.wsdl index d2a670661dd827fd251d143bbfafd669d357a57c..8c11a5f660351d1f7e5d15b435ab10e25f4052e0 100644 --- a/app/code/Magento/Fedex/etc/wsdl/ShipService_v9.wsdl +++ b/app/code/Magento/Fedex/etc/wsdl/ShipService_v9.wsdl @@ -3811,7 +3811,7 @@ </xs:simpleType> <xs:simpleType name="ReturnEMailAllowedSpecialServiceType"> <xs:annotation> - <xs:documentation>These values are used to control the availability of certain special services at the time when a customer uses the e-mail label link to create a return shipment.</xs:documentation> + <xs:documentation>These values are used to control the availability of certain special services at the time when a customer uses the email label link to create a return shipment.</xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> <xs:enumeration value="SATURDAY_DELIVERY"/> @@ -4410,7 +4410,7 @@ </xs:element> <xs:element name="PendingShipmentDetail" type="ns:PendingShipmentDetail" minOccurs="0"> <xs:annotation> - <xs:documentation>This field should be populated for pending shipments (e.g. e-mail label) It is required by a PENDING_SHIPMENT special service type.</xs:documentation> + <xs:documentation>This field should be populated for pending shipments (e.g. email label) It is required by a PENDING_SHIPMENT special service type.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="ShipmentDryIceDetail" type="ns:ShipmentDryIceDetail" minOccurs="0"> @@ -4490,7 +4490,7 @@ </xs:element> <xs:element name="EMailDetail" type="ns:ShippingDocumentEMailDetail" minOccurs="0"> <xs:annotation> - <xs:documentation>Specifies how to e-mail document images.</xs:documentation> + <xs:documentation>Specifies how to email document images.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="PrintDetail" type="ns:ShippingDocumentPrintDetail" minOccurs="0"> @@ -4516,17 +4516,17 @@ </xs:simpleType> <xs:complexType name="ShippingDocumentEMailDetail"> <xs:annotation> - <xs:documentation>Specifies how to e-mail shipping documents.</xs:documentation> + <xs:documentation>Specifies how to email shipping documents.</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="EMailRecipients" type="ns:ShippingDocumentEMailRecipient" minOccurs="0" maxOccurs="unbounded"> <xs:annotation> - <xs:documentation>Provides the roles and email addresses for e-mail recipients.</xs:documentation> + <xs:documentation>Provides the roles and email addresses for email recipients.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="Grouping" type="ns:ShippingDocumentEMailGroupingType" minOccurs="0"> <xs:annotation> - <xs:documentation>Identifies the convention by which documents are to be grouped as e-mail attachments.</xs:documentation> + <xs:documentation>Identifies the convention by which documents are to be grouped as email attachments.</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> @@ -4539,7 +4539,7 @@ </xs:simpleType> <xs:complexType name="ShippingDocumentEMailRecipient"> <xs:annotation> - <xs:documentation>Specifies an individual recipient of e-mailed shipping document(s).</xs:documentation> + <xs:documentation>Specifies an individual recipient of emailed shipping document(s).</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="RecipientType" type="ns:EMailNotificationRecipientType" minOccurs="0"> diff --git a/app/code/Magento/GiftMessage/Api/GuestCartRepositoryInterface.php b/app/code/Magento/GiftMessage/Api/GuestCartRepositoryInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..93973b139a221edb40fb63a51691c506a6ac66dd --- /dev/null +++ b/app/code/Magento/GiftMessage/Api/GuestCartRepositoryInterface.php @@ -0,0 +1,33 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Api; + +/** + * Interface GuestCartRepositoryInterface + * @api + */ +interface GuestCartRepositoryInterface +{ + /** + * Return the gift message for a specified order. + * + * @param string $cartId The shopping cart ID. + * @return \Magento\GiftMessage\Api\Data\MessageInterface Gift message. + */ + public function get($cartId); + + /** + * Set the gift message for an entire order. + * + * @param string $cartId The cart ID. + * @param \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage The gift message. + * @return bool + * @throws \Magento\Framework\Exception\NoSuchEntityException The specified cart does not exist. + * @throws \Magento\Framework\Exception\InputException You cannot add gift messages to empty carts. + * @throws \Magento\Framework\Exception\CouldNotSaveException The specified gift message could not be saved. + */ + public function save($cartId, \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage); +} diff --git a/app/code/Magento/GiftMessage/Api/GuestItemRepositoryInterface.php b/app/code/Magento/GiftMessage/Api/GuestItemRepositoryInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..31ce48c0907271a6d2b47089683a8af1d4f56e8a --- /dev/null +++ b/app/code/Magento/GiftMessage/Api/GuestItemRepositoryInterface.php @@ -0,0 +1,36 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Api; + +/** + * Interface GuestItemRepositoryInterface + * @api + */ +interface GuestItemRepositoryInterface +{ + /** + * Return the gift message for a specified item in a specified shopping cart. + * + * @param string $cartId The shopping cart ID. + * @param int $itemId The item ID. + * @return \Magento\GiftMessage\Api\Data\MessageInterface Gift message. + * @throws \Magento\Framework\Exception\NoSuchEntityException The specified item does not exist in the cart. + */ + public function get($cartId, $itemId); + + /** + * Set the gift message for a specified item in a specified shopping cart. + * + * @param string $cartId The cart ID. + * @param \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage The gift message. + * @param int $itemId The item ID. + * @return bool + * @throws \Magento\Framework\Exception\NoSuchEntityException The specified cart does not exist. + * @throws \Magento\Framework\Exception\InputException You cannot add gift messages to empty carts. + * @throws \Magento\Framework\Exception\CouldNotSaveException The specified gift message could not be saved. + */ + public function save($cartId, \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage, $itemId); +} diff --git a/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php b/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php new file mode 100644 index 0000000000000000000000000000000000000000..bf208eb18eac7714eef0689d9178821e7346cdb5 --- /dev/null +++ b/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php @@ -0,0 +1,81 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Block\Cart; + +use Magento\Backend\Block\Template\Context; +use Magento\Framework\Json\Encoder; +use Magento\GiftMessage\Model\CompositeConfigProvider; + +class GiftOptions extends \Magento\Backend\Block\Template +{ + /** + * @var bool + */ + protected $_isScopePrivate = false; + + /** + * @var array + */ + protected $jsLayout; + + /** + * @var \Magento\Checkout\Model\CompositeConfigProvider + */ + protected $configProvider; + + /** + * @var array|\Magento\Checkout\Block\Checkout\LayoutProcessorInterface[] + */ + protected $layoutProcessors; + + /** + * @var Encoder + */ + protected $jsonEncoder; + + /** + * @param Context $context + * @param Encoder $jsonEncoder + * @param CompositeConfigProvider $configProvider + * @param array $layoutProcessors + * @param array $data + */ + public function __construct( + Context $context, + Encoder $jsonEncoder, + CompositeConfigProvider $configProvider, + array $layoutProcessors = [], + array $data = [] + ) { + parent::__construct($context, $data); + $this->jsonEncoder = $jsonEncoder; + $this->_isScopePrivate = true; + $this->jsLayout = isset($data['jsLayout']) && is_array($data['jsLayout']) ? $data['jsLayout'] : []; + $this->configProvider = $configProvider; + $this->layoutProcessors = $layoutProcessors; + } + + /** + * @return string + */ + public function getJsLayout() + { + foreach ($this->layoutProcessors as $processor) { + $this->jsLayout = $processor->process($this->jsLayout); + } + return $this->jsonEncoder->encode($this->jsLayout); + } + + /** + * Retrieve gift message configuration + * + * @return array + */ + public function getGiftOptionsConfigJson() + { + return $this->jsonEncoder->encode($this->configProvider->getConfig()); + } +} diff --git a/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php new file mode 100644 index 0000000000000000000000000000000000000000..429279e7ff2c9fc409716b6361d6991908e2dccb --- /dev/null +++ b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php @@ -0,0 +1,66 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Block\Cart\Item\Renderer\Actions; + +use Magento\Backend\Block\Template\Context; +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Framework\Json\Encoder; + +class GiftOptions extends Generic +{ + /** + * @var bool + */ + protected $_isScopePrivate = false; + + /** + * @var array + */ + protected $jsLayout; + + /** + * @var array|LayoutProcessorInterface[] + */ + protected $layoutProcessors; + + /** + * @var Encoder + */ + protected $jsonEncoder; + + /** + * @param Context $context + * @param Encoder $jsonEncoder + * @param array $layoutProcessors + * @param array $data + */ + public function __construct( + Context $context, + Encoder $jsonEncoder, + array $layoutProcessors = [], + array $data = [] + ) { + parent::__construct($context, $data); + $this->jsonEncoder = $jsonEncoder; + $this->_isScopePrivate = true; + $this->jsLayout = isset($data['jsLayout']) && is_array($data['jsLayout']) ? $data['jsLayout'] : []; + $this->layoutProcessors = $layoutProcessors; + } + + /** + * Return JS layout + * + * @return string + */ + public function getJsLayout() + { + $jsLayout = $this->jsLayout; + foreach ($this->layoutProcessors as $processor) { + $jsLayout = $processor->process($jsLayout, $this->getItem()); + } + return $this->jsonEncoder->encode($jsLayout); + } +} diff --git a/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/ItemIdProcessor.php b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/ItemIdProcessor.php new file mode 100644 index 0000000000000000000000000000000000000000..e3a2d93376a431294e35ef03ab7371f1e0da8255 --- /dev/null +++ b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/ItemIdProcessor.php @@ -0,0 +1,34 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Block\Cart\Item\Renderer\Actions; + +use Magento\Quote\Model\Quote\Item; + +class ItemIdProcessor implements LayoutProcessorInterface +{ + /** + * Adds item ID to giftOptionsCartItem configuration and name + * + * @param array $jsLayout + * @param Item $item + * @return array + */ + public function process($jsLayout, Item $item) + { + if (isset($jsLayout['components']['giftOptionsCartItem'])) { + if (!isset($jsLayout['components']['giftOptionsCartItem']['config'])) { + $jsLayout['components']['giftOptionsCartItem']['config'] = []; + } + $jsLayout['components']['giftOptionsCartItem']['config']['itemId'] = $item->getId(); + + $jsLayout['components']['giftOptionsCartItem-' . $item->getId()] = + $jsLayout['components']['giftOptionsCartItem']; + unset($jsLayout['components']['giftOptionsCartItem']); + } + + return $jsLayout; + } +} diff --git a/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/LayoutProcessorInterface.php b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/LayoutProcessorInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..5e8ecfacb3a3bdcb0cf2cb4a3c41aae8cdfe39a8 --- /dev/null +++ b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/LayoutProcessorInterface.php @@ -0,0 +1,20 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Block\Cart\Item\Renderer\Actions; + +use Magento\Quote\Model\Quote\Item; + +interface LayoutProcessorInterface +{ + /** + * Process JS layout of block + * + * @param array $jsLayout + * @param Item $item + * @return array + */ + public function process($jsLayout, Item $item); +} diff --git a/app/code/Magento/GiftMessage/Model/CartRepository.php b/app/code/Magento/GiftMessage/Model/CartRepository.php index 4fe6b988236c6258fc0d7f7068a72f803468debb..7cb8058bfb250ad003ed865e2bd807cf54a9c607 100644 --- a/app/code/Magento/GiftMessage/Model/CartRepository.php +++ b/app/code/Magento/GiftMessage/Model/CartRepository.php @@ -12,7 +12,7 @@ use Magento\Framework\Exception\InputException; use Magento\Framework\Exception\State\InvalidTransitionException; /** - * Shopping cart gift message repository object. + * Shopping cart gift message repository object for registered customer */ class CartRepository implements \Magento\GiftMessage\Api\CartRepositoryInterface { diff --git a/app/code/Magento/GiftMessage/Model/CompositeConfigProvider.php b/app/code/Magento/GiftMessage/Model/CompositeConfigProvider.php new file mode 100644 index 0000000000000000000000000000000000000000..49fe4c189b1971e7d2eb8b9babea91d665e1fc43 --- /dev/null +++ b/app/code/Magento/GiftMessage/Model/CompositeConfigProvider.php @@ -0,0 +1,37 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Model; + +use Magento\Checkout\Model\ConfigProviderInterface; + +class CompositeConfigProvider implements ConfigProviderInterface +{ + /** + * @var ConfigProviderInterface[] + */ + private $configProviders; + + /** + * @param ConfigProviderInterface[] $configProviders + */ + public function __construct( + array $configProviders + ) { + $this->configProviders = $configProviders; + } + + /** + * {@inheritdoc} + */ + public function getConfig() + { + $config = []; + foreach ($this->configProviders as $configProvider) { + $config = array_merge_recursive($config, $configProvider->getConfig()); + } + return $config; + } +} diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index aac0982ecb6048d72321897b820d6222fab0b6ec..18d2b55950c90179d2234eb50203e94b1aaf8607 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -7,9 +7,16 @@ namespace Magento\GiftMessage\Model; use Magento\Checkout\Model\ConfigProviderInterface; use Magento\GiftMessage\Helper\Message as GiftMessageHelper; +use Magento\Framework\App\Http\Context as HttpContext; +use Magento\Customer\Model\Context as CustomerContext; +use Magento\Framework\UrlInterface; +use Magento\Framework\Locale\FormatInterface as LocaleFormat; +use Magento\Framework\Data\Form\FormKey; /** - * Configuration provider for GiftMessage rendering on "Shipping Method" step of checkout. + * Configuration provider for GiftMessage rendering on "Checkout cart" page. + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.NPathComplexity) */ class GiftMessageConfigProvider implements ConfigProviderInterface { @@ -33,22 +40,49 @@ class GiftMessageConfigProvider implements ConfigProviderInterface */ protected $checkoutSession; + /** + * @var \Magento\Store\Model\StoreManagerInterface + */ + protected $storeManager; + + /** + * @var LocaleFormat + */ + protected $localeFormat; + + /** + * @var FormKey + */ + protected $formKey; + /** * @param \Magento\Framework\App\Helper\Context $context * @param \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository * @param \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository * @param \Magento\Checkout\Model\Session $checkoutSession + * @param HttpContext $httpContext + * @param \Magento\Store\Model\StoreManagerInterface $storeManager + * @param LocaleFormat $localeFormat + * @param FormKey $formKey */ public function __construct( \Magento\Framework\App\Helper\Context $context, \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository, \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository, - \Magento\Checkout\Model\Session $checkoutSession + \Magento\Checkout\Model\Session $checkoutSession, + HttpContext $httpContext, + \Magento\Store\Model\StoreManagerInterface $storeManager, + LocaleFormat $localeFormat, + FormKey $formKey ) { $this->scopeConfiguration = $context->getScopeConfig(); $this->cartRepository = $cartRepository; $this->itemRepository = $itemRepository; $this->checkoutSession = $checkoutSession; + $this->httpContext = $httpContext; + $this->storeManager = $storeManager; + $this->localeFormat = $localeFormat; + $this-> formKey = $formKey; } /** @@ -57,6 +91,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface public function getConfig() { $configuration = []; + $configuration['giftMessage'] = []; $orderLevelGiftMessageConfiguration = (bool)$this->scopeConfiguration->getValue( GiftMessageHelper::XPATH_CONFIG_GIFT_MESSAGE_ALLOW_ORDER, \Magento\Store\Model\ScopeInterface::SCOPE_STORE @@ -67,7 +102,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface ); if ($orderLevelGiftMessageConfiguration) { $orderMessages = $this->getOrderLevelGiftMessages(); - $configuration['isOrderLevelGiftOptionsEnabled'] = true; + $configuration['isOrderLevelGiftOptionsEnabled'] = (bool)$this->isQuoteVirtual() ? false : true; $configuration['giftMessage']['orderLevel'] = $orderMessages === null ? true : $orderMessages->getData(); } if ($itemLevelGiftMessageConfiguration) { @@ -75,9 +110,50 @@ class GiftMessageConfigProvider implements ConfigProviderInterface $configuration['isItemLevelGiftOptionsEnabled'] = true; $configuration['giftMessage']['itemLevel'] = $itemMessages === null ? true : $itemMessages; } + $configuration['priceFormat'] = $this->localeFormat->getPriceFormat( + null, + $this->checkoutSession->getQuote()->getQuoteCurrencyCode() + ); + $configuration['storeCode'] = $this->getStoreCode(); + $configuration['isCustomerLoggedIn'] = $this->isCustomerLoggedIn(); + $configuration['formKey'] = $this->formKey->getFormKey(); + $store = $this->storeManager->getStore(); + $configuration['baseUrl'] = $store->isFrontUrlSecure() + ? $store->getBaseUrl(UrlInterface::URL_TYPE_LINK, true) + : $store->getBaseUrl(UrlInterface::URL_TYPE_LINK, false); return $configuration; } + /** + * Check if customer is logged in + * + * @return bool + */ + private function isCustomerLoggedIn() + { + return (bool)$this->httpContext->getValue(CustomerContext::CONTEXT_AUTH); + } + + /** + * Retrieve store code + * + * @return string + */ + protected function getStoreCode() + { + return $this->checkoutSession->getQuote()->getStore()->getCode(); + } + + /** + * Check if quote is virtual + * + * @return bool + */ + protected function isQuoteVirtual() + { + return $this->checkoutSession->loadCustomerQuote()->getQuote()->getIsVirtual(); + } + /** * Load already specified quote level gift message. * diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageManager.php b/app/code/Magento/GiftMessage/Model/GiftMessageManager.php index bba98363c7d4a608a7e4a23b821b59af8954b642..b230fb2c40c69875bcf35e184c87710e86bbb38b 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageManager.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageManager.php @@ -5,7 +5,6 @@ */ namespace Magento\GiftMessage\Model; -use Magento\Framework\Exception\State\InvalidTransitionException; use Magento\Framework\Exception\CouldNotSaveException; class GiftMessageManager @@ -100,18 +99,9 @@ class GiftMessageManager * @param null|int $entityId The entity ID. * @return void * @throws \Magento\Framework\Exception\CouldNotSaveException The specified gift message is not available. - * @throws \Magento\Framework\Exception\State\InvalidTransitionException The billing or shipping address is not set. */ public function setMessage(\Magento\Quote\Model\Quote $quote, $type, $giftMessage, $entityId = null) { - if ($quote->getBillingAddress()->getCountryId() === null) { - throw new InvalidTransitionException(__('Billing address is not set')); - } - - // check if shipping address is set - if ($quote->getShippingAddress()->getCountryId() === null) { - throw new InvalidTransitionException(__('Shipping address is not set')); - } $message[$type][$entityId] = [ 'from' => $giftMessage->getSender(), 'to' => $giftMessage->getRecipient(), diff --git a/app/code/Magento/GiftMessage/Model/GuestCartRepository.php b/app/code/Magento/GiftMessage/Model/GuestCartRepository.php new file mode 100644 index 0000000000000000000000000000000000000000..b27513fc3550ea850d467d4e0105243664929eb3 --- /dev/null +++ b/app/code/Magento/GiftMessage/Model/GuestCartRepository.php @@ -0,0 +1,61 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\GiftMessage\Model; + +use Magento\GiftMessage\Api\Data\MessageInterface; +use Magento\GiftMessage\Api\GuestCartRepositoryInterface; +use Magento\Quote\Model\QuoteIdMask; +use Magento\Quote\Model\QuoteIdMaskFactory; + +/** + * Shopping cart gift message repository object for guest + */ +class GuestCartRepository implements GuestCartRepositoryInterface +{ + /** + * @var CartRepository + */ + protected $repository; + + /** + * @var QuoteIdMaskFactory + */ + protected $quoteIdMaskFactory; + + /** + * @param CartRepository $repository + * @param QuoteIdMaskFactory $quoteIdMaskFactory + */ + public function __construct( + CartRepository $repository, + QuoteIdMaskFactory $quoteIdMaskFactory + ) { + $this->repository = $repository; + $this->quoteIdMaskFactory = $quoteIdMaskFactory; + } + + /** + * {@inheritDoc} + */ + public function get($cartId) + { + /** @var $quoteIdMask QuoteIdMask */ + $quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id'); + return $this->repository->get($quoteIdMask->getQuoteId()); + } + + /** + * {@inheritDoc} + */ + public function save($cartId, MessageInterface $giftMessage) + { + /** @var $quoteIdMask QuoteIdMask */ + $quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id'); + return $this->repository->save($quoteIdMask->getQuoteId(), $giftMessage); + } +} diff --git a/app/code/Magento/GiftMessage/Model/GuestItemRepository.php b/app/code/Magento/GiftMessage/Model/GuestItemRepository.php new file mode 100644 index 0000000000000000000000000000000000000000..d46ed3c55894dbf584f0b41aa687a4fbeb66fc4d --- /dev/null +++ b/app/code/Magento/GiftMessage/Model/GuestItemRepository.php @@ -0,0 +1,61 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\GiftMessage\Model; + +use Magento\GiftMessage\Api\Data\MessageInterface; +use Magento\GiftMessage\Api\GuestItemRepositoryInterface; +use Magento\Quote\Model\QuoteIdMask; +use Magento\Quote\Model\QuoteIdMaskFactory; + +/** + * Shopping cart gift message item repository object for guest + */ +class GuestItemRepository implements GuestItemRepositoryInterface +{ + /** + * @var ItemRepository + */ + protected $repository; + + /** + * @var QuoteIdMaskFactory + */ + protected $quoteIdMaskFactory; + + /** + * @param ItemRepository $repository + * @param QuoteIdMaskFactory $quoteIdMaskFactory + */ + public function __construct( + ItemRepository $repository, + QuoteIdMaskFactory $quoteIdMaskFactory + ) { + $this->repository = $repository; + $this->quoteIdMaskFactory = $quoteIdMaskFactory; + } + + /** + * {@inheritDoc} + */ + public function get($cartId, $itemId) + { + /** @var $quoteIdMask QuoteIdMask */ + $quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id'); + return $this->repository->get($quoteIdMask->getQuoteId(), $itemId); + } + + /** + * {@inheritDoc} + */ + public function save($cartId, MessageInterface $giftMessage, $itemId) + { + /** @var $quoteIdMask QuoteIdMask */ + $quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id'); + return $this->repository->save($quoteIdMask->getQuoteId(), $giftMessage, $itemId); + } +} diff --git a/app/code/Magento/GiftMessage/Model/ItemRepository.php b/app/code/Magento/GiftMessage/Model/ItemRepository.php index d7220d2516f7a2b934d9365a83c481f13249b1c2..cead9782a4ec13bcfacfba5ba47910cf1c4eaa02 100644 --- a/app/code/Magento/GiftMessage/Model/ItemRepository.php +++ b/app/code/Magento/GiftMessage/Model/ItemRepository.php @@ -13,7 +13,7 @@ use Magento\Framework\Exception\State\InvalidTransitionException; use Magento\Framework\Exception\NoSuchEntityException; /** - * Shopping cart gift message item repository object. + * Shopping cart gift message item repository object for registered customer */ class ItemRepository implements \Magento\GiftMessage\Api\ItemRepositoryInterface { diff --git a/app/code/Magento/GiftMessage/Model/Plugin/TotalsDataProcessorPlugin.php b/app/code/Magento/GiftMessage/Model/Plugin/TotalsDataProcessorPlugin.php deleted file mode 100644 index 9d26c0a38b413dc6b3f19718fba77544b0413432..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/Model/Plugin/TotalsDataProcessorPlugin.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\GiftMessage\Model\Plugin; - -use Magento\Quote\Model\Cart\TotalsAdditionalDataProcessor; -use Magento\Quote\Api\Data\TotalsAdditionalDataInterface; - -/** - * Shopping cart gift message item repository object. - */ -class TotalsDataProcessorPlugin -{ - /** - * @var \Magento\GiftMessage\Api\CartRepositoryInterface - */ - protected $cartRepository; - - /** - * @var \Magento\GiftMessage\Api\ItemRepositoryInterface - */ - protected $itemRepositoryInterface; - - /** - * @param \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository - * @param \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository - */ - public function __construct( - \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository, - \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository - ) { - $this->cartRepository = $cartRepository; - $this->itemRepositoryInterface = $itemRepository; - } - - /** - * Set gift messages from additional data. - * - * @param \Magento\Quote\Model\Cart\TotalsAdditionalDataProcessor $subject - * @param TotalsAdditionalDataInterface $additionalData - * @param int $cartId - * @return void - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function beforeProcess( - TotalsAdditionalDataProcessor $subject, - TotalsAdditionalDataInterface $additionalData, - $cartId - ) { - $giftMessages = $additionalData->getExtensionAttributes()->getGiftMessages(); - foreach ($giftMessages as $giftMessage) { - /** @var \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage */ - $entityType = $giftMessage->getExtensionAttributes()->getEntityType(); - $entityId = $giftMessage->getExtensionAttributes()->getEntityId(); - if ($entityType === 'quote') { - $this->cartRepository->save($cartId, $giftMessage); - } elseif ($entityType === 'item') { - $this->itemRepositoryInterface->save($cartId, $giftMessage, $entityId); - } - } - } -} diff --git a/app/code/Magento/GiftMessage/Setup/InstallSchema.php b/app/code/Magento/GiftMessage/Setup/InstallSchema.php index 139148434ccbade948188056f993f91e9df7c7e3..2c4c10593df2219b830f76cd75a0408257ee9638 100644 --- a/app/code/Magento/GiftMessage/Setup/InstallSchema.php +++ b/app/code/Magento/GiftMessage/Setup/InstallSchema.php @@ -51,7 +51,7 @@ class InstallSchema implements InstallSchemaInterface \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 255, [], - 'Recipient' + 'Registrant' )->addColumn( 'message', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..32a94d762c75f446d4fab739287f165ae7e9e58f --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php @@ -0,0 +1,80 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Block\Cart; + +use Magento\GiftMessage\Block\Cart\GiftOptions; + +class GiftOptionsTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Backend\Block\Template\Context|\PHPUnit_Framework_MockObject_MockObject */ + protected $context; + + /** @var \Magento\GiftMessage\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ + protected $compositeConfigProvider; + + /** @var \Magento\Checkout\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ + protected $layoutProcessorMock; + + /** @var \Magento\GiftMessage\Block\Cart\GiftOptions */ + protected $model; + + /** @var \Magento\Framework\Json\Encoder|\PHPUnit_Framework_MockObject_MockObject */ + protected $jsonEncoderMock; + + /** @var array */ + protected $jsLayout = ['root' => 'node']; + + public function setUp() + { + $this->context = $this->getMock('Magento\Backend\Block\Template\Context', [], [], '', false); + $this->jsonEncoderMock = $this->getMock('Magento\Framework\Json\Encoder', [], [], '', false); + $this->compositeConfigProvider = $this->getMock( + 'Magento\GiftMessage\Model\CompositeConfigProvider', + [], + [], + '', + false + ); + $this->layoutProcessorMock = $this->getMockForAbstractClass( + 'Magento\Checkout\Block\Checkout\LayoutProcessorInterface', + [], + '', + false + ); + $this->model = new GiftOptions( + $this->context, + $this->jsonEncoderMock, + $this->compositeConfigProvider, + [$this->layoutProcessorMock], + ['jsLayout' => $this->jsLayout] + ); + } + + public function testGetJsLayout() + { + $this->layoutProcessorMock->expects($this->once()) + ->method('process') + ->with($this->jsLayout) + ->willReturnArgument(0); + $this->jsonEncoderMock->expects($this->once()) + ->method('encode') + ->with($this->jsLayout) + ->willReturnArgument(0); + $this->assertEquals($this->jsLayout, $this->model->getJsLayout()); + } + + public function testGetGiftOptionsConfigJson() + { + $this->compositeConfigProvider->expects($this->once()) + ->method('getConfig') + ->willReturn($this->jsLayout); + $this->jsonEncoderMock->expects($this->once()) + ->method('encode') + ->with($this->jsLayout) + ->willReturnArgument(0); + $this->assertEquals($this->jsLayout, $this->model->getGiftOptionsConfigJson()); + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/GiftOptionsTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/GiftOptionsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0a3f3e89b7db12507f78d643cc47758e7e55eb4c --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/GiftOptionsTest.php @@ -0,0 +1,79 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\Backend\Block\Template\Context; +use Magento\Checkout\Block\Checkout\LayoutProcessorInterface; +use Magento\Framework\Json\Encoder; +use Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions; +use Magento\Quote\Model\Quote\Item; + +class GiftOptionsTest extends \PHPUnit_Framework_TestCase +{ + /** @var GiftOptions */ + protected $model; + + /** @var Context|\PHPUnit_Framework_MockObject_MockObject */ + protected $contextMock; + + /** @var LayoutProcessorInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $layoutProcessorMock; + + /** @var Encoder|\PHPUnit_Framework_MockObject_MockObject */ + protected $jsonEncoderMock; + + /** @var array */ + protected $jsLayout = ['root' => 'node']; + + public function setUp() + { + $this->contextMock = $this->getMockBuilder('Magento\Backend\Block\Template\Context') + ->disableOriginalConstructor() + ->getMock(); + + $this->jsonEncoderMock = $this->getMockBuilder('Magento\Framework\Json\Encoder') + ->disableOriginalConstructor() + ->getMock(); + + $this->compositeConfigProvider = $this->getMockBuilder('Magento\Checkout\Model\CompositeConfigProvider') + ->disableOriginalConstructor() + ->getMock(); + + $this->layoutProcessorMock = $this->getMockBuilder('Magento\Checkout\Block\Checkout\LayoutProcessorInterface') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->model = new GiftOptions( + $this->contextMock, + $this->jsonEncoderMock, + [$this->layoutProcessorMock], + ['jsLayout' => $this->jsLayout] + ); + } + + public function testGetJsLayout() + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $this->layoutProcessorMock->expects($this->once()) + ->method('process') + ->with($this->jsLayout, $itemMock) + ->willReturnArgument(0); + + $this->jsonEncoderMock->expects($this->once()) + ->method('encode') + ->with($this->jsLayout) + ->willReturnArgument(0); + + $this->model->setItem($itemMock); + $this->assertEquals($this->jsLayout, $this->model->getJsLayout()); + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/ItemIdProcessorTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/ItemIdProcessorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..3231c73acb741f51b7cad2b2bd12d46d5b349cce --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/ItemIdProcessorTest.php @@ -0,0 +1,73 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\ItemIdProcessor; +use Magento\Quote\Model\Quote\Item; + +class ItemIdProcessorTest extends \PHPUnit_Framework_TestCase +{ + /** @var ItemIdProcessor */ + protected $model; + + public function setUp() + { + $this->model = new ItemIdProcessor(); + } + + /** + * @param int $itemId + * @param array $jsLayout + * @param array $result + * @dataProvider dataProviderProcess + */ + public function testProcess($itemId, array $jsLayout, array $result) + { + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + $itemMock->expects($this->any()) + ->method('getId') + ->willReturn($itemId); + + $this->assertEquals($result, $this->model->process($jsLayout, $itemMock)); + } + + public function dataProviderProcess() + { + return [ + [ + 12, + ['components' => []], + ['components' => []], + ], + [ + 21, + ['components' => ['giftOptionsCartItem' => []]], + ['components' => ['giftOptionsCartItem-21' => ['config' => ['itemId' => 21]]]], + ], + [ + 23, + ['components' => ['giftOptionsCartItem' => ['config' => ['key' => 'value']]]], + ['components' => ['giftOptionsCartItem-23' => ['config' => ['key' => 'value', 'itemId' => 23]]]], + ], + [ + 23, + ['components' => ['giftOptionsCartItem' => ['config' => ['key' => 'value'], 'key2' => 'value2']]], + [ + 'components' => [ + 'giftOptionsCartItem-23' => [ + 'config' => ['key' => 'value', 'itemId' => 23], 'key2' => 'value2' + ] + ] + ], + ], + ]; + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/CartRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/CartRepositoryTest.php index 6974c1f131cda2f511408dde59205c496619a7a1..2998ba06c7614c722c80bfc5e6a68abfc7266500 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Model/CartRepositoryTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/CartRepositoryTest.php @@ -4,9 +4,10 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\GiftMessage\Test\Unit\Model; +// @codingStandardsIgnoreFile + use Magento\GiftMessage\Model\CartRepository; class CartRepositoryTest extends \PHPUnit_Framework_TestCase diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageManagerTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageManagerTest.php index e44dca6dec3c1d412b24f7110c0a695893267aa6..e578198b12162cdef6f6e7035dce7e48596aa053 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageManagerTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageManagerTest.php @@ -48,16 +48,6 @@ class GiftMessageManagerTest extends \PHPUnit_Framework_TestCase */ protected $giftMessageMock; - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $billingAddressMock; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - protected $shippingAddressMock; - protected function setUp() { $this->messageFactoryMock = @@ -131,10 +121,6 @@ class GiftMessageManagerTest extends \PHPUnit_Framework_TestCase '', false); - $this->billingAddressMock = - $this->getMock('\Magento\Sales\Model\Quote\Address', ['getCountryId', '__wakeup'], [], '', false); - $this->shippingAddressMock = - $this->getMock('\Magento\Sales\Model\Quote\Address', ['getCountryId', '__wakeup'], [], '', false); $this->model = new \Magento\GiftMessage\Model\GiftMessageManager($this->messageFactoryMock); } @@ -332,52 +318,12 @@ class GiftMessageManagerTest extends \PHPUnit_Framework_TestCase $this->model->add($giftMessages, $this->quoteMock); } - /** - * @expectedException \Magento\Framework\Exception\State\InvalidTransitionException - * @expectedExceptionMessage Billing address is not set - */ - public function testSetMessageEmptyBillingAddressException() - { - $this->quoteMock->expects($this->once()) - ->method('getBillingAddress') - ->will($this->returnValue($this->billingAddressMock)); - $this->billingAddressMock->expects($this->once())->method('getCountryId')->will($this->returnValue(null)); - - $this->model->setMessage($this->quoteMock, 'item', $this->giftMessageMock); - } - - /** - * @expectedException \Magento\Framework\Exception\State\InvalidTransitionException - * @expectedExceptionMessage Shipping address is not set - */ - public function testSetMessageEmptyShippingAddressException() - { - $this->quoteMock->expects($this->once()) - ->method('getBillingAddress') - ->will($this->returnValue($this->billingAddressMock)); - $this->billingAddressMock->expects($this->any())->method('getCountryId')->will($this->returnValue(12)); - $this->quoteMock->expects($this->once()) - ->method('getShippingAddress') - ->will($this->returnValue($this->shippingAddressMock)); - $this->shippingAddressMock->expects($this->any())->method('getCountryId')->will($this->returnValue(null)); - - $this->model->setMessage($this->quoteMock, 'item', $this->giftMessageMock); - } - /** * @expectedException \Magento\Framework\Exception\CouldNotSaveException * @expectedExceptionMessage Could not add gift message to shopping cart */ public function testSetMessageCouldNotAddGiftMessageException() { - $this->quoteMock->expects($this->once()) - ->method('getBillingAddress') - ->will($this->returnValue($this->billingAddressMock)); - $this->billingAddressMock->expects($this->once())->method('getCountryId')->will($this->returnValue(12)); - $this->quoteMock->expects($this->once()) - ->method('getShippingAddress') - ->will($this->returnValue($this->shippingAddressMock)); - $this->shippingAddressMock->expects($this->once())->method('getCountryId')->will($this->returnValue(13)); $this->giftMessageMock->expects($this->once())->method('getSender')->will($this->returnValue('sender')); $this->giftMessageMock->expects($this->once())->method('getRecipient')->will($this->returnValue('recipient')); $this->giftMessageMock->expects($this->once())->method('getMessage')->will($this->returnValue('Message')); @@ -388,5 +334,4 @@ class GiftMessageManagerTest extends \PHPUnit_Framework_TestCase $this->model->setMessage($this->quoteMock, 'item', $this->giftMessageMock); } - } diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8344cdd7541ee114dd203e62a4357fe93106344d --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php @@ -0,0 +1,122 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Model; + +// @codingStandardsIgnoreFile + +use Magento\GiftMessage\Api\Data\MessageInterface; +use Magento\GiftMessage\Model\ItemRepository; +use Magento\GiftMessage\Model\GuestItemRepository; +use Magento\Quote\Model\QuoteIdMask; +use Magento\Quote\Model\QuoteIdMaskFactory; + +class GuestCartRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var GuestItemRepository + */ + protected $model; + + /** + * @var ItemRepository|\PHPUnit_Framework_MockObject_MockObject + */ + protected $repositoryMock; + + /** + * @var QuoteIdMaskFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $quoteIdMaskFactoryMock; + + protected function setUp() + { + $this->repositoryMock = $this->getMockBuilder('Magento\GiftMessage\Model\ItemRepository') + ->disableOriginalConstructor() + ->getMock(); + + $this->quoteIdMaskFactoryMock = $this->getMockBuilder('Magento\Quote\Model\QuoteIdMaskFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMockForAbstractClass(); + + $this->model = new GuestItemRepository( + $this->repositoryMock, + $this->quoteIdMaskFactoryMock + ); + } + + public function testGet() + { + $cartId = 'jIUggbo76'; + $quoteId = 123; + $itemId = 234; + + /** @var QuoteIdMask|\PHPUnit_Framework_MockObject_MockObject $quoteIdMaskMock */ + $quoteIdMaskMock = $this->getMockBuilder('Magento\Quote\Model\QuoteIdMask') + ->setMethods(['getQuoteId', 'load']) + ->disableOriginalConstructor() + ->getMock(); + + $this->quoteIdMaskFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($quoteIdMaskMock); + + $quoteIdMaskMock->expects($this->once()) + ->method('load') + ->with($cartId, 'masked_id') + ->willReturnSelf(); + $quoteIdMaskMock->expects($this->once()) + ->method('getQuoteId') + ->willReturn($quoteId); + + /** @var MessageInterface|\PHPUnit_Framework_MockObject_MockObject $messageMock */ + $messageMock = $this->getMockBuilder('Magento\GiftMessage\Api\Data\MessageInterface') + ->getMockForAbstractClass(); + + $this->repositoryMock->expects($this->once()) + ->method('get') + ->with($quoteId, $itemId) + ->willReturn($messageMock); + + $this->assertEquals($messageMock, $this->model->get($cartId, $itemId)); + } + + public function testSave() + { + $cartId = 'jIUggbo76'; + $quoteId = 123; + $itemId = 234; + + /** @var QuoteIdMask|\PHPUnit_Framework_MockObject_MockObject $quoteIdMaskMock */ + $quoteIdMaskMock = $this->getMockBuilder('Magento\Quote\Model\QuoteIdMask') + ->setMethods(['getQuoteId', 'load']) + ->disableOriginalConstructor() + ->getMock(); + + $this->quoteIdMaskFactoryMock->expects($this->once()) + ->method('create') + ->willReturn($quoteIdMaskMock); + + $quoteIdMaskMock->expects($this->once()) + ->method('load') + ->with($cartId, 'masked_id') + ->willReturnSelf(); + $quoteIdMaskMock->expects($this->once()) + ->method('getQuoteId') + ->willReturn($quoteId); + + /** @var MessageInterface|\PHPUnit_Framework_MockObject_MockObject $messageMock */ + $messageMock = $this->getMockBuilder('Magento\GiftMessage\Api\Data\MessageInterface') + ->getMockForAbstractClass(); + + $this->repositoryMock->expects($this->once()) + ->method('save') + ->with($quoteId, $messageMock, $itemId) + ->willReturn(true); + + $this->assertTrue($this->model->save($cartId, $messageMock, $itemId)); + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ec445ead2172ac058ed07506cd31d995d844593c --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php @@ -0,0 +1,225 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Model; + +// @codingStandardsIgnoreFile + +use Magento\GiftMessage\Model\ItemRepository; + +class GuestItemRepositoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ItemRepository + */ + protected $itemRepository; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $quoteRepositoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $messageFactoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $quoteMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $messageMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $quoteItemMock; + + /** + * @var string + */ + protected $cartId = 13; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $giftMessageManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $helperMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $storeMock; + + protected function setUp() + { + $this->quoteRepositoryMock = $this->getMock('Magento\Quote\Model\QuoteRepository', [], [], '', false); + $this->messageFactoryMock = $this->getMock( + 'Magento\GiftMessage\Model\MessageFactory', + [ + 'create', + '__wakeup' + ], + [], + '', + false + ); + $this->messageMock = $this->getMock('Magento\GiftMessage\Model\Message', [], [], '', false); + $this->quoteItemMock = $this->getMock( + '\Magento\Qote\Model\Quote\Item', + [ + 'getGiftMessageId', + '__wakeup' + ], + [], + '', + false + ); + $this->quoteMock = $this->getMock( + '\Magento\Quote\Model\Quote', + [ + 'getGiftMessageId', + 'getItemById', + '__wakeup', + ], + [], + '', + false + ); + $this->storeManagerMock = $this->getMock('Magento\Store\Model\StoreManagerInterface'); + $this->giftMessageManagerMock = + $this->getMock('Magento\GiftMessage\Model\GiftMessageManager', [], [], '', false); + $this->helperMock = $this->getMock('Magento\GiftMessage\Helper\Message', [], [], '', false); + $this->storeMock = $this->getMock('Magento\Store\Model\Store', [], [], '', false); + $this->itemRepository = new \Magento\GiftMessage\Model\ItemRepository( + $this->quoteRepositoryMock, + $this->storeManagerMock, + $this->giftMessageManagerMock, + $this->helperMock, + $this->messageFactoryMock + ); + + $this->quoteRepositoryMock->expects($this->once()) + ->method('getActive') + ->with($this->cartId) + ->will($this->returnValue($this->quoteMock)); + } + + /** + * @expectedException \Magento\Framework\Exception\NoSuchEntityException + * @expectedExceptionMessage There is no item with provided id in the cart + */ + public function testGetWithNoSuchEntityException() + { + $itemId = 2; + + $this->quoteMock->expects($this->once())->method('getItemById')->with($itemId)->will($this->returnValue(null)); + + $this->itemRepository->get($this->cartId, $itemId); + } + + public function testGetWithoutMessageId() + { + $messageId = 0; + $itemId = 2; + + $this->quoteMock->expects($this->once()) + ->method('getItemById') + ->with($itemId) + ->will($this->returnValue($this->quoteItemMock)); + $this->quoteItemMock->expects($this->once())->method('getGiftMessageId')->will($this->returnValue($messageId)); + + $this->assertNull($this->itemRepository->get($this->cartId, $itemId)); + } + + public function testGet() + { + $messageId = 123; + $itemId = 2; + + $this->quoteMock->expects($this->once()) + ->method('getItemById') + ->with($itemId) + ->will($this->returnValue($this->quoteItemMock)); + $this->quoteItemMock->expects($this->once())->method('getGiftMessageId')->will($this->returnValue($messageId)); + $this->messageFactoryMock->expects($this->once()) + ->method('create') + ->will($this->returnValue($this->messageMock)); + $this->messageMock->expects($this->once()) + ->method('load') + ->with($messageId) + ->will($this->returnValue($this->messageMock)); + + $this->assertEquals($this->messageMock, $this->itemRepository->get($this->cartId, $itemId)); + } + + /** + * @expectedException \Magento\Framework\Exception\NoSuchEntityException + * @expectedExceptionMessage There is no product with provided itemId: 1 in the cart + */ + public function testSaveWithNoSuchEntityException() + { + $itemId = 1; + + $this->quoteMock->expects($this->once())->method('getItemById')->with($itemId)->will($this->returnValue(null)); + + $this->itemRepository->save($this->cartId, $this->messageMock, $itemId); + } + + /** + * @expectedException \Magento\Framework\Exception\State\InvalidTransitionException + * @expectedExceptionMessage Gift Messages is not applicable for virtual products + */ + public function testSaveWithInvalidTransitionException() + { + $itemId = 1; + + $quoteItem = $this->getMock('\Magento\Sales\Model\Quote\Item', ['getIsVirtual', '__wakeup'], [], '', false); + $this->quoteMock->expects($this->once()) + ->method('getItemById') + ->with($itemId) + ->will($this->returnValue($quoteItem)); + $quoteItem->expects($this->once())->method('getIsVirtual')->will($this->returnValue(1)); + + $this->itemRepository->save($this->cartId, $this->messageMock, $itemId); + } + + public function testSave() + { + $itemId = 1; + + $quoteItem = $this->getMock('\Magento\Sales\Model\Quote\Item', ['getIsVirtual', '__wakeup'], [], '', false); + $this->quoteMock->expects($this->once()) + ->method('getItemById') + ->with($itemId) + ->will($this->returnValue($quoteItem)); + $quoteItem->expects($this->once())->method('getIsVirtual')->will($this->returnValue(0)); + $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock)); + $this->helperMock->expects($this->once()) + ->method('isMessagesAllowed') + ->with('items', $this->quoteMock, $this->storeMock) + ->will($this->returnValue(true)); + $this->giftMessageManagerMock->expects($this->once()) + ->method('setMessage') + ->with($this->quoteMock, 'quote_item', $this->messageMock, $itemId) + ->will($this->returnValue($this->giftMessageManagerMock)); + + $this->assertTrue($this->itemRepository->save($this->cartId, $this->messageMock, $itemId)); + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/ItemRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/ItemRepositoryTest.php index 5caa71f1b2bd2a492dc92b99c63c92970169d1bf..ed3f45fd157b4b63a7e747d3172c60e02921aafc 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Model/ItemRepositoryTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/ItemRepositoryTest.php @@ -4,9 +4,10 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\GiftMessage\Test\Unit\Model; +// @codingStandardsIgnoreFile + use Magento\GiftMessage\Model\ItemRepository; class ItemRepositoryTest extends \PHPUnit_Framework_TestCase diff --git a/app/code/Magento/GiftMessage/etc/di.xml b/app/code/Magento/GiftMessage/etc/di.xml index 6d3a903c6804546afbb95cc7805b746d5acd6e39..47a6c71f15a4028fed977849abe9e3f1e1221219 100644 --- a/app/code/Magento/GiftMessage/etc/di.xml +++ b/app/code/Magento/GiftMessage/etc/di.xml @@ -15,6 +15,8 @@ </type> <preference for="Magento\GiftMessage\Api\CartRepositoryInterface" type="Magento\GiftMessage\Model\CartRepository"/> <preference for="Magento\GiftMessage\Api\ItemRepositoryInterface" type="Magento\GiftMessage\Model\ItemRepository"/> + <preference for="Magento\GiftMessage\Api\GuestCartRepositoryInterface" type="Magento\GiftMessage\Model\GuestCartRepository"/> + <preference for="Magento\GiftMessage\Api\GuestItemRepositoryInterface" type="Magento\GiftMessage\Model\GuestItemRepository"/> <preference for="Magento\GiftMessage\Api\OrderRepositoryInterface" type="Magento\GiftMessage\Model\OrderRepository"/> <preference for="Magento\GiftMessage\Api\OrderItemRepositoryInterface" type="Magento\GiftMessage\Model\OrderItemRepository"/> <preference for="Magento\GiftMessage\Api\Data\MessageInterface" type="Magento\GiftMessage\Model\Message"/> @@ -26,7 +28,4 @@ <plugin name="save_gift_message" type="Magento\GiftMessage\Model\Plugin\OrderSave"/> <plugin name="get_gift_message" type="Magento\GiftMessage\Model\Plugin\OrderGet"/> </type> - <type name="\Magento\Quote\Model\Cart\TotalsAdditionalDataProcessor"> - <plugin name="gift_message_processor" type="Magento\GiftMessage\Model\Plugin\TotalsDataProcessorPlugin" /> - </type> </config> diff --git a/app/code/Magento/GiftMessage/etc/frontend/di.xml b/app/code/Magento/GiftMessage/etc/frontend/di.xml index 36f49a653bd335290781925b7db55593cbc5efe9..faa2f043fe6059d83e3bd1dc97f92c25f6553be9 100644 --- a/app/code/Magento/GiftMessage/etc/frontend/di.xml +++ b/app/code/Magento/GiftMessage/etc/frontend/di.xml @@ -29,11 +29,18 @@ <type name="Magento\Multishipping\Model\Checkout\Type\Multishipping"> <plugin name="save_gift_messages" type="Magento\GiftMessage\Model\Type\Plugin\Multishipping"/> </type> - <type name="Magento\Checkout\Model\CompositeConfigProvider"> + <type name="Magento\GiftMessage\Model\CompositeConfigProvider"> <arguments> <argument name="configProviders" xsi:type="array"> <item name="gift_message_config_provider" xsi:type="object">Magento\GiftMessage\Model\GiftMessageConfigProvider</item> </argument> </arguments> </type> + <type name="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions"> + <arguments> + <argument name="layoutProcessors" xsi:type="array"> + <item name="itemIdProcessor" xsi:type="object">Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\ItemIdProcessor</item> + </argument> + </arguments> + </type> </config> diff --git a/app/code/Magento/GiftMessage/etc/webapi.xml b/app/code/Magento/GiftMessage/etc/webapi.xml index c5dd571a7ac105813159525195c8074be14be8c6..bb0b2f0795634c0b1f798c27883a042dfdc72939 100644 --- a/app/code/Magento/GiftMessage/etc/webapi.xml +++ b/app/code/Magento/GiftMessage/etc/webapi.xml @@ -7,6 +7,7 @@ --> <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd"> + <!-- For authorized customer --> <route url="/V1/carts/:cartId/gift-message" method="GET"> <service class="Magento\GiftMessage\Api\CartRepositoryInterface" method="get"/> <resources> @@ -31,4 +32,68 @@ <resource ref="Magento_Sales::create" /> </resources> </route> + + <!-- For current customer --> + <route url="/V1/carts/mine/gift-message" method="GET"> + <service class="Magento\GiftMessage\Api\CartRepositoryInterface" method="get"/> + <resources> + <resource ref="self" /> + </resources> + <data> + <parameter name="cartId" force="true">%cart_id%</parameter> + </data> + </route> + <route url="/V1/carts/mine/gift-message/:itemId" method="GET"> + <service class="Magento\GiftMessage\Api\ItemRepositoryInterface" method="get"/> + <resources> + <resource ref="self" /> + </resources> + <data> + <parameter name="cartId" force="true">%cart_id%</parameter> + </data> + </route> + <route url="/V1/carts/mine/gift-message" method="POST"> + <service class="Magento\GiftMessage\Api\CartRepositoryInterface" method="save"/> + <resources> + <resource ref="self" /> + </resources> + <data> + <parameter name="cartId" force="true">%cart_id%</parameter> + </data> + </route> + <route url="/V1/carts/mine/gift-message/:itemId" method="POST"> + <service class="Magento\GiftMessage\Api\ItemRepositoryInterface" method="save"/> + <resources> + <resource ref="self" /> + </resources> + <data> + <parameter name="cartId" force="true">%cart_id%</parameter> + </data> + </route> + + <!-- For guests --> + <route url="/V1/guest-carts/:cartId/gift-message" method="GET"> + <service class="Magento\GiftMessage\Api\GuestCartRepositoryInterface" method="get"/> + <resources> + <resource ref="anonymous" /> + </resources> + </route> + <route url="/V1/guest-carts/:cartId/gift-message/:itemId" method="GET"> + <service class="Magento\GiftMessage\Api\GuestItemRepositoryInterface" method="get"/> + <resources> + <resource ref="anonymous" /> + </resources> + </route> + <route url="/V1/guest-carts/:cartId/gift-message" method="POST"> + <service class="Magento\GiftMessage\Api\GuestCartRepositoryInterface" method="save"/> + <resources> + <resource ref="anonymous" /> + </resources> + </route> + <route url="/V1/guest-carts/:cartId/gift-message/:itemId" method="POST"> + <service class="Magento\GiftMessage\Api\GuestItemRepositoryInterface" method="save"/> + <resources> + <resource ref="anonymous" /> + </resources> + </route> </routes> diff --git a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml new file mode 100644 index 0000000000000000000000000000000000000000..66e18b7a0f7f7ecb45b5e3ae98d5d2bc3b019cad --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> + <body> + <referenceBlock name="checkout.cart.order.actions"> + <block class="Magento\GiftMessage\Block\Cart\GiftOptions" name="checkout.cart.order.actions.gift_options" template="cart/gift_options.phtml" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCart" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + </body> +</page> diff --git a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_item_renderers.xml new file mode 100644 index 0000000000000000000000000000000000000000..b94cab5dace25517631f0034bdf5098ee867b64d --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_item_renderers.xml @@ -0,0 +1,119 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> + <body> + <referenceBlock name="checkout.cart.item.renderers.default.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.default.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.simple.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.simple.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.bundle.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.bundle.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.grouped.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.grouped.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.configurable.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.configurable.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.gift-card.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.gift-card.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"> + <arguments> + <argument name="jsLayout" xsi:type="array"> + <item name="types" xsi:type="array"/> + <item name="components" xsi:type="array"> + <item name="giftOptionsCartItem" xsi:type="array"> + <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-message</item> + <item name="config" xsi:type="array"> + <item name="template" xsi:type="string">Magento_GiftMessage/gift-message-item-level</item> + <item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item> + </item> + </item> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + </body> +</page> diff --git a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_onepage_index.xml b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_onepage_index.xml deleted file mode 100644 index fbaba91cb60ea62a5639373e4b8af76e39a5e3e0..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_onepage_index.xml +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0"?> -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> - <body> - <referenceBlock name="checkout.root"> - <arguments> - <argument name="jsLayout" xsi:type="array"> - <item name="components" xsi:type="array"> - <item name="checkout" xsi:type="array"> - <item name="children" xsi:type="array"> - <item name="steps" xsi:type="array"> - <item name="children" xsi:type="array"> - <item name="shipping" xsi:type="array"> - <item name="children" xsi:type="array"> - <item name="additional" xsi:type="array"> - <item name="component" xsi:type="string">Magento_GiftMessage/js/view/gift-options</item> - <item name="children" xsi:type="array"> - <item name="orderLevelGiftMessage" xsi:type="array"> - <item name="component" xsi:type="string">Magento_GiftMessage/js/view/order-level-gift-message</item> - </item> - <item name="itemLevelGiftMessage" xsi:type="array"> - <item name="component" xsi:type="string">Magento_GiftMessage/js/view/item-level-gift-message</item> - </item> - </item> - </item> - </item> - </item> - </item> - </item> - </item> - </item> - </item> - </argument> - </arguments> - </referenceBlock> - </body> -</page> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift_options.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift_options.phtml new file mode 100644 index 0000000000000000000000000000000000000000..af4d469a652daaa72c47a607c3769106254da609 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift_options.phtml @@ -0,0 +1,19 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +?> +<div id="gift-options-cart" data-bind="scope:'giftOptionsCart'"> + <!-- ko template: getTemplate() --><!-- /ko --> + <script type="text/x-magento-init"> + { + "#gift-options-cart": { + "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> + } + } + </script> + <script> + window.giftOptionsConfig = <?php echo $block->getGiftOptionsConfigJson(); ?>; + </script> +</div> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/Cart/item/renderer/actions/gift_options.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/item/renderer/actions/gift_options.phtml new file mode 100644 index 0000000000000000000000000000000000000000..10388eabe38174c6c1d0cc9fff8ede649067f860 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/item/renderer/actions/gift_options.phtml @@ -0,0 +1,24 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +/** @var $block \Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions */ +?> +<?php if (!$block->isVirtual()): ?> + <div id="gift-options-cart-item-<?php echo $block->getItem()->getId() ?>" + data-bind="scope:'giftOptionsCartItem-<?php echo $block->getItem()->getId() ?>'" + class="gift-options-cart-item"> + <!-- ko template: getTemplate() --><!-- /ko --> + <script type="text/x-magento-init"> + { + "#gift-options-cart-item-<?php echo $block->getItem()->getId() ?>": { + "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> + } + } + </script> + </div> +<?php endif ?> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/cart/gift_options.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/cart/gift_options.phtml new file mode 100644 index 0000000000000000000000000000000000000000..af4d469a652daaa72c47a607c3769106254da609 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/cart/gift_options.phtml @@ -0,0 +1,19 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +?> +<div id="gift-options-cart" data-bind="scope:'giftOptionsCart'"> + <!-- ko template: getTemplate() --><!-- /ko --> + <script type="text/x-magento-init"> + { + "#gift-options-cart": { + "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> + } + } + </script> + <script> + window.giftOptionsConfig = <?php echo $block->getGiftOptionsConfigJson(); ?>; + </script> +</div> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/cart/item/renderer/actions/gift_options.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/cart/item/renderer/actions/gift_options.phtml new file mode 100644 index 0000000000000000000000000000000000000000..10388eabe38174c6c1d0cc9fff8ede649067f860 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/cart/item/renderer/actions/gift_options.phtml @@ -0,0 +1,24 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +/** @var $block \Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions */ +?> +<?php if (!$block->isVirtual()): ?> + <div id="gift-options-cart-item-<?php echo $block->getItem()->getId() ?>" + data-bind="scope:'giftOptionsCartItem-<?php echo $block->getItem()->getId() ?>'" + class="gift-options-cart-item"> + <!-- ko template: getTemplate() --><!-- /ko --> + <script type="text/x-magento-init"> + { + "#gift-options-cart-item-<?php echo $block->getItem()->getId() ?>": { + "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> + } + } + </script> + </div> +<?php endif ?> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/inline.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/inline.phtml index a96a4a70a02efb74659b65dbe835f49be9bebbea..7e363d665d582352ce34cbb188aa67f811e5027e 100644 --- a/app/code/Magento/GiftMessage/view/frontend/templates/inline.phtml +++ b/app/code/Magento/GiftMessage/view/frontend/templates/inline.phtml @@ -32,7 +32,7 @@ <a href="#" class="action activate message" data-mage-init='{"toggleAdvanced": {"selectorsToggleClass":"hidden", "toggleContainers":"#allow-gift-messages-for-order-container"}}'><?php echo __('Gift Message') ?></a> <div id="allow-gift-messages-for-order-container" class="gift-messages-order hidden"> <fieldset class="fieldset"> - <p><?php echo __('If you don\'t want to leave a gift message for the entire order, leave this box blank.') ?></p> + <p><?php echo __('Leave this box blank if you don\'t want to leave a gift message for the entire order.') ?></p> <div class="field from"> <label for="gift-message-whole-from" class="label"><span><?php echo __('From') ?></span></label> <div class="control"> @@ -92,7 +92,7 @@ require(['jquery'], function(jQuery){ <a href="#" class="action activate message" data-mage-init='{"toggleAdvanced": {"selectorsToggleClass":"hidden", "toggleContainers":"#gift-messages-for-item-container-<?php echo $_item->getId() ?>"}}'><?php echo __('Gift Message') ?></a> <div id="gift-messages-for-item-container-<?php echo $_item->getId() ?>" class="block message hidden"> <fieldset class="fieldset"> - <p><?php echo __('You can leave a box blank if you don\'t wish to add a gift message for the item.') ?></p> + <p><?php echo __('Leave a box blank if you don\'t want to add a gift message for that item.') ?></p> <div class="field from"> <label for="gift-message-<?php echo $_item->getId() ?>-from" class="label"><span><?php echo __('From') ?></span></label> <div class="control"> @@ -153,7 +153,7 @@ require(['jquery'], function(jQuery){ <dt id="add-gift-options-for-order-<?php echo $block->getEntity()->getId() ?>" class="order-title"> <div class="field choice"> <input type="checkbox" name="allow_gift_options_for_order_<?php echo $block->getEntity()->getId() ?>" id="allow_gift_options_for_order_<?php echo $block->getEntity()->getId() ?>" data-mage-init='{"giftOptions":{}}' value="1" data-selector='{"id":"#allow-gift-options-for-order-container-<?php echo $block->getEntity()->getId() ?>"}'<?php if ($block->getEntityHasMessage()): ?> checked="checked"<?php endif; ?> class="checkbox" /> - <label for="allow_gift_options_for_order_<?php echo $block->getEntity()->getId() ?>" class="label"><span><?php echo __('Add gift options for the Entire Order') ?></span></label> + <label for="allow_gift_options_for_order_<?php echo $block->getEntity()->getId() ?>" class="label"><span><?php echo __('Add Gift Options for the Entire Order') ?></span></label> </div> </dt> @@ -164,7 +164,7 @@ require(['jquery'], function(jQuery){ <a href="#" class="action activate message" data-mage-init='{"toggleAdvanced": {"selectorsToggleClass":"hidden", "toggleContainers":"#gift-messages-for-order-container-<?php echo $block->getEntity()->getId() ?>"}}'><?php echo __('Gift Message') ?></a> <div id="gift-messages-for-order-container-<?php echo $block->getEntity()->getId() ?>" class="gift-messages-order hidden"> <fieldset class="fieldset"> - <p><?php echo __('You can leave this box blank if you do not wish to add a gift message for this address.') ?></p> + <p><?php echo __('You can leave this box blank if you don\'t want to add a gift message for this address.') ?></p> <div class="field from"> <label for="gift-message-<?php echo $block->getEntity()->getId() ?>-from" class="label"><span><?php echo __('From') ?></span></label> <div class="control"> @@ -218,7 +218,7 @@ require(['jquery'], function(jQuery){ <a href="#" class="action activate message" data-mage-init='{"toggleAdvanced": {"selectorsToggleClass":"hidden", "toggleContainers":"#gift-messages-for-item-container-<?php echo $_item->getId() ?>"}}'><?php echo __('Gift Message') ?></a> <div id="gift-messages-for-item-container-<?php echo $_item->getId() ?>" class="block message hidden"> <fieldset class="fieldset"> - <p><?php echo __('You can leave this box blank if you do not wish to add a gift message for the item.') ?></p> + <p><?php echo __('You can leave this box blank if you don\'t want to add a gift message for the item.') ?></p> <input type="hidden" name="giftmessage[quote_address_item][<?php echo $_item->getId() ?>][address]" value="<?php echo $block->getEntity()->getId()?>" /> <div class="field from"> <label for="gift-message-<?php echo $_item->getId() ?>-from" class="label"><span><?php echo __('From') ?></span></label> diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/action/gift-options.js b/app/code/Magento/GiftMessage/view/frontend/web/js/action/gift-options.js new file mode 100644 index 0000000000000000000000000000000000000000..4896aeb00b5b87c57ad90cdcc86c26e68da0b794 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/action/gift-options.js @@ -0,0 +1,57 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/*global define*/ +define( + [ + '../model/url-builder', + 'mage/storage', + 'Magento_Ui/js/model/errorlist', + 'mage/url' + ], + function(urlBuilder, storage, errorList, url) { + "use strict"; + return function(giftMessage, remove) { + url.setBaseUrl(giftMessage.getConfigValue('baseUrl')); + var quoteId = giftMessage.getConfigValue('quoteId'); + var serviceUrl; + if (giftMessage.getConfigValue('isCustomerLoggedIn')) { + serviceUrl = urlBuilder.createUrl('/carts/mine/gift-message', {}); + if (giftMessage.itemId != 'orderLevel') { + serviceUrl = urlBuilder.createUrl('/carts/mine/gift-message/:itemId', {itemId: giftMessage.itemId}); + } + } else { + serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/gift-message', {cartId: quoteId}); + if (giftMessage.itemId != 'orderLevel') { + serviceUrl = urlBuilder.createUrl( + '/guest-carts/:cartId/gift-message/:itemId', + {cartId: quoteId, itemId: giftMessage.itemId} + ); + } + } + errorList.clear(); + + storage.post( + serviceUrl, + JSON.stringify({ + gift_message: giftMessage.getSubmitParams(remove) + }) + ).done( + function(result) { + giftMessage.reset(); + _.each(giftMessage.getAfterSubmitCallbacks(), function(callback) { + if (_.isFunction(callback)) { + callback(); + } + }); + } + ).fail( + function(response) { + var error = JSON.parse(response.responseText); + errorList.add(error); + } + ); + }; + } +); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message.js b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message.js index d5f0e072c77132c455ae521560f4c5f7522d92b7..ad91613b1364535ec43548e251bb46fefb67ec5f 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message.js +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message.js @@ -3,57 +3,107 @@ * See COPYING.txt for license details. */ /*global define*/ -define(['underscore', './gift-options'], - function(_, giftOptions) { +define(['Magento_Ui/js/lib/component/provider', 'underscore', 'mage/url'], + function (provider, _, url) { "use strict"; - var itemLevelDefaultMessages, orderLevelDefaultMessage, - isItemLevelGiftOptionsSelected = false, - isOrderLevelGiftOptionsSelected = false, - isGiftOptionsSelected = false; - if (giftOptions.isItemLevelGiftOptionsEnabled() && _.isObject(window.checkoutConfig.giftMessage.itemLevel)) { - itemLevelDefaultMessages = window.checkoutConfig.giftMessage.itemLevel; - isItemLevelGiftOptionsSelected = true; - isGiftOptionsSelected = true; - } - if (giftOptions.isOrderLevelGiftOptionsEnabled() && _.isObject(window.checkoutConfig.giftMessage.orderLevel)) { - orderLevelDefaultMessage = window.checkoutConfig.giftMessage.orderLevel; - isOrderLevelGiftOptionsSelected = true; - isGiftOptionsSelected = true; - } - return { - getDefaultMessageForItem: function(itemId) { - if (_.isObject(itemLevelDefaultMessages) && itemLevelDefaultMessages.hasOwnProperty(itemId)) { - return { - from: itemLevelDefaultMessages[itemId].sender, - to: itemLevelDefaultMessages[itemId].recipient, - message: itemLevelDefaultMessages[itemId].message - }; + return function (itemId) { + var model = { + id: 'message-' + itemId, + itemId: itemId, + observables: {}, + additionalOptions: [], + submitParams: [ + 'recipient', + 'sender', + 'message' + ], + initialize: function() { + this.getObservable('alreadyAdded')(false); + var message = false; + + if (this.itemId == 'orderLevel') { + message = window.giftOptionsConfig.giftMessage.hasOwnProperty(this.itemId) + ? window.giftOptionsConfig.giftMessage[this.itemId] + : null; + } else { + message = + window.giftOptionsConfig.giftMessage.hasOwnProperty('itemLevel') + && window.giftOptionsConfig.giftMessage['itemLevel'].hasOwnProperty(this.itemId) + ? window.giftOptionsConfig.giftMessage['itemLevel'][this.itemId] + : null; + } + if (_.isObject(message)) { + this.getObservable('recipient')(message.recipient); + this.getObservable('sender')(message.sender); + this.getObservable('message')(message.message); + this.getObservable('alreadyAdded')(true); + } + }, + getObservable: function(key) { + this.initObservable(this.id, key); + return provider[this.getUniqueKey(this.id, key)]; + }, + initObservable: function(node, key) { + if (node && !this.observables.hasOwnProperty(node)) { + this.observables[node] = []; + } + if (key && this.observables[node].indexOf(key) == -1) { + this.observables[node].push(key); + provider.observe(this.getUniqueKey(node, key)); + } + }, + getUniqueKey: function(node, key) { + return node + '-' + key; + }, + getConfigValue: function(key) { + return window.giftOptionsConfig.hasOwnProperty(key) ? + window.giftOptionsConfig[key] + : null; + }, + reset: function() { + this.getObservable('isClear')(true); + }, + getAfterSubmitCallbacks: function() { + var callbacks = []; + callbacks.push(this.afterSubmit); + _.each(this.additionalOptions, function(option) { + if (_.isFunction(option.afterSubmit)) { + callbacks.push(option.afterSubmit); + } + }); + return callbacks; + }, + afterSubmit: function() { + window.location.href = url.build('checkout/cart/updatePost') + + '?form_key=' + window.giftOptionsConfig.giftMessage.formKey + + '&cart[]'; + }, + getSubmitParams: function(remove) { + var params = {}, + self = this; + _.each(this.submitParams, function(key) { + var observable = provider[self.getUniqueKey(self.id, key)]; + if (_.isFunction(observable)) { + params[key] = remove ? null : observable(); + } + }); + + if(this.additionalOptions.length) { + params['extension_attributes'] = {}; + } + _.each(this.additionalOptions, function(option) { + if (_.isFunction(option.getSubmitParams)) { + params['extension_attributes'] = _.extend( + params['extension_attributes'], + option.getSubmitParams(remove) + ); + } + }); + return params; } - return { - from: null, to: null, message: null - }; - }, - getDefaultMessageForQuote: function() { - if (orderLevelDefaultMessage) { - return { - from: orderLevelDefaultMessage.sender, - to: orderLevelDefaultMessage.recipient, - message: orderLevelDefaultMessage.message - }; - } - return { - from: null, to: null, message: null - }; - }, - isGiftOptionsSelected: function() { - return isGiftOptionsSelected; - }, - isItemLevelGiftOptionsSelected: function() { - return isItemLevelGiftOptionsSelected; - }, - isOrderLevelGiftOptionsSelected: function() { - return isOrderLevelGiftOptionsSelected; - } - }; + }; + model.initialize(); + return model; + } } ); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options.js b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options.js index 000bf4b508e32c54442401024877cdb2e396279a..187f17e5b3962788ba0eb03a95858e4672d27c7b 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options.js +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options.js @@ -4,59 +4,18 @@ */ /*global define*/ define(['underscore'], - function(_) { + function (_) { "use strict"; - var isOrderLevelGiftOptionsEnabled = window.checkoutConfig.isOrderLevelGiftOptionsEnabled || false, - isItemLevelGiftOptionsEnabled = window.checkoutConfig.isItemLevelGiftOptionsEnabled || false; return { - orderLevelGiftOptions: [], - itemLevelGiftOptions: [], - extraGiftOptions: [], - isGiftOptionsAvailable: function() { - var isAvailable = isOrderLevelGiftOptionsEnabled || isItemLevelGiftOptionsEnabled; - - _.each(this.getExtraGiftOptions(), function(option){ - if (typeof option.isAvailable() === 'function') { - isAvailable = isAvailable || option.isAvailable(); - } - }); - - return isAvailable; - }, - isOrderLevelGiftOptionsEnabled: function() { - return isOrderLevelGiftOptionsEnabled; - }, - isItemLevelGiftOptionsEnabled: function() { - return isItemLevelGiftOptionsEnabled; - }, - getExtraGiftOptions: function() { - return this.getGiftOptions(this.extraGiftOptions); - }, - getOrderLevelGiftOptions: function() { - return this.getGiftOptions(this.orderLevelGiftOptions); - }, - getItemLevelGiftOptions: function() { - return this.getGiftOptions(this.itemLevelGiftOptions); - }, - getGiftOptions: function(options) { - return _.map( - _.sortBy(options, function(giftOption){ - return giftOption.sortOrder - }), - function(giftOption) { - return giftOption.option - } - ) - }, - setExtraGiftOptions: function (giftOption, sortOrder) { - this.extraGiftOptions.push({'option': giftOption, 'sortOrder': sortOrder}); - }, - addOrderLevelGiftOptions: function(giftOption, sortOrder) { - this.orderLevelGiftOptions.push({'option': giftOption, 'sortOrder': sortOrder}); - }, - addItemLevelGiftOptions: function(giftOption, sortOrder) { - this.itemLevelGiftOptions.push({'option': giftOption, 'sortOrder': sortOrder}); + options: [], + addOption: function(option) { + if(!this.options.hasOwnProperty(option.itemId)) { + this.options[option.itemId] = option; + } + }, + getOptionByItemId: function(itemId) { + return this.options.hasOwnProperty(itemId) ? this.options[itemId] : null; } - }; + } } ); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/model/url-builder.js b/app/code/Magento/GiftMessage/view/frontend/web/js/model/url-builder.js new file mode 100644 index 0000000000000000000000000000000000000000..ba62ba64f94d06356dc0bebffec378fb0b78c710 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/model/url-builder.js @@ -0,0 +1,38 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/*jshint browser:true jquery:true*/ +/*global alert*/ +define( + ['jquery'], + function($) { + return { + method: "rest", + storeCode: window.giftOptionsConfig.storeCode, + version: 'V1', + serviceUrl: ':method/:storeCode/:version', + + createUrl: function(url, params) { + var completeUrl = this.serviceUrl + url; + return this.bindParams(completeUrl, params); + }, + bindParams: function(url, params) { + params.method = this.method; + params.storeCode = this.storeCode; + params.version = this.version; + + var urlParts = url.split("/"); + urlParts = urlParts.filter(Boolean); + + $.each(urlParts, function(key, part) { + part = part.replace(':', ''); + if (params[part] != undefined) { + urlParts[key] = params[part]; + } + }); + return urlParts.join('/'); + } + }; + } +); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-message.js b/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-message.js new file mode 100644 index 0000000000000000000000000000000000000000..70a563cc3015afef902a93fff8471c40b255d5c9 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-message.js @@ -0,0 +1,78 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/*global define*/ +define(['uiComponent', '../model/gift-message', '../model/gift-options', '../action/gift-options'], + function (Component, giftMessage, giftOptions, giftOptionsService) { + "use strict"; + return Component.extend({ + formBlockVisibility: null, + resultBlockVisibility: null, + model: {}, + initialize: function() { + var self = this; + this._super() + .observe('formBlockVisibility') + .observe({'resultBlockVisibility': false}); + + this.itemId = this.itemId || 'orderLevel'; + var model = new giftMessage(this.itemId); + giftOptions.addOption(model); + this.model = model; + + this.model.getObservable('isClear').subscribe(function(value) { + if (value == true) { + self.formBlockVisibility(false); + self.model.getObservable('alreadyAdded')(true); + } + }); + + this.isResultBlockVisible(); + }, + isResultBlockVisible: function() { + var self = this; + if (this.model.getObservable('alreadyAdded')()) { + this.resultBlockVisibility(true); + } + this.model.getObservable('additionalOptionsApplied').subscribe(function(value) { + if (value == true) { + self.resultBlockVisibility(true); + } + }); + }, + getObservable: function(key) { + return this.model.getObservable(key); + }, + toggleFormBlockVisibility: function() { + if (!this.model.getObservable('alreadyAdded')()) { + this.formBlockVisibility(!this.formBlockVisibility()); + } + }, + editOptions: function() { + this.resultBlockVisibility(false); + this.formBlockVisibility(true); + }, + deleteOptions: function() { + giftOptionsService(this.model, true); + }, + hideFormBlock: function() { + this.formBlockVisibility(false); + if (this.model.getObservable('alreadyAdded')()) { + this.resultBlockVisibility(true); + } + }, + isActive: function() { + switch (this.itemId) { + case 'orderLevel': + return this.model.getConfigValue('isOrderLevelGiftOptionsEnabled') == true; + default: + return this.model.getConfigValue('isItemLevelGiftOptionsEnabled') == true; + } + }, + submitOptions: function() { + giftOptionsService(this.model); + } + }); + } +); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-options.js b/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-options.js deleted file mode 100644 index f216daa41a6090523acd22cf302ffafcbf40cbd1..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-options.js +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -/*global define*/ -define(['uiComponent', 'ko', '../model/gift-options', '../model/gift-message', 'Magento_Ui/js/model/errorlist'], - function (Component, ko, giftOptions, giftMessage, errorList) { - "use strict"; - - return Component.extend({ - defaults: { - template: 'Magento_GiftMessage/gift-options', - displayArea: 'shippingAdditional' - }, - options: [], - isGiftOptionsSelected: ko.observable(giftMessage.isGiftOptionsSelected()), - isOrderLevelGiftOptionsSelected: ko.observable(giftMessage.isOrderLevelGiftOptionsSelected()), - isItemLevelGiftOptionsSelected: ko.observable(giftMessage.isItemLevelGiftOptionsSelected()), - isGiftOptionsAvailable: function() { - return giftOptions.isGiftOptionsAvailable(); - }, - isOrderLevelGiftOptionsEnabled: function() { - return giftOptions.isOrderLevelGiftOptionsEnabled(); - }, - isItemLevelGiftOptionsEnabled: function() { - return giftOptions.isItemLevelGiftOptionsEnabled(); - }, - getOrderLevelGiftOptions: function() { - return this.filterOptions(giftOptions.getOrderLevelGiftOptions()); - }, - getItemLevelGiftOptions: function() { - return this.filterOptions(giftOptions.getItemLevelGiftOptions()); - }, - getExtraGiftOptions: function() { - return this.filterOptions(giftOptions.getExtraGiftOptions()); - }, - filterOptions: function(options) { - return _.filter(options, function(option) { - var result = true; - if (option.isDirectRendering !== 'undefined') { - result = !option.isDirectRendering; - } - return result; - } - ); - }, - collectOptions: function(giftOption, additionalFlag) { - if (!this.isAvailableForSubmiting(giftOption)) { - return false; - } - var self = this; - if (giftOption.optionType === 'undefined') { - errorList.add('You should define type of your custom option'); - } - - if (!this.options.hasOwnProperty(giftOption.optionType)) { - this.options[giftOption.optionType] = []; - } - - _.each(giftOption.submit(additionalFlag), function(optionItem) { - self.options[giftOption.optionType].push(optionItem); - }); - }, - isAvailableForSubmiting: function(option) { - return typeof option.isSubmit == 'undefined' || option.isSubmit ? true : false; - }, - submit: function() { - var self = this; - - var removeOrder = giftOptions.isItemLevelGiftOptionsEnabled() && this.isOrderLevelGiftOptionsEnabled() - && (!this.isGiftOptionsSelected() || !this.isOrderLevelGiftOptionsSelected()) - ? true - : false; - _.each(giftOptions.getOrderLevelGiftOptions(), function(option) { - self.collectOptions(option, removeOrder); - }); - - var removeItem = giftOptions.isItemLevelGiftOptionsEnabled() && this.isItemLevelGiftOptionsEnabled() - && (!this.isGiftOptionsSelected() || !this.isItemLevelGiftOptionsSelected()) - ? true - : false; - _.each(giftOptions.getItemLevelGiftOptions(), function(option) { - self.collectOptions(option, removeItem); - }); - - _.each(giftOptions.getExtraGiftOptions(), function(option) { - self.collectOptions(option); - }); - - var result = this.options; - this.options = []; - return result; - } - }); - } -); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/view/item-level-gift-message.js b/app/code/Magento/GiftMessage/view/frontend/web/js/view/item-level-gift-message.js deleted file mode 100644 index 05ef405b1feaa037798fe7f74912222cee74f0c9..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/view/item-level-gift-message.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -/*global define*/ -define(['uiComponent', 'ko', '../model/gift-options', 'Magento_Checkout/js/model/quote', '../model/gift-message'], - function (Component, ko, giftOptions, quote, giftMessage) { - "use strict"; - return Component.extend({ - defaults: { - template: 'Magento_GiftMessage/item-level-gift-message', - displayArea: 'itemLevelGiftMessage' - }, - messages: {}, - quoteItems: [], - quoteItemsCount: 0, - imagePlaceholder: window.checkoutConfig.staticBaseUrl + - '/frontend/Magento/blank/en_US/Magento_Catalog/images/product/placeholder/thumbnail.jpg', - optionType: 'gift_messages', - initialize: function() { - var item, - that = this, - quoteItems = quote.getItems(); - quote.getShippingAddress().subscribe(function(shippingAddress) { - var name = shippingAddress.firstname + ' ' + shippingAddress.lastname; - for (item in quoteItems) { - if (quoteItems.hasOwnProperty(item)) { - if (quoteItems[item].is_virtual === '0') { - var itemId = quoteItems[item].item_id; - that.messages[itemId] = { - from: ko.observable(giftMessage.getDefaultMessageForItem(itemId).from || name), - to: ko.observable(giftMessage.getDefaultMessageForItem(itemId).to || name), - message: ko.observable(giftMessage.getDefaultMessageForItem(itemId).message) - }; - quoteItems[item].isItemLevelGiftMessageVisible = ko.observable(false); - that.quoteItems.push(quoteItems[item]); - } - } - } - that.quoteItemsCount = that.quoteItems.length; - this.dispose(); - }); - this._super(); - giftOptions.addItemLevelGiftOptions(this); - }, - itemImages: ko.observableArray(), - setItemLevelGiftMessageHidden: function(data, event) { - event.preventDefault(); - if (data.hasOwnProperty('item_id')) { - this.isItemLevelGiftMessageVisible(!this.isItemLevelGiftMessageVisible()); - } - }, - submit: function(remove) { - remove = remove || false; - var itemId, - giftMessages = [], - that = this; - for (itemId in this.messages) { - if (that.messages.hasOwnProperty(itemId)) { - if (that.messages[itemId].message() !== null) { - giftMessages.push({ - sender: remove ? null : that.messages[itemId].from(), - recipient: remove ? null : that.messages[itemId].to(), - message: remove ? null : that.messages[itemId].message(), - extension_attributes: { - entity_id: itemId, - entity_type: 'item' - } - }); - } - } - } - return giftMessages; - } - }); - } -); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/view/order-level-gift-message.js b/app/code/Magento/GiftMessage/view/frontend/web/js/view/order-level-gift-message.js deleted file mode 100644 index 277f17a2b4277a61e30d6d9d9ac462f5fe4c2379..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/view/order-level-gift-message.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -/*global define*/ -define([ - 'uiComponent', - 'ko', - '../model/gift-options', - 'Magento_Checkout/js/model/quote', - '../model/gift-message' - ], - function (Component, ko, giftOptions, quote, giftMessage) { - "use strict"; - return Component.extend({ - defaults: { - template: 'Magento_GiftMessage/order-level-gift-message', - displayArea: 'orderLevelGiftMessage' - }, - message: {}, - optionType: 'gift_messages', - initialize: function() { - var that = this; - quote.getShippingAddress().subscribe(function(shippingAddress) { - var customerName = shippingAddress.firstname + ' ' + shippingAddress.lastname; - that.message = { - from: ko.observable(giftMessage.getDefaultMessageForQuote().from || customerName), - to: ko.observable(giftMessage.getDefaultMessageForQuote().to || customerName), - message: ko.observable(giftMessage.getDefaultMessageForQuote().message) - }; - this.dispose(); - }); - this._super(); - giftOptions.addOrderLevelGiftOptions(this, 10); - }, - isOrderLevelGiftMessageVisible: ko.observable(false), - setOrderLevelGiftMessageVisible: function(data, event) { - event.preventDefault(); - this.isOrderLevelGiftMessageVisible(!this.isOrderLevelGiftMessageVisible()); - }, - quoteId: quote.entity_id, - submit: function(remove) { - remove = remove || false; - if (this.message.message() !== null) { - return [{ - sender: remove ? null : this.message.from(), - recipient: remove ? null : this.message.to(), - message: remove ? null : this.message.message(), - extension_attributes: { - entity_id: this.quoteId, - entity_type: 'quote' - } - }]; - } - return []; - } - }); - } -); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-form.html b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-form.html new file mode 100644 index 0000000000000000000000000000000000000000..31cbc7e111aaee3a5b8a9191a68adb43010a45e7 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-form.html @@ -0,0 +1,63 @@ +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<div class="gift-message"> + <div class="gift-options-title"> + <span data-bind="text: $t('Gift Message (optional)')"></span> + </div> + <div class="gift-options-content"> + <fieldset class="fieldset"> + <div class="field field-to"> + <label for="gift-message-whole-to" class="label"> + <span data-bind="text: $t('To') + ':'"></span> + </label> + <div class="control"> + <input type="text" + id="gift-message-whole-to" + class="input-text" + data-bind="value: getObservable('recipient')"> + </div> + </div> + + <div class="field field-from"> + <label for="gift-message-whole-from" class="label"> + <span data-bind="text: $t('From') + ':'"></span> + </label> + <div class="control"> + <input type="text" + id="gift-message-whole-from" + class="input-text" + data-bind="value: getObservable('sender')"> + </div> + </div> + <div class="field text"> + <label for="gift-message-whole-message" class="label"> + <span data-bind="text: $t('Message') + ':'"></span> + </label> + <div class="control"> + <textarea id="gift-message-whole-message" + class="input-text" + rows="5" cols="10" + data-bind="value: getObservable('message')"></textarea> + </div> + </div> + </fieldset> + <div class="actions-toolbar"> + <div class="secondary"> + <button type="submit" class="action secondary action-update" data-bind=" + attr: {title: $t('Update')}, + click: $data.submitOptions.bind($data)"> + <span data-bind="text: $t('Update')"></span> + </button> + <button class="action action-cancel" data-bind=" + attr: {title: $t('Cancel')}, + click: $data.hideFormBlock.bind($data)"> + <span data-bind="text: $t('Cancel')"></span> + </button> + </div> + </div> + </div> +</div> \ No newline at end of file diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-item-level.html b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-item-level.html new file mode 100644 index 0000000000000000000000000000000000000000..78f2175867b72a3991912eeda796bd7aff3615ef --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-item-level.html @@ -0,0 +1,55 @@ +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + --> +<!-- ko if: isActive() --> +<a href="#" + class="action action-gift" + data-bind=" + click: $data.toggleFormBlockVisibility.bind($data), + css: {_active: formBlockVisibility() || resultBlockVisibility()} + "> + <span data-bind="text: $t('Gift options')"></span> +</a> +<div class="gift-content" data-bind="css: {_active: formBlockVisibility() || resultBlockVisibility()}"> <!-- add class "active" to display the content --> + <!-- ko ifnot: resultBlockVisibility() --> + <div class="gift-options"> + <!-- ko foreach: getRegion('additionalOptions') --> + <!-- ko template: getTemplate() --><!-- /ko --> + <!-- /ko --> + <!-- ko template: formTemplate --><!--/ko--> + </div> + <!-- /ko --> + <!-- ko if: resultBlockVisibility() --> + <div class="gift-summary"> + <!-- ko foreach: getRegion('additionalOptions') --> + <!--ko template: appliedTemplate --><!-- /ko --> + <!-- /ko --> + + <!-- ko if: getObservable('message') --> + <div class="gift-message-summary"> + <span data-bind="text: $t('Message') + ':'"></span> + <!-- ko text: getObservable('message') --><!-- /ko --> + </div> + <!-- /ko --> + + <div class="actions-toolbar"> + <div class="secondary"> + <button type="submit" class="action action-edit" data-bind=" + click: $data.editOptions.bind($data), + attr: {title: $t('Edit')"> + <span data-bind="text: $t('Edit')"></span> + </button> + <button class="action action-delete" data-bind=" + click: $data.deleteOptions.bind($data), + attr: {title: $t('Delete')"> + <span data-bind="text: $t('Delete')"></span> + </button> + </div> + </div> + </div> + <!-- /ko --> +</div> +<!-- /ko --> diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html new file mode 100644 index 0000000000000000000000000000000000000000..dbe0ee8c877cd04fc9c25d5e3ab332ecbbb0a916 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html @@ -0,0 +1,54 @@ +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<!-- ko if: isActive() --> +<div class="cart-gift-item"> + <div class="gift-item-block block" + data-collapsible="true" + data-bind="css: {_active: formBlockVisibility() || resultBlockVisibility()}"> + <div class="title" data-role="title" data-bind="click: $data.toggleFormBlockVisibility.bind($data)"> + <span data-bind="text: $t('Gift options')"></span> + </div> + <div class="content" data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()"> + <!-- ko ifnot: resultBlockVisibility() --> + <div class="gift-options"> + <!-- ko foreach: getRegion('additionalOptions') --> + <!-- ko template: getTemplate() --><!-- /ko --> + <!-- /ko --> + <!-- ko template: formTemplate --><!--/ko--> + </div> + <!-- /ko --> + <div class="gift-summary"> + <!-- ko if: resultBlockVisibility() --> + <!-- ko foreach: getRegion('additionalOptions') --> + <!--ko template: appliedTemplate --><!-- /ko --> + <!-- /ko --> + + <!-- ko if: getObservable('message') --> + <div class="gift-message-summary"> + <span data-bind="text: $t('Message') + ':'"></span> + <!-- ko text: getObservable('message') --><!-- /ko --> + </div> + <!-- /ko --> + <div class="actions-toolbar"> + <div class="secondary"> + <button type="submit" + class="action action-edit" + data-bind="attr: {title: $t('Edit')}, click: $data.editOptions.bind($data)"> + <span data-bind="text: $t('Edit')"></span> + </button> + <button class="action action-delete" + data-bind="attr: {title: $t('Delete')}, click: $data.deleteOptions.bind($data)"> + <span data-bind="text: $t('Delete')"></span> + </button> + </div> + </div> + <!-- /ko --> + </div> + </div> + </div> +</div> +<!-- /ko --> diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-options.html b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-options.html deleted file mode 100644 index 02b2c1d5f03c0105ae4ce29fbadb27979998c578..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-options.html +++ /dev/null @@ -1,42 +0,0 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<fieldset class="fieldset gift-message" data-bind="visible: isGiftOptionsAvailable()"> - <legend class="legend"><span data-bind="text: $t('Do you have any gift items in your order?')"></span></legend><br> - <div class="field choice"> - <input type="checkbox" name="allow_gift_options" id="allow_gift_options" class="checkbox" data-bind="checked: isGiftOptionsSelected"> - <label for="allow_gift_options" class="label"><span data-bind="text: $t('Add gift options')"></span></label> - </div> - <dl class="options-items" id="allow-gift-options-container" data-bind="visible: isGiftOptionsSelected"> - <dt id="add-gift-options-for-order" class="order-title" data-bind="visible: isOrderLevelGiftOptionsEnabled()"> - <div class="field choice"> - <input type="checkbox" name="allow_gift_messages_for_order" id="allow_gift_options_for_order" class="checkbox" data-bind="checked: isOrderLevelGiftOptionsSelected"> - <label for="allow_gift_options_for_order" class="label"><span data-bind="text: $t('Gift Options for the Entire Order')"></span></label> - </div> - <dd id="allow-gift-options-for-order-container" class="order-options" style="display: block;" data-bind="visible: isOrderLevelGiftOptionsSelected"> - <!-- ko foreach: getOrderLevelGiftOptions() --> - <!-- ko template: getTemplate() --><!-- /ko --> - <!-- /ko --> - </dd> - </dt> - <dt id="add-gift-options-for-items" class="order-title individual" data-bind="visible: isItemLevelGiftOptionsEnabled()"> - <div class="field choice"> - <input type="checkbox" name="allow_gift_options_for_items" id="allow_gift_options_for_items" class="checkbox" data-bind="checked: isItemLevelGiftOptionsSelected"> - <label for="allow_gift_options_for_items" class="label"><span data-bind="text: $t('Gift Options for Individual Items')"></span></label> - </div> - <dd id="allow-gift-options-for-items-container" class="order-options individual" style="display: block;" data-bind="visible: isItemLevelGiftOptionsSelected"> - <!-- ko foreach: getItemLevelGiftOptions() --> - <!-- ko template: getTemplate() --><!-- /ko --> - <!-- /ko --> - </dd> - </dt> - <dt id="extra-options-container" class="extra-options-container"> - <!-- ko foreach: getExtraGiftOptions() --> - <!-- ko template: getTemplate() --><!-- /ko --> - <!-- /ko --> - </dt> - </dl> -</fieldset> diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/item-level-gift-message.html b/app/code/Magento/GiftMessage/view/frontend/web/template/item-level-gift-message.html deleted file mode 100644 index 68aedda15ecea2808f32982860e6ad48dc679311..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/item-level-gift-message.html +++ /dev/null @@ -1,76 +0,0 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<ol class="items" data-bind="foreach: quoteItems"> - <li class="item"> - <div class="product"> - <div class="number"> - <span> - <!-- ko text: $t('Item') --><!-- /ko --> - <!-- ko text: ($index() + 1) --><!-- /ko --> - </span> - <!-- ko text: $t('of') --><!-- /ko --> - <!-- ko text: $parent.quoteItemsCount --><!-- /ko --> - </div> - <div class="img photo container"> - <span class="product-image-container" style="width:100px;"> - <span class="product-image-wrapper" style="padding-bottom: 100%;"> - <img class="product-image-photo" data-bind="attr: {src: thumbnail || $parent.imagePlaceholder, alt: name}"> - </span> - </span> - </div> - <strong class="product name" style="width:100px;" data-bind="text: name"></strong> - </div> - <div class="options"> - <!-- <div class="options-items-container"></div> --> - <!--ko foreach: $parent.getRegion('item-level-additional-data') --> - <!--ko template: getTemplate() --><!--/ko --> - <!--/ko --> - <a href="#" class="action activate message" data-bind="click: $parent.setItemLevelGiftMessageHidden, text: $t('Gift Message')"></a> - <div id="gift-messages-for-item-container" class="block message" data-bind="visible: isItemLevelGiftMessageVisible"> - <fieldset class="fieldset"> - <p data-bind="text: $t('You can leave a box blank if you don\'t wish to add a gift message for the item.')"></p> - <div class="field from"> - <label class="label" data-bind="attr: {for: 'gift-message-' + item_id + '-from'}"><span data-bind="text: $t('From')"></span></label> - <div class="control"> - <input type="text" title="From" class="input-text" data-bind=" - value: $parent.messages[item_id].from, - attr: { - name: 'giftmessage[quote_item][' + item_id + '][from]', - id: 'gift-message-' + item_id + '-from' - } - "> - </div> - </div> - <div class="field to"> - <label class="label" data-bind="attr: {for: 'gift-message-' + item_id + '-to'}"><span data-bind="text: $t('To')"></span></label> - <div class="control"> - <input type="text" title="To" class="input-text" data-bind=" - value: $parent.messages[item_id].to, - attr: { - name: 'giftmessage[quote_item][' + item_id + '][to]', - id: 'gift-message-' + item_id + '-to' - } - "> - </div> - </div> - <div class="field text"> - <label class="label" data-bind="attr: {for: 'gift-message-' + item_id + '-message'}"><span data-bind="text: $t('Message')"></span></label> - <div class="control"> - <textarea class="input-text giftmessage-area" title="Message" rows="5" cols="40" data-bind=" - value: $parent.messages[item_id].message, - attr: { - id: 'gift-message-' + item_id + '-message', - name: 'giftmessage[quote_item][' + item_id + '][message]' - } - "></textarea> - </div> - </div> - </fieldset> - </div> - </div> - </li> -</ol> diff --git a/app/code/Magento/GiftMessage/view/frontend/web/template/order-level-gift-message.html b/app/code/Magento/GiftMessage/view/frontend/web/template/order-level-gift-message.html deleted file mode 100644 index 3053c94ed655d582d5636affa501258f5aa224ae..0000000000000000000000000000000000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/order-level-gift-message.html +++ /dev/null @@ -1,49 +0,0 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<!-- -<div class="options-order-container" id="options-order-container-1"></div> ---> -<a href="#" class="action activate message" data-bind="click: setOrderLevelGiftMessageVisible, text: $t('Gift Message')"></a> -<div id="allow-gift-messages-for-order-container" class="gift-messages-order" data-bind="visible: isOrderLevelGiftMessageVisible"> - <fieldset class="fieldset"> - <p data-bind="text: $t('If you don\'t want to leave a gift message for the entire order, leave this box blank.')"></p> - <div class="field from"> - <label for="gift-message-whole-from" class="label"><span data-bind="text: $t('From')"></span></label> - <div class="control"> - <input type="text" id="gift-message-whole-from" title="From" class="input-text" data-bind=" - value: message.from, - attr: { - name: 'giftmessage[quote][' + quoteId + '][from]' - } - "> - </div> - </div> - <div class="field to"> - <label for="gift-message-whole-to" class="label"><span data-bind="text: $t('To')"></span></label> - <div class="control"> - <input type="text" id="gift-message-whole-to" title="To" class="input-text" data-bind=" - value: message.to, - attr: { - name: 'giftmessage[quote][' + quoteId + '][to]' - } - "> - </div> - </div> - <div class="field text"> - <label for="gift-message-whole-message" class="label"><span data-bind="text: $t('Message')"></span></label> - <div class="control"> - <textarea id="gift-message-whole-message" class="input-text" title="Message" rows="5" cols="10" data-bind=" - value: message.message, - attr: { - name: 'giftmessage[quote][' + quoteId + '][message]' - } - "> - </textarea> - </div> - </div> - </fieldset> -</div> diff --git a/app/code/Magento/GoogleOptimizer/Helper/Form.php b/app/code/Magento/GoogleOptimizer/Helper/Form.php index 0bd1972f87ef2a8ac9af5af992e4f338f8caf693..ba6780e4298567cc6bae558e539a265fc8d88781 100644 --- a/app/code/Magento/GoogleOptimizer/Helper/Form.php +++ b/app/code/Magento/GoogleOptimizer/Helper/Form.php @@ -35,7 +35,7 @@ class Form extends \Magento\Framework\App\Helper\AbstractHelper 'value' => $experimentCodeModel ? $experimentCodeModel->getExperimentScript() : '', 'class' => 'textarea googleoptimizer', 'required' => false, - 'note' => __('Note: Experiment code should be added to the original page only.') + 'note' => __('Experiment code should be added to the original page only.') ] ); diff --git a/app/code/Magento/GoogleOptimizer/Test/Unit/Helper/FormTest.php b/app/code/Magento/GoogleOptimizer/Test/Unit/Helper/FormTest.php index 4c4d6be988c6c4893c7c8bd41264a60d120ff127..5c020011f3d2bc7bbfe90aae5f115c7867dd46bd 100644 --- a/app/code/Magento/GoogleOptimizer/Test/Unit/Helper/FormTest.php +++ b/app/code/Magento/GoogleOptimizer/Test/Unit/Helper/FormTest.php @@ -118,7 +118,7 @@ class FormTest extends \PHPUnit_Framework_TestCase 'value' => $experimentCode, 'class' => 'textarea googleoptimizer', 'required' => false, - 'note' => 'Note: Experiment code should be added to the original page only.' + 'note' => 'Experiment code should be added to the original page only.' ] ); diff --git a/app/code/Magento/GoogleShopping/Block/Adminhtml/Items/Item.php b/app/code/Magento/GoogleShopping/Block/Adminhtml/Items/Item.php index 073826ff9ebb613492bb4daafbb1fb5753f67310..b8e26b0aa1c0723345ebc8bc1543a1417e77a1a1 100644 --- a/app/code/Magento/GoogleShopping/Block/Adminhtml/Items/Item.php +++ b/app/code/Magento/GoogleShopping/Block/Adminhtml/Items/Item.php @@ -112,7 +112,7 @@ class Item extends \Magento\Backend\Block\Widget\Grid\Extended 'label' => __('Synchronize'), 'url' => $this->getUrl('adminhtml/*/refresh', ['_current' => true]), 'confirm' => __( - 'This action will update items\' attributes and remove items that are not available in Google Content. If an attribute was deleted from the mapping, it will also be deleted from Google. Do you want to continue?' + 'Are you sure you want to synchronize Google Content? This action will delete all items and attributes from Google Content that were deleted in Magento Admin so that the content is identical.' ) ] ); diff --git a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAdd.php b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAdd.php index 4f101189769876999ba8e662e2bb2f711a653dda..5b06a7c58fcec673e2978e2d17e3dff02edabe07 100644 --- a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAdd.php +++ b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAdd.php @@ -40,7 +40,7 @@ class MassAdd extends \Magento\GoogleShopping\Controller\Adminhtml\Googleshoppin } catch (\Exception $e) { $flag->unlock(); $this->notifier->addMajor( - __('An error has occurred while adding products to google shopping account.'), + __('Something went wrong while adding products to the Google shopping account.'), $e->getMessage() ); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); diff --git a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php index 60795768337b509e918aa33877ee4f8b5df2b447..bd3cc24f21b5db774775acfc475b975653a8f80a 100644 --- a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php +++ b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php @@ -50,9 +50,9 @@ class Refresh extends \Magento\GoogleShopping\Controller\Adminhtml\Googleshoppin } catch (\Exception $e) { $flag->unlock(); $this->notifier->addMajor( - __('An error has occurred while deleting products from google shopping account.'), + __('Something went wrong while deleting products from the Google shopping account.'), __( - 'One or more products were not deleted from google shopping account. Refer to the log file for details.' + 'One or more products were not deleted from the Google shopping account. Please review the log file for details.' ) ); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); diff --git a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/Edit.php b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/Edit.php index e3f5eb02d2406786e6222f31416041c308bf5f9e..ae6cbce96e755983e55906208b5abe87cdddff7b 100644 --- a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/Edit.php +++ b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/Edit.php @@ -44,7 +44,7 @@ class Edit extends \Magento\GoogleShopping\Controller\Adminhtml\Googleshopping\T return $resultPage; } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); - $this->messageManager->addError(__("We can't edit Attribute Set Mapping.")); + $this->messageManager->addError(__('We can\'t edit Attribute Set Mapping right now.')); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT); return $resultRedirect->setPath('adminhtml/*/index'); diff --git a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/LoadAttributes.php b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/LoadAttributes.php index 0d817329dd869c3b8563c784190729ce2a04a394..ff46793c0eb185126a3ebe2b95836c8792a392de 100644 --- a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/LoadAttributes.php +++ b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/LoadAttributes.php @@ -48,7 +48,7 @@ class LoadAttributes extends \Magento\GoogleShopping\Controller\Adminhtml\Google } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); // just need to output text with error - $this->messageManager->addError(__("We can't load attributes.")); + $this->messageManager->addError(__('We can\'t load attributes right now.')); } return $resultRaw; } diff --git a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/Save.php b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/Save.php index 696781f94287fb875c72f0d4e873cde22a87a6fa..64ae13d9fb359c3b189011a354002833d06288c2 100644 --- a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/Save.php +++ b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/Save.php @@ -60,7 +60,7 @@ class Save extends \Magento\GoogleShopping\Controller\Adminhtml\Googleshopping\T } } - $this->messageManager->addSuccess(__('The attribute mapping has been saved.')); + $this->messageManager->addSuccess(__('You saved the attribute mapping.')); if (!empty($requiredAttributes)) { $this->messageManager->addSuccess( $this->_objectManager->get('Magento\GoogleShopping\Helper\Category')->getMessage() diff --git a/app/code/Magento/GoogleShopping/Model/Attribute/Tax.php b/app/code/Magento/GoogleShopping/Model/Attribute/Tax.php index e99b7cdd7ba1b9b4ce8e5ae7e6ec15994ddf1c2b..2a8a0912ce9e08d9bbe9514fe618d37e2214465b 100644 --- a/app/code/Magento/GoogleShopping/Model/Attribute/Tax.php +++ b/app/code/Magento/GoogleShopping/Model/Attribute/Tax.php @@ -165,7 +165,7 @@ class Tax extends \Magento\GoogleShopping\Model\Attribute\DefaultAttribute $ratesTotal += count($regions); if ($ratesTotal > self::RATES_MAX) { throw new \Magento\Framework\Exception\LocalizedException( - __('Google shopping only supports %1 tax rates per product', self::RATES_MAX) + __('Google shopping only supports %1 tax rates per product.', self::RATES_MAX) ); } foreach ($regions as $region) { diff --git a/app/code/Magento/GoogleShopping/Model/MassOperations.php b/app/code/Magento/GoogleShopping/Model/MassOperations.php index d34fb365ed593685ea553db9bc966960c8295e5f..3be591c6e1a47d5c5f8494692ed5df1572281c2e 100644 --- a/app/code/Magento/GoogleShopping/Model/MassOperations.php +++ b/app/code/Magento/GoogleShopping/Model/MassOperations.php @@ -180,13 +180,13 @@ class MassOperations $errors[] = $message; } catch (CoreException $e) { $errors[] = __( - 'The product "%1" cannot be added to Google Content. %2', + 'We can\'t add product "%1" to Google Content right now. %2', $product->getName(), $e->getMessage() ); } catch (\Exception $e) { $this->_logger->critical($e); - $errors[] = __('The product "%1" hasn\'t been added to Google Content.', $product->getName()); + $errors[] = __('We can\'t add product "%1" to Google Content right now.', $product->getName()); } } if (empty($productIds)) { @@ -196,19 +196,19 @@ class MassOperations if ($totalAdded > 0) { $this->_notifier->addNotice( - __('Products were added to Google Shopping account.'), - __('A total of %1 product(s) have been added to Google Content.', $totalAdded) + __('You added products to the Google Shopping account.'), + __('You added a total of %1 product(s) to the Google Content.', $totalAdded) ); } if (count($errors)) { - $this->_notifier->addMajor(__('Errors happened while adding products to Google Shopping.'), $errors); + $this->_notifier->addMajor(__('Something went wrong while adding products to Google Shopping.'), $errors); } if ($this->_flag->isExpired()) { $this->_notifier->addMajor( __('Operation of adding products to Google Shopping expired.'), - __('Some products may have not been added to Google Shopping bacause of expiration') + __('Some products may have not been added to Google Shopping because of expiration.') ); } @@ -275,7 +275,7 @@ class MassOperations $totalFailed++; } catch (\Exception $e) { $this->_logger->critical($e); - $errors[] = __('The item "%1" hasn\'t been updated.', $item->getProduct()->getName()); + $errors[] = __('We can\'t update item "%1" right now.', $item->getProduct()->getName()); $totalFailed++; } } @@ -284,7 +284,7 @@ class MassOperations } $this->_notifier->addNotice( - __('Product synchronization with Google Shopping completed'), + __('The product synchronization with Google Shopping is finished.'), __( 'A total of %1 items(s) have been deleted; a total of %2 items(s) have been updated.', $totalDeleted, @@ -292,9 +292,9 @@ class MassOperations ) ); if ($totalFailed > 0 || count($errors)) { - array_unshift($errors, __("We cannot update %1 items.", $totalFailed)); + array_unshift($errors, __('We can\'t update %1 item(s).', $totalFailed)); $this->_notifier->addMajor( - __('Errors happened during synchronization with Google Shopping'), + __('Something went wrong during synchronization with Google Shopping.'), $errors ); } @@ -337,7 +337,7 @@ class MassOperations ); } catch (\Exception $e) { $this->_logger->critical($e); - $errors[] = __('The item "%1" hasn\'t been deleted.', $item->getProduct()->getName()); + $errors[] = __('We can\'t update item "%1" right now.', $item->getProduct()->getName()); } } } else { @@ -346,12 +346,12 @@ class MassOperations if ($totalDeleted > 0) { $this->_notifier->addNotice( - __('Google Shopping item removal process succeded'), - __('Total of %1 items(s) have been removed from Google Shopping.', $totalDeleted) + __('The Google Shopping item removal process succeeded.'), + __('You removed %1 items(s) from Google Shopping.', $totalDeleted) ); } if (count($errors)) { - $this->_notifier->addMajor(__('Errors happened while deleting items from Google Shopping'), $errors); + $this->_notifier->addMajor(__('Something went wrong while deleting items from Google Shopping.'), $errors); } return $this; diff --git a/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php b/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php index fa6854a990f3b44eec48499b1285c6cb9debe660..836e23c97f1f0162ad6baf775d32037dc1100a7b 100644 --- a/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php +++ b/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php @@ -160,7 +160,7 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase $this->notificationInterface->expects($this->once())->method('addNotice') ->with( - 'Product synchronization with Google Shopping completed', + 'The product synchronization with Google Shopping is finished.', 'A total of 0 items(s) have been deleted; a total of 1 items(s) have been updated.' )->will($this->returnSelf()); @@ -182,9 +182,9 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase $product = $this->getMockBuilder('Magento\Catalog\Model\Product')->disableOriginalConstructor() ->setMethods(['getName', '__sleep', '__wakeup'])->getMock(); - $product->expects($this->once())->method('getName')->will($this->returnValue('Product Name')); + $product->expects($this->any())->method('getName')->will($this->returnValue('Product Name')); - $item->expects($this->once())->method('getProduct')->will($this->returnValue($product)); + $item->expects($this->any())->method('getProduct')->will($this->returnValue($product)); $iterator = new \ArrayIterator([$item]); $collection->expects($this->once())->method('getIterator')->will($this->returnValue($iterator)); @@ -192,8 +192,11 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase $this->notificationInterface->expects($this->once())->method('addMajor') ->with( - 'Errors happened during synchronization with Google Shopping', - ['We cannot update 1 items.', 'The item "Product Name" hasn\'t been updated.'] + 'Something went wrong during synchronization with Google Shopping.', + [ + __('We can\'t update %1 item(s).', [1]), + __('We can\'t update item "%1" right now.', [$item->getProduct()->getName()]), + ] )->will($this->returnSelf()); $this->massOperations->synchronizeItems([1]); } @@ -218,8 +221,8 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase $this->notificationInterface->expects($this->once())->method('addNotice') ->with( - 'Google Shopping item removal process succeded', - 'Total of 1 items(s) have been removed from Google Shopping.' + 'The Google Shopping item removal process succeeded.', + 'You removed 1 items(s) from Google Shopping.' )->will($this->returnSelf()); $this->massOperations->deleteItems([1]); @@ -232,10 +235,10 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase { $product = $this->getMockBuilder('Magento\Catalog\Model\Product')->disableOriginalConstructor() ->setMethods(['getName', '__sleep', '__wakeup'])->getMock(); - $product->expects($this->once())->method('getName')->will($this->returnValue('Product Name')); + $product->expects($this->any())->method('getName')->will($this->returnValue('Product Name')); $item = $this->getMockBuilder('Magento\GoogleShopping\Model\Item')->disableOriginalConstructor()->getMock(); - $item->expects($this->once())->method('getProduct')->will($this->returnValue($product)); + $item->expects($this->any())->method('getProduct')->will($this->returnValue($product)); $item->expects($this->once())->method('deleteItem') ->will($this->throwException(new \Exception('Test exception'))); @@ -250,8 +253,8 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase $this->notificationInterface->expects($this->once())->method('addMajor') ->with( - 'Errors happened while deleting items from Google Shopping', - ['The item "Product Name" hasn\'t been deleted.'] + 'Something went wrong while deleting items from Google Shopping.', + [__('We can\'t update item "%1" right now.', [$item->getProduct()->getName()])] )->will($this->returnSelf()); $this->massOperations->deleteItems([1]); } diff --git a/app/code/Magento/GoogleShopping/etc/config.xml b/app/code/Magento/GoogleShopping/etc/config.xml index 82d68fde8927948a6bbdd118a543e1628a100f25..86a242ec1431d143cfb67199e0d45cae975c1c55 100644 --- a/app/code/Magento/GoogleShopping/etc/config.xml +++ b/app/code/Magento/GoogleShopping/etc/config.xml @@ -187,7 +187,7 @@ <required>1</required> </gender> <mpn translate="name"> - <name>Manufacturer\'s Part Number (MPN)</name> + <name>Manufacturer Part Number (MPN)</name> <required>1</required> </mpn> <online_only translate="name"> diff --git a/app/code/Magento/GoogleShopping/view/adminhtml/templates/types/edit.phtml b/app/code/Magento/GoogleShopping/view/adminhtml/templates/types/edit.phtml index f322f744c26dae60ed0a6216c6cc0435e1798516..9b272ee3255c848afad579aaa7d09de17b4bf47a 100644 --- a/app/code/Magento/GoogleShopping/view/adminhtml/templates/types/edit.phtml +++ b/app/code/Magento/GoogleShopping/view/adminhtml/templates/types/edit.phtml @@ -43,7 +43,7 @@ var itemType = function() { } } ); - $("attributes_details").innerHTML = "<?php echo __('Please, select Attribute Set and Google Item Type to load attributes') ?>"; + $("attributes_details").innerHTML = "<?php echo __('Please select Attribute Set and Google Item Type to load attributes.') ?>"; } }, diff --git a/app/code/Magento/GoogleShopping/view/adminhtml/templates/types/edit/attributes.phtml b/app/code/Magento/GoogleShopping/view/adminhtml/templates/types/edit/attributes.phtml index d40677511d741fe02cbbfbdb61a2acc2fdaa5736..f968eed629c779dbdca7479e74090d1c78c9550d 100644 --- a/app/code/Magento/GoogleShopping/view/adminhtml/templates/types/edit/attributes.phtml +++ b/app/code/Magento/GoogleShopping/view/adminhtml/templates/types/edit/attributes.phtml @@ -115,5 +115,5 @@ gContentAttribute = new Gcontent.Attribute(attributesSelectTemplate); </div> <?php else: ?> - <?php echo __("Please, select Attribute Set to load attributes") ?> + <?php echo __('Please select the attribute set you want to load.') ?> <?php endif; ?> diff --git a/app/code/Magento/GroupedProduct/Model/Resource/Product/Indexer/Price/Grouped.php b/app/code/Magento/GroupedProduct/Model/Resource/Product/Indexer/Price/Grouped.php index 1aa5d99953baecbd2efc8ca05b4a9d961d5fb70e..78155ac89acefd03b022fec7e2f7cb7fc1c70b3f 100644 --- a/app/code/Magento/GroupedProduct/Model/Resource/Product/Indexer/Price/Grouped.php +++ b/app/code/Magento/GroupedProduct/Model/Resource/Product/Indexer/Price/Grouped.php @@ -17,7 +17,7 @@ class Grouped extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defa */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->_prepareGroupedProductPriceData(); diff --git a/app/code/Magento/GroupedProduct/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/GroupedProduct/view/frontend/layout/checkout_cart_item_renderers.xml index c9021d6bcbd8fbd461cd9463b53bdad518f63203..8044a857c6a3e8863fc2f4299ebc39eb564b7793 100644 --- a/app/code/Magento/GroupedProduct/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/GroupedProduct/view/frontend/layout/checkout_cart_item_renderers.xml @@ -8,7 +8,12 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\GroupedProduct\Block\Cart\Item\Renderer\Grouped" as="grouped" template="Magento_Checkout::cart/item/default.phtml"/> + <block class="Magento\GroupedProduct\Block\Cart\Item\Renderer\Grouped" as="grouped" template="Magento_Checkout::cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.grouped.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.grouped.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.grouped.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php b/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php index 57845f2a27ec12a5c029fb5ce22bf044dba38ff1..4e963662ae03106f2d827b93b56c6522a32f3c34 100644 --- a/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php +++ b/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php @@ -163,7 +163,7 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended ); return $selectBlock->setOptions($options)->setValue($value)->getHtml(); } else { - return __('Attribute does not has options, so filtering is impossible'); + return __('We can\'t filter an attribute with no attribute options.'); } } @@ -246,7 +246,7 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended ); return $selectBlock->setOptions($options)->setValue($value)->getHtml(); } else { - return __('Attribute does not has options, so filtering is impossible'); + return __('We can\'t filter an attribute with no attribute options.'); } } diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Export.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Export.php index 1995511a4987617cba4710e4958196299a5c8c7a..a223c72ccd190a334da45cb15bd6a51d6b89ff82 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Export.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Export/Export.php @@ -55,10 +55,10 @@ class Export extends ExportController $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); - $this->messageManager->addError(__('Please correct the data sent.')); + $this->messageManager->addError(__('Please correct the data sent value.')); } } else { - $this->messageManager->addError(__('Please correct the data sent.')); + $this->messageManager->addError(__('Please correct the data sent value.')); } /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Export/GetFilter.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Export/GetFilter.php index 38296ff530dc60fa94814ac35d9ae3de97dba204..7e50e5fca3062d7feb807a0a8888ab2502af6c74 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Export/GetFilter.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Export/GetFilter.php @@ -36,7 +36,7 @@ class GetFilter extends ExportController $this->messageManager->addError($e->getMessage()); } } else { - $this->messageManager->addError(__('Please correct the data sent.')); + $this->messageManager->addError(__('Please correct the data sent value.')); } /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php index 76e47f3b50e45a9ddccd0cadb530bf0b22534608..e09c555b4cce7a71605a75d50f97ec36adbcad5f 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php @@ -26,21 +26,27 @@ class Validate extends ImportController ImportResultBlock $resultBlock ) { if ($import->getProcessedRowsCount() == $import->getInvalidRowsCount()) { - $resultBlock->addNotice(__('File is totally invalid. Please fix errors and re-upload file.')); + $resultBlock->addNotice(__('This file is invalid. Please fix errors and re-upload the file.')); } elseif ($import->getErrorsCount() >= $import->getErrorsLimit()) { $resultBlock->addNotice( - __('Errors limit (%1) reached. Please fix errors and re-upload file.', $import->getErrorsLimit()) + __( + 'You\'ve reached an error limit (%1). Please fix errors and re-upload the file.', + $import->getErrorsLimit() + ) ); } else { if ($import->isImportAllowed()) { $resultBlock->addNotice( __( - 'Please fix errors and re-upload file or simply press "Import" button to skip rows with errors' + 'Please fix errors and re-upload the file. Or press "Import" to skip rows with errors.' ), true ); } else { - $resultBlock->addNotice(__('File is partially valid, but import is not possible'), false); + $resultBlock->addNotice( + __('The file is partially valid, but we can\'t import it for some reason.'), + false + ); } } // errors info @@ -81,7 +87,7 @@ class Validate extends ImportController $validationResult = $import->validateSource($source); if (!$import->getProcessedRowsCount()) { - $resultBlock->addError(__('File does not contain data. Please upload another one')); + $resultBlock->addError(__('This file is empty. Please try another one.')); } else { if (!$validationResult) { $this->processValidationError($import, $resultBlock); @@ -92,7 +98,10 @@ class Validate extends ImportController true ); } else { - $resultBlock->addError(__('File is valid, but import is not possible'), false); + $resultBlock->addError( + __('The file is valid, but we can\'t import it for some reason.'), + false + ); } } $resultBlock->addNotice($import->getNotices()); @@ -107,14 +116,15 @@ class Validate extends ImportController ); } } catch (\Exception $e) { - $resultBlock->addNotice(__('Please fix errors and re-upload file.'))->addError($e->getMessage()); + $resultBlock->addNotice(__('Please fix errors and re-upload the file.')) + ->addError($e->getMessage()); } return $resultLayout; } elseif ($this->getRequest()->isPost() && empty($_FILES)) { - $resultBlock->addError(__('File was not uploaded')); + $resultBlock->addError(__('The file was not uploaded.')); return $resultLayout; } - $this->messageManager->addError(__('Data is invalid or file is not uploaded')); + $this->messageManager->addError(__('Sorry, but the data is invalid or the file is not uploaded.')); /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); $resultRedirect->setPath('adminhtml/*/index'); diff --git a/app/code/Magento/ImportExport/Helper/Data.php b/app/code/Magento/ImportExport/Helper/Data.php index 462fd7f424b3e4d76d838191ed09efb7700227e0..0e81094f9713135d1d018f22b5571e2d6dd1effd 100644 --- a/app/code/Magento/ImportExport/Helper/Data.php +++ b/app/code/Magento/ImportExport/Helper/Data.php @@ -52,9 +52,9 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper { $maxImageSize = $this->_fileSize->getMaxFileSizeInMb(); if ($maxImageSize) { - $message = __('The total size of the uploadable files can\'t be more than %1M', $maxImageSize); + $message = __('Make sure your file isn\'t more than %1M.', $maxImageSize); } else { - $message = __('System doesn\'t allow to get file upload settings'); + $message = __('We can\'t provide the upload settings right now.'); } return $message; } diff --git a/app/code/Magento/ImportExport/Model/Export.php b/app/code/Magento/ImportExport/Model/Export.php index b445d0239e0a99a1694039dfd88a0284b7909a65..1c2095c5d2c5924ae955854d4b221a23044a5f53 100644 --- a/app/code/Magento/ImportExport/Model/Export.php +++ b/app/code/Magento/ImportExport/Model/Export.php @@ -99,7 +99,7 @@ class Export extends \Magento\ImportExport\Model\AbstractModel } catch (\Exception $e) { $this->_logger->critical($e); throw new \Magento\Framework\Exception\LocalizedException( - __('Please enter a correct entity model') + __('Please enter a correct entity model.') ); } if (!$this->_entityAdapter instanceof \Magento\ImportExport\Model\Export\Entity\AbstractEntity && @@ -107,7 +107,7 @@ class Export extends \Magento\ImportExport\Model\AbstractModel ) { throw new \Magento\Framework\Exception\LocalizedException( __( - 'Entity adapter object must be an instance of %1 or %2', + 'The entity adapter object must be an instance of %1 or %2.', 'Magento\ImportExport\Model\Export\Entity\AbstractEntity', 'Magento\ImportExport\Model\Export\AbstractEntity' ) @@ -145,13 +145,13 @@ class Export extends \Magento\ImportExport\Model\AbstractModel } catch (\Exception $e) { $this->_logger->critical($e); throw new \Magento\Framework\Exception\LocalizedException( - __('Please enter a correct entity model') + __('Please enter a correct entity model.') ); } if (!$this->_writer instanceof \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter) { throw new \Magento\Framework\Exception\LocalizedException( __( - 'Adapter object must be an instance of %1', + 'The adapter object must be an instance of %1.', 'Magento\ImportExport\Model\Export\Adapter\AbstractAdapter' ) ); @@ -176,10 +176,10 @@ class Export extends \Magento\ImportExport\Model\AbstractModel $result = $this->_getEntityAdapter()->setWriter($this->_getWriter())->export(); $countRows = substr_count(trim($result), "\n"); if (!$countRows) { - throw new \Magento\Framework\Exception\LocalizedException(__('There is no data for export')); + throw new \Magento\Framework\Exception\LocalizedException(__('There is no data for the export.')); } if ($result) { - $this->addLogComment([__('Exported %1 rows.', $countRows), __('Export has been done.')]); + $this->addLogComment([__('Exported %1 rows.', $countRows), __('The export is finished.')]); } return $result; } else { @@ -219,7 +219,9 @@ class Export extends \Magento\ImportExport\Model\AbstractModel } elseif ($attribute->isStatic()) { return self::getStaticAttributeFilterType($attribute); } else { - throw new \Magento\Framework\Exception\LocalizedException(__('Cannot determine attribute filter type')); + throw new \Magento\Framework\Exception\LocalizedException( + __('We can\'t determine the attribute filter type.') + ); } } @@ -295,7 +297,7 @@ class Export extends \Magento\ImportExport\Model\AbstractModel public function getFileFormat() { if (empty($this->_data['file_format'])) { - throw new \Magento\Framework\Exception\LocalizedException(__('File format is unknown')); + throw new \Magento\Framework\Exception\LocalizedException(__('We can\'t identify this file format.')); } return $this->_data['file_format']; } diff --git a/app/code/Magento/ImportExport/Model/Export/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Export/AbstractEntity.php index 643d3aa3ab938b2d42f7a3e62bbee331dc9c4c35..e11145a53667d09f5b988158cb783883f61c5e05 100644 --- a/app/code/Magento/ImportExport/Model/Export/AbstractEntity.php +++ b/app/code/Magento/ImportExport/Model/Export/AbstractEntity.php @@ -390,7 +390,7 @@ abstract class AbstractEntity ) ? __( $this->_messageTemplates[$errorCode] ) : __( - "Please correct the value for '%1' column", + 'Please correct the value for "%1" column.', $errorCode ); $message = (string)$message; @@ -449,7 +449,7 @@ abstract class AbstractEntity public function getWriter() { if (!$this->_writer) { - throw new \Magento\Framework\Exception\LocalizedException(__('Please specify writer.')); + throw new \Magento\Framework\Exception\LocalizedException(__('Please specify the writer.')); } return $this->_writer; diff --git a/app/code/Magento/ImportExport/Model/Export/Adapter/AbstractAdapter.php b/app/code/Magento/ImportExport/Model/Export/Adapter/AbstractAdapter.php index a83e0cc3bf6bc645dc115fe15ee6d6db725bdbf9..20a92c0f6c9432a1e807029f458d7c4150caa0bd 100644 --- a/app/code/Magento/ImportExport/Model/Export/Adapter/AbstractAdapter.php +++ b/app/code/Magento/ImportExport/Model/Export/Adapter/AbstractAdapter.php @@ -49,11 +49,13 @@ abstract class AbstractAdapter $this->_directoryHandle->touch($destination); } if (!is_string($destination)) { - throw new \Magento\Framework\Exception\LocalizedException(__('Destination file path must be a string')); + throw new \Magento\Framework\Exception\LocalizedException( + __('The destination file path must be a string.') + ); } if (!$this->_directoryHandle->isWritable()) { - throw new \Magento\Framework\Exception\LocalizedException(__('Destination directory is not writable')); + throw new \Magento\Framework\Exception\LocalizedException(__('The destination directory is not writable.')); } if ($this->_directoryHandle->isFile($destination) && !$this->_directoryHandle->isWritable($destination)) { throw new \Magento\Framework\Exception\LocalizedException(__('Destination file is not writable')); diff --git a/app/code/Magento/ImportExport/Model/Export/Adapter/Csv.php b/app/code/Magento/ImportExport/Model/Export/Adapter/Csv.php index fe1d00d2c6503d5b2b16c94dc2b734ff92792769..652079422b2e5d5fe965268df2d94198436d2a4c 100644 --- a/app/code/Magento/ImportExport/Model/Export/Adapter/Csv.php +++ b/app/code/Magento/ImportExport/Model/Export/Adapter/Csv.php @@ -84,7 +84,7 @@ class Csv extends \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter public function setHeaderCols(array $headerColumns) { if (null !== $this->_headerCols) { - throw new \Magento\Framework\Exception\LocalizedException(__('Header column names already set')); + throw new \Magento\Framework\Exception\LocalizedException(__('The header column names are already set.')); } if ($headerColumns) { foreach ($headerColumns as $columnName) { diff --git a/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEntity.php index 1cbca0d192b6f0297b975540842476ad9712642b..a4a43e8ba839dde2979267c3a3627f964f52175f 100644 --- a/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEntity.php +++ b/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEntity.php @@ -442,7 +442,7 @@ abstract class AbstractEntity ) ? __( $this->_messageTemplates[$errorCode] ) : __( - "Please correct the value for '%1' column", + 'Please correct the value for "%1" column.', $errorCode ); $messages[$message] = $errorRows; @@ -499,7 +499,7 @@ abstract class AbstractEntity public function getWriter() { if (!$this->_writer) { - throw new \Magento\Framework\Exception\LocalizedException(__('Please specify writer.')); + throw new \Magento\Framework\Exception\LocalizedException(__('Please specify the writer.')); } return $this->_writer; } diff --git a/app/code/Magento/ImportExport/Model/Import.php b/app/code/Magento/ImportExport/Model/Import.php index eaea84beddeb0612ea8db14d071aed9cc782d75b..4bf31650dcdba5386f7c44b868ded03e2e2d1a36 100644 --- a/app/code/Magento/ImportExport/Model/Import.php +++ b/app/code/Magento/ImportExport/Model/Import.php @@ -197,14 +197,16 @@ class Import extends \Magento\ImportExport\Model\AbstractModel $this->_entityAdapter = $this->_entityFactory->create($entities[$this->getEntity()]['model']); } catch (\Exception $e) { $this->_logger->critical($e); - throw new \Magento\Framework\Exception\LocalizedException(__('Please enter a correct entity model')); + throw new \Magento\Framework\Exception\LocalizedException( + __('Please enter a correct entity model.') + ); } if (!$this->_entityAdapter instanceof \Magento\ImportExport\Model\Import\Entity\AbstractEntity && !$this->_entityAdapter instanceof \Magento\ImportExport\Model\Import\AbstractEntity ) { throw new \Magento\Framework\Exception\LocalizedException( __( - 'Entity adapter object must be an instance of %1 or %2', + 'The entity adapter object must be an instance of %1 or %2.', 'Magento\ImportExport\Model\Import\Entity\AbstractEntity', 'Magento\ImportExport\Model\Import\AbstractEntity' ) @@ -252,17 +254,17 @@ class Import extends \Magento\ImportExport\Model\AbstractModel if ($this->getProcessedRowsCount()) { if (!$validationResult) { if ($this->getProcessedRowsCount() == $this->getInvalidRowsCount()) { - $messages[] = __('File is totally invalid. Please fix errors and re-upload file.'); + $messages[] = __('This file is invalid. Please fix errors and re-upload the file.'); } elseif ($this->getErrorsCount() >= $this->getErrorsLimit()) { $messages[] = __( - 'Errors limit (%1) reached. Please fix errors and re-upload file.', + 'You\'ve reached an error limit (%1). Please fix errors and re-upload the file.', $this->getErrorsLimit() ); } else { if ($this->isImportAllowed()) { - $messages[] = __('Please fix errors and re-upload file.'); + $messages[] = __('Please fix errors and re-upload the file.'); } else { - $messages[] = __('File is partially valid, but import is not possible'); + $messages[] = __('The file is partially valid, but we can\'t import it for some reason.'); } } // errors info @@ -272,9 +274,9 @@ class Import extends \Magento\ImportExport\Model\AbstractModel } } else { if ($this->isImportAllowed()) { - $messages[] = __('Validation finished successfully'); + $messages[] = __('The validation is complete.'); } else { - $messages[] = __('File is valid, but import is not possible'); + $messages[] = __('The file is valid, but we can\'t import it for some reason.'); } } $notices = $this->getNotices(); @@ -289,7 +291,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel $this->getErrorsCount() ); } else { - $messages[] = __('File does not contain data.'); + $messages[] = __('This file does not contain any data.'); } return $messages; } @@ -449,7 +451,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel $this->getInvalidRowsCount(), $this->getErrorsCount() ), - __('Import has been done successfuly.'), + __('The import was successful.'), ] ); @@ -481,7 +483,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel if ($errors[0] == \Zend_Validate_File_Upload::INI_SIZE) { $errorMessage = $this->_importExportData->getMaxUploadSizeMessage(); } else { - $errorMessage = __('File was not uploaded.'); + $errorMessage = __('The file was not uploaded.'); } throw new \Magento\Framework\Exception\LocalizedException($errorMessage); } @@ -496,7 +498,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel $uploadedFile = $result['path'] . $result['file']; if (!$extension) { $this->_varDirectory->delete($uploadedFile); - throw new \Magento\Framework\Exception\LocalizedException(__('Uploaded file has no extension')); + throw new \Magento\Framework\Exception\LocalizedException(__('The file you uploaded has no extension.')); } $sourceFile = $this->getWorkingDir() . $entity; @@ -514,7 +516,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel $sourceFileRelative ); } catch (\Magento\Framework\Exception\FileSystemException $e) { - throw new \Magento\Framework\Exception\LocalizedException(__('Source file moving failed')); + throw new \Magento\Framework\Exception\LocalizedException(__('The source file moving process failed.')); } } $this->_removeBom($sourceFile); @@ -559,7 +561,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel $messages = $this->getOperationResultMessages($result); $this->addLogComment($messages); if ($result) { - $this->addLogComment(__('Done import data validation')); + $this->addLogComment(__('Import data validation is complete.')); } return $result; } @@ -614,7 +616,9 @@ class Import extends \Magento\ImportExport\Model\AbstractModel 'code' => $behavior->getCode() . '_behavior', ]; } else { - throw new \Magento\Framework\Exception\LocalizedException(__('Invalid behavior token for %1', $entityCode)); + throw new \Magento\Framework\Exception\LocalizedException( + __('The behavior token for %1 is invalid.', $entityCode) + ); } } return $behaviourData; diff --git a/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php index e512c99ce330200b703b69e1e82a05b370f5e920..f791c1fd67c0c4ab919b3744fad88ab913429d02 100644 --- a/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php +++ b/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php @@ -549,7 +549,7 @@ abstract class AbstractEntity public function getSource() { if (!$this->_source) { - throw new \Magento\Framework\Exception\LocalizedException(__('Source is not set')); + throw new \Magento\Framework\Exception\LocalizedException(__('The source is not set.')); } return $this->_source; } @@ -719,7 +719,7 @@ abstract class AbstractEntity $absentColumns = array_diff($this->_permanentAttributes, $this->getSource()->getColNames()); if ($absentColumns) { throw new \Magento\Framework\Exception\LocalizedException( - __('Cannot find required columns: %1', implode(', ', $absentColumns)) + __('We can\'t find required columns: %1.', implode(', ', $absentColumns)) ); } diff --git a/app/code/Magento/ImportExport/Model/Import/Adapter.php b/app/code/Magento/ImportExport/Model/Import/Adapter.php index 3b364f6daea8af9809b7ec3647c50065d873a5d6..dc53d89186943ae80f8e077110015a5aa5030b8b 100644 --- a/app/code/Magento/ImportExport/Model/Import/Adapter.php +++ b/app/code/Magento/ImportExport/Model/Import/Adapter.php @@ -30,7 +30,7 @@ class Adapter { if (!is_string($type) || !$type) { throw new \Magento\Framework\Exception\LocalizedException( - __('The adapter type must be a non empty string.') + __('The adapter type must be a non-empty string.') ); } $adapterClass = 'Magento\ImportExport\Model\Import\Source\\' . ucfirst(strtolower($type)); diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php index 2d74a95768d34fc9189dbdf2109b6cb1408b20d6..6b407e88df101fd2c8a12b48287905e42e22e3d0 100644 --- a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php +++ b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php @@ -545,7 +545,7 @@ abstract class AbstractEntity public function getSource() { if (!$this->_source) { - throw new \Magento\Framework\Exception\LocalizedException(__('Source is not set')); + throw new \Magento\Framework\Exception\LocalizedException(__('The source is not set.')); } return $this->_source; } @@ -706,7 +706,7 @@ abstract class AbstractEntity // do all permanent columns exist? if ($absentColumns = array_diff($this->_permanentAttributes, $this->getSource()->getColNames())) { throw new \Magento\Framework\Exception\LocalizedException( - __('Cannot find required columns: %1', implode(', ', $absentColumns)) + __('We can\'t find required columns: %1.', implode(', ', $absentColumns)) ); } diff --git a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php index 9c6457056fbc604682bbdc8b6eb042ac7d77b300..e39cc3cc5fa637a878dc5f41a87459dce58b3c9a 100644 --- a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php +++ b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php @@ -26,7 +26,7 @@ class MassChangelog extends \Magento\Indexer\Controller\Adminhtml\Indexer $model->setScheduled(true); } $this->messageManager->addSuccess( - __('A total of %1 indexer(s) have been turned Update by Schedule mode on.', count($indexerIds)) + __('%1 indexer(s) are in "Update by Schedule" mode.', count($indexerIds)) ); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); diff --git a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassOnTheFly.php b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassOnTheFly.php index 5490a56d0d6b0b53f0c57f2f54616ae44ef8f00c..27def97e6b15409dea0570d99eb3372d12e21322 100644 --- a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassOnTheFly.php +++ b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassOnTheFly.php @@ -26,7 +26,7 @@ class MassOnTheFly extends \Magento\Indexer\Controller\Adminhtml\Indexer $model->setScheduled(false); } $this->messageManager->addSuccess( - __('A total of %1 indexer(s) have been turned Update on Save mode on.', count($indexerIds)) + __('%1 indexer(s) are in "Update on Save" mode.', count($indexerIds)) ); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); diff --git a/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php b/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php new file mode 100644 index 0000000000000000000000000000000000000000..2d6c154a2a707879fc47cd6bd5720806b2e96733 --- /dev/null +++ b/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php @@ -0,0 +1,77 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Indexer\Model\Indexer\Table; + +/** + * Class Strategy + * @package Magento\Indexer + */ +class Strategy implements StrategyInterface +{ + /** + * Application resource + * + * @var \Magento\Framework\App\Resource + */ + protected $resource; + + /** + * Constructor + * + * @param \Magento\Framework\App\Resource $resource + */ + public function __construct( + \Magento\Framework\App\Resource $resource + ) { + $this->resource = $resource; + } + + /** + * Use index table directly + * + * @var bool + */ + protected $useIdxTable = false; + + /** + * {@inheritdoc} + */ + public function getUseIdxTable() + { + return $this->useIdxTable; + } + + /** + * {@inheritdoc} + */ + public function setUseIdxTable($value = false) + { + $this->useIdxTable = (bool) $value; + return $this; + } + + /** + * {@inheritdoc} + */ + public function getTableName($tablePrefix) + { + return $this->resource->getTableName($this->prepareTableName($tablePrefix)); + } + + /** + * Prepare index table name + * + * @param string $tablePrefix + * + * @return string + */ + public function prepareTableName($tablePrefix) + { + return $this->getUseIdxTable() + ? $tablePrefix . self::IDX_SUFFIX + : $tablePrefix . self::TMP_SUFFIX; + } +} diff --git a/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php b/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..c1693ceb44cd47f8a7d7e7de2649e6264985ad77 --- /dev/null +++ b/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php @@ -0,0 +1,53 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Indexer\Model\Indexer\Table; + +/** + * Interface StrategyInterface + * @package Magento\Indexer + */ +interface StrategyInterface +{ + const IDX_SUFFIX = '_idx'; + + const TMP_SUFFIX = '_tmp'; + + /** + * Get IDX table usage flag + * + * @return bool + * @SuppressWarnings(PHPMD.BooleanGetMethodName) + */ + public function getUseIdxTable(); + + /** + * Set IDX table usage flag + * + * @param bool $value + * + * @return $this + */ + public function setUseIdxTable($value = false); + + /** + * Prepare index table name + * + * @param string $tablePrefix + * + * @return string + */ + public function prepareTableName($tablePrefix); + + /** + * Returns target table name + * + * @param string $tablePrefix + * + * @return string + */ + public function getTableName($tablePrefix); +} diff --git a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php index 9fa80dac9e76571bf9a4153cce3e255206499767..aeccf684e6a22fef89ab314648d073bb94e35286 100644 --- a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php +++ b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php @@ -16,16 +16,28 @@ use Magento\Framework\DB\Select; abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\AbstractDb { - const IDX_SUFFIX = '_idx'; - - const TMP_SUFFIX = '_tmp'; + /** + * Constructor + * + * @var \Magento\Indexer\Model\Indexer\Table\StrategyInterface + */ + protected $tableStrategy; /** - * Flag that defines if need to use "_idx" index table suffix instead of "_tmp" + * Class constructor * - * @var bool + * @param \Magento\Framework\Model\Resource\Db\Context $context + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy + * @param null $resourcePrefix */ - protected $_isNeedUseIdxTable = false; + public function __construct( + \Magento\Framework\Model\Resource\Db\Context $context, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, + $resourcePrefix = null + ) { + $this->tableStrategy = $tableStrategy; + parent::__construct($context, $resourcePrefix); + } /** * Reindex all @@ -34,7 +46,7 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs */ public function reindexAll() { - $this->useIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); return $this; } @@ -56,14 +68,10 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs */ public function getIdxTable($table = null) { - $suffix = self::TMP_SUFFIX; - if ($this->_isNeedUseIdxTable) { - $suffix = self::IDX_SUFFIX; - } if ($table) { - return $table . $suffix; + return $this->tableStrategy->prepareTableName($table); } - return $this->getMainTable() . $suffix; + return $this->tableStrategy->prepareTableName($this->getMainTable()); } /** @@ -155,20 +163,6 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs return $this; } - /** - * Set or get what either "_idx" or "_tmp" suffixed temporary index table need to use - * - * @param bool $value - * @return bool - */ - public function useIdxTable($value = null) - { - if ($value !== null) { - $this->_isNeedUseIdxTable = (bool)$value; - } - return $this->_isNeedUseIdxTable; - } - /** * Clean up temporary index table * diff --git a/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php b/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6aed194580dc6f9168d2f9bde635f315180daafe --- /dev/null +++ b/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php @@ -0,0 +1,94 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Indexer\Test\Unit\Model\Indexer\Table; + +/** + * Class StrategyTest + * @package Magento\Indexer\Test\Unit\Model\Indexer\Table + */ +class StrategyTest extends \PHPUnit_Framework_TestCase +{ + /** + * Strategy object + * + * @var \Magento\Indexer\Model\Indexer\Table\Strategy + */ + protected $_model; + + /** + * Resource mock + * + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $_resourceMock; + + /** + * {@inheritdoc} + */ + protected function setUp() + { + $this->_resourceMock = $this->getMock( + '\Magento\Framework\App\Resource', + [], + [], + '', + false + ); + $this->_model = new \Magento\Indexer\Model\Indexer\Table\Strategy( + $this->_resourceMock + ); + } + + /** + * Test use idx table switcher + * + * @return void + */ + public function testUseIdxTable() + { + $this->assertEquals(false, $this->_model->getUseIdxTable()); + $this->_model->setUseIdxTable(false); + $this->assertEquals(false, $this->_model->getUseIdxTable()); + $this->_model->setUseIdxTable(true); + $this->assertEquals(true, $this->_model->getUseIdxTable()); + $this->_model->setUseIdxTable(); + $this->assertEquals(false, $this->_model->getUseIdxTable()); + } + + /** + * Test table name preparation + * + * @return void + */ + public function testPrepareTableName() + { + $this->assertEquals('test_tmp', $this->_model->prepareTableName('test')); + $this->_model->setUseIdxTable(true); + $this->assertEquals('test_idx', $this->_model->prepareTableName('test')); + $this->_model->setUseIdxTable(false); + $this->assertEquals('test_tmp', $this->_model->prepareTableName('test')); + } + + /** + * Test table name getter + * + * @return void + */ + public function testGetTableName() + { + $prefix = 'pre_'; + $this->_resourceMock->expects($this->any())->method('getTableName')->will( + $this->returnCallback( + function ($tableName) use ($prefix) { + return $prefix . $tableName; + } + ) + ); + $this->assertEquals('pre_test_tmp', $this->_model->getTableName('test')); + $this->_model->setUseIdxTable(true); + $this->assertEquals('pre_test_idx', $this->_model->getTableName('test')); + } +} diff --git a/app/code/Magento/Indexer/Test/Unit/Model/Processor/InvalidateCacheTest.php b/app/code/Magento/Indexer/Test/Unit/Model/Processor/InvalidateCacheTest.php index 29628de82f5459902a9996b0e47e4beeb179ac2b..90c5606b85da7ec8612250701c9adfbc9d075742 100644 --- a/app/code/Magento/Indexer/Test/Unit/Model/Processor/InvalidateCacheTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Model/Processor/InvalidateCacheTest.php @@ -4,33 +4,41 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Indexer\Test\Unit\Model\Processor; class InvalidateCacheTest extends \PHPUnit_Framework_TestCase { /** + * Tested plugin + * * @var \Magento\Indexer\Model\Processor\InvalidateCache */ protected $plugin; /** + * Mock for context + * * @var \Magento\Indexer\Model\CacheContext|\PHPUnit_Framework_MockObject_MockObject */ protected $contextMock; /** + * Subject mock + * * @var \Magento\Indexer\Model\ActionInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $subjectMock; /** + * Event manager mock + * * @var \Magento\Framework\Event\Manager|\PHPUnit_Framework_MockObject_MockObject */ protected $eventManagerMock; /** + * Module manager mock + * * @var \Magento\Framework\Module\Manager|\PHPUnit_Framework_MockObject_MockObject */ protected $moduleManager; @@ -40,20 +48,21 @@ class InvalidateCacheTest extends \PHPUnit_Framework_TestCase */ public function setUp() { - $this->subjectMock = $this->getMock('Magento\Indexer\Model\Processor', - [], [], '', false); - $this->contextMock = $this->getMock('Magento\Indexer\Model\CacheContext', - [], [], '', false); - $this->eventManagerMock = $this->getMock('Magento\Framework\Event\Manager', - [], [], '', false); - $this->moduleManager = $this->getMock('Magento\Framework\Module\Manager', - [], [], '', false); + $this->subjectMock = $this->getMock('Magento\Indexer\Model\Processor', [], [], '', false); + $this->contextMock = $this->getMock('Magento\Indexer\Model\CacheContext', [], [], '', false); + $this->eventManagerMock = $this->getMock('Magento\Framework\Event\Manager', [], [], '', false); + $this->moduleManager = $this->getMock('Magento\Framework\Module\Manager', [], [], '', false); $this->plugin = new \Magento\Indexer\Model\Processor\InvalidateCache( - $this->contextMock, $this->eventManagerMock, $this->moduleManager); + $this->contextMock, + $this->eventManagerMock, + $this->moduleManager + ); } /** * Test afterUpdateMview with enabled PageCache module + * + * @return void */ public function testAfterUpdateMviewPageCacheEnabled() { @@ -63,14 +72,17 @@ class InvalidateCacheTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue(true)); $this->eventManagerMock->expects($this->once()) ->method('dispatch') - ->with($this->equalTo('clean_cache_after_reindex'), - $this->equalTo(['object' => $this->contextMock])); - $actualResult = $this->plugin->afterUpdateMview($this->subjectMock); - $this->assertNull($actualResult); + ->with( + $this->equalTo('clean_cache_after_reindex'), + $this->equalTo(['object' => $this->contextMock]) + ); + $this->plugin->afterUpdateMview($this->subjectMock); } /** - * afterUpdateMview with disabled PageCache module + * Test afterUpdateMview with disabled PageCache module + * + * @return void */ public function testAfterUpdateMviewPageCacheDisabled() { @@ -80,7 +92,6 @@ class InvalidateCacheTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue(false)); $this->eventManagerMock->expects($this->never()) ->method('dispatch'); - $actualResult = $this->plugin->afterUpdateMview($this->subjectMock); - $this->assertNull($actualResult); + $this->plugin->afterUpdateMview($this->subjectMock); } } diff --git a/app/code/Magento/Indexer/Test/Unit/Model/Resource/AbstractResourceTest.php b/app/code/Magento/Indexer/Test/Unit/Model/Resource/AbstractResourceTest.php index 79e058df703750c0242663308e62b9555296e379..07b7bf63f7c8ca71d7d146d0ad56e0b59ea624ec 100644 --- a/app/code/Magento/Indexer/Test/Unit/Model/Resource/AbstractResourceTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Model/Resource/AbstractResourceTest.php @@ -17,6 +17,11 @@ class AbstractResourceTest extends \PHPUnit_Framework_TestCase */ protected $_resourceMock; + /** + * @var \Magento\Indexer\Model\Indexer\Table\StrategyInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $_tableStrategyInterface; + protected function setUp() { @@ -24,10 +29,20 @@ class AbstractResourceTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); + $this->_tableStrategyInterface = $this->getMock( + 'Magento\Indexer\Model\Indexer\Table\StrategyInterface', + [], + [], + '', + false + ); $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $arguments = $objectManager->getConstructArguments( '\Magento\Indexer\Test\Unit\Model\Resource\AbstractResourceStub', - ['resource' => $this->_resourceMock] + [ + 'resource' => $this->_resourceMock, + 'tableStrategy' => $this->_tableStrategyInterface + ] ); $this->model = $objectManager->getObject( '\Magento\Indexer\Test\Unit\Model\Resource\AbstractResourceStub', @@ -37,18 +52,17 @@ class AbstractResourceTest extends \PHPUnit_Framework_TestCase public function testReindexAll() { + $this->_tableStrategyInterface->expects($this->once()) + ->method('setUseIdxTable') + ->with(true); + $this->_tableStrategyInterface->expects($this->once()) + ->method('prepareTableName') + ->with('test') + ->will($this->returnValue('test_idx')); $this->model->reindexAll(); $this->assertEquals('test_idx', $this->model->getIdxTable('test')); } - public function testUseIdxTable() - { - $this->model->useIdxTable(true); - $this->assertEquals('test_idx', $this->model->getIdxTable('test')); - $this->model->useIdxTable(false); - $this->assertEquals('test_tmp', $this->model->getIdxTable('test')); - } - public function testClearTemporaryIndexTable() { $connectionMock = $this->getMock('Magento\Framework\DB\Adapter\AdapterInterface', [], [], '', false); diff --git a/app/code/Magento/Indexer/etc/crontab.xml b/app/code/Magento/Indexer/etc/crontab.xml index 33e6a27040f939cca18a0ccf2418ffa0fa3ee5b7..2dd222c0e0166f7a4c5f1800e8655c83dccb0cec 100644 --- a/app/code/Magento/Indexer/etc/crontab.xml +++ b/app/code/Magento/Indexer/etc/crontab.xml @@ -6,7 +6,7 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Cron/etc/crontab.xsd"> - <group id="index"> + <group id="default"> <job name="indexer_reindex_all_invalid" instance="Magento\Indexer\Model\Processor" method="reindexAllInvalid"> <schedule>* * * * *</schedule> </job> diff --git a/app/code/Magento/Indexer/etc/di.xml b/app/code/Magento/Indexer/etc/di.xml index 8c6730dffb5c959d732d78f590c366eae74ef1bb..d6c354590a60c3ab39544872c966aa98eb1f5572 100644 --- a/app/code/Magento/Indexer/etc/di.xml +++ b/app/code/Magento/Indexer/etc/di.xml @@ -10,6 +10,8 @@ <preference for="Magento\Framework\Mview\View\StateInterface" type="Magento\Indexer\Model\Mview\View\State" /> <preference for="Magento\Indexer\Model\ConfigInterface" type="Magento\Indexer\Model\Config" /> <preference for="Magento\Indexer\Model\IndexerInterface" type="Magento\Indexer\Model\Indexer" /> + <preference for="Magento\Indexer\Model\Indexer\Table\StrategyInterface" type="Magento\Indexer\Model\Indexer\Table\Strategy" /> + <type name="Magento\Indexer\Model\Indexer\Table\StrategyInterface" shared="false" /> <type name="Magento\Indexer\Model\Indexer"> <arguments> <argument name="view" xsi:type="object" shared="false">Magento\Framework\Mview\View</argument> diff --git a/app/code/Magento/Integration/Model/AuthorizationService.php b/app/code/Magento/Integration/Model/AuthorizationService.php index 4eb1b5fb0151ac9b85e7029be03a9d6579ad9404..58e9f87a3d161e3431db1fc93b9b12adde555dd4 100644 --- a/app/code/Magento/Integration/Model/AuthorizationService.php +++ b/app/code/Magento/Integration/Model/AuthorizationService.php @@ -104,7 +104,7 @@ class AuthorizationService implements \Magento\Integration\Api\AuthorizationServ } catch (\Exception $e) { $this->_logger->critical($e); throw new LocalizedException( - __('Error happened while granting permissions. Check exception log for details.') + __('Sorry, something went wrong granting permissions. You can find out more in the exceptions log.') ); } } @@ -127,7 +127,10 @@ class AuthorizationService implements \Magento\Integration\Api\AuthorizationServ } catch (\Exception $e) { $this->_logger->critical($e); throw new LocalizedException( - __('Error happened while deleting role and permissions. Check exception log for details.') + __( + 'Something went wrong while deleting roles and permissions.' + . ' You can find out more in the exceptions log.' + ) ); } } diff --git a/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php b/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php index 50943355d83682a7bbb890f59e6964c2dbd16c85..fc0ee3e4fb0840bd497071c5001240f7654bc6b7 100644 --- a/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php +++ b/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php @@ -126,7 +126,7 @@ class AuthorizationServiceTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Error happened while deleting role and permissions. Check exception log for details. + * @expectedExceptionMessage Something went wrong while deleting roles and permissions. */ public function testRemovePermissionsException() { @@ -190,7 +190,7 @@ class AuthorizationServiceTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Error happened while granting permissions. Check exception log for details. + * @expectedExceptionMessage Sorry, something went wrong granting permissions. */ public function testGrantPermissionsException() { diff --git a/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/state.phtml b/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/state.phtml index 0881ce5b79925de4f3d6f5072211061a8bd57ec5..57633279a47fce8585d7ba948f668c41ad48c09d 100644 --- a/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/state.phtml +++ b/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/state.phtml @@ -20,7 +20,7 @@ <strong class="block-subtitle filter-current-subtitle" role="heading" aria-level="2" - data-count="<?php echo count($_filters); ?>"><?php echo __('Currently Shopping by') ?></strong> + data-count="<?php echo count($_filters); ?>"><?php echo __('Now Shopping by') ?></strong> <ol class="items"> <?php foreach ($_filters as $_filter): ?> <li class="item"> diff --git a/app/code/Magento/Msrp/etc/adminhtml/system.xml b/app/code/Magento/Msrp/etc/adminhtml/system.xml index 9e9f459c56948639418c4e4515a22a983d7ac6ee..bc779be0f268d0c62b099f3d38ae8b74ad666b41 100644 --- a/app/code/Magento/Msrp/etc/adminhtml/system.xml +++ b/app/code/Magento/Msrp/etc/adminhtml/system.xml @@ -14,7 +14,7 @@ <label>Enable MAP</label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> <comment> - <![CDATA[<strong style="color:red">Warning!</strong> Enabling MAP by default will hide all product prices on the front end.]]> + <![CDATA[<strong style="color:red">Warning!</strong> Enabling MAP by default will hide all product prices on Storefront.]]> </comment> </field> <field id="display_price_type" translate="label" type="select" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="0"> diff --git a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php index b788293e230d31cd69f765ebcedcf335c141e45f..74f396ea18a7f94fe70e22c057994c2422fe83cd 100644 --- a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php +++ b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php @@ -593,10 +593,10 @@ class Multishipping extends \Magento\Framework\Object public function setPaymentMethod($payment) { if (!isset($payment['method'])) { - throw new \Magento\Framework\Exception\LocalizedException(__('Payment method is not defined')); + throw new \Magento\Framework\Exception\LocalizedException(__('A payment method is not defined.')); } if (!$this->paymentSpecification->isSatisfiedBy($payment['method'])) { - throw new \Magento\Framework\Exception\LocalizedException(__('The requested Payment Method is not available for multishipping.')); + throw new \Magento\Framework\Exception\LocalizedException(__('The requested payment method is not available for multishipping.')); } $quote = $this->getQuote(); $quote->getPayment()->importData($payment); diff --git a/app/code/Magento/Multishipping/view/frontend/layout/multishipping_checkout_success.xml b/app/code/Magento/Multishipping/view/frontend/layout/multishipping_checkout_success.xml index e9bca9477d829c01fe0c92260310c6378b5a71ac..a7ebd5157d6fbed7db9d5999a03bc3c5686ad4aa 100644 --- a/app/code/Magento/Multishipping/view/frontend/layout/multishipping_checkout_success.xml +++ b/app/code/Magento/Multishipping/view/frontend/layout/multishipping_checkout_success.xml @@ -13,7 +13,7 @@ <body> <referenceBlock name="page.main.title"> <action method="setPageTitle"> - <argument translate="true" name="title" xsi:type="string">Your order has been received.</argument> + <argument translate="true" name="title" xsi:type="string">We received your order!</argument> </action> </referenceBlock> <referenceContainer name="content"> diff --git a/app/code/Magento/Multishipping/view/frontend/templates/checkout/addresses.phtml b/app/code/Magento/Multishipping/view/frontend/templates/checkout/addresses.phtml index 6250a70104ff44d5bb0081d0a44d6e319108a0a6..f1085b397eedc3a458c401678b2165e7d1b0aeb3 100644 --- a/app/code/Magento/Multishipping/view/frontend/templates/checkout/addresses.phtml +++ b/app/code/Magento/Multishipping/view/frontend/templates/checkout/addresses.phtml @@ -48,7 +48,7 @@ </td> <td class="col address" data-th="<?php echo $block->escapeHtml(__('Send To'));?>"> <?php if ($_item->getProduct()->getIsVirtual()): ?> - <div class="applicable"><?php echo __('Shipping selection is not applicable.'); ?></div> + <div class="applicable"><?php echo __('A shipping selection is not applicable.'); ?></div> <?php else: ?> <div class="field address"> <label for="ship_<?php echo $_index ?>_<?php echo $_item->getQuoteItemId() ?>_address" class="label"> @@ -73,7 +73,7 @@ </div> <div class="actions-toolbar"> <div class="primary"> - <button type="submit" title="<?php echo __('Continue to Shipping Information') ?>" class="action primary continue<?php if ($block->isContinueDisabled()):?> disabled<?php endif; ?>" data-role="can-continue" data-flag="1"<?php if ($block->isContinueDisabled()):?> disabled="disabled"<?php endif; ?>><span><?php echo __('Continue to Shipping Information') ?></span></button> + <button type="submit" title="<?php echo __('Go to Shipping Information') ?>" class="action primary continue<?php if ($block->isContinueDisabled()):?> disabled<?php endif; ?>" data-role="can-continue" data-flag="1"<?php if ($block->isContinueDisabled()):?> disabled="disabled"<?php endif; ?>><span><?php echo __('Go to Shipping Information') ?></span></button> </div> <div class="secondary"> <button type="submit" class="action update" data-role="can-continue" data-flag="0"><span><?php echo __('Update Qty & Addresses') ?></span></button> diff --git a/app/code/Magento/Multishipping/view/frontend/templates/checkout/billing.phtml b/app/code/Magento/Multishipping/view/frontend/templates/checkout/billing.phtml index c8071150dfe61b91a53195435cba019ddd42e670..434502fba3a781b72776122f22eabcb101ec8d01 100644 --- a/app/code/Magento/Multishipping/view/frontend/templates/checkout/billing.phtml +++ b/app/code/Magento/Multishipping/view/frontend/templates/checkout/billing.phtml @@ -63,7 +63,7 @@ </div> <div class="actions-toolbar"> <div class="primary"> - <button id="payment-continue" type="submit" class="action primary continue"><span><?php echo __('Continue to Review Your Order') ?></span></button> + <button id="payment-continue" type="submit" class="action primary continue"><span><?php echo __('Go to Review Your Order') ?></span></button> </div> <div class="secondary"> <a href="<?php echo $block->getBackUrl() ?>" class="action back"><span><?php echo __('Back to Shipping Information') ?></span></a> diff --git a/app/code/Magento/Multishipping/view/frontend/templates/checkout/link.phtml b/app/code/Magento/Multishipping/view/frontend/templates/checkout/link.phtml index d48cb7b0720c91ae7409dbbb50e138e51b636e49..7af7299bc13a15e4a9e970aacd491da7595d64d3 100644 --- a/app/code/Magento/Multishipping/view/frontend/templates/checkout/link.phtml +++ b/app/code/Magento/Multishipping/view/frontend/templates/checkout/link.phtml @@ -7,4 +7,4 @@ // @codingStandardsIgnoreFile ?> -<a class="action multicheckout" href="<?php echo $block->getCheckoutUrl()?>" title="<?php echo __('Checkout with Multiple Addresses');?>"><span><?php echo __('Checkout with Multiple Addresses');?></span></a> +<a class="action multicheckout" href="<?php echo $block->getCheckoutUrl()?>" title="<?php echo __('Check Out with Multiple Addresses');?>"><span><?php echo __('Check Out with Multiple Addresses');?></span></a> diff --git a/app/code/Magento/Multishipping/view/frontend/templates/checkout/shipping.phtml b/app/code/Magento/Multishipping/view/frontend/templates/checkout/shipping.phtml index 105b8b416e6e2377301e29890febaeb957e2a3e1..95f29ab40105d76c7aa00a9d4eb87909a236c7e9 100644 --- a/app/code/Magento/Multishipping/view/frontend/templates/checkout/shipping.phtml +++ b/app/code/Magento/Multishipping/view/frontend/templates/checkout/shipping.phtml @@ -34,7 +34,7 @@ </strong> <div class="box-content"> <?php if (!($_shippingRateGroups = $block->getShippingRates($_address))): ?> - <p><?php echo __('Sorry, no quotes are available for this order at this time.') ?></p> + <p><?php echo __('Sorry, no quotes are available for this order right now.') ?></p> <?php else: ?> <dl class="items methods-shipping"> <?php $_sole = count($_shippingRateGroups) == 1; foreach ($_shippingRateGroups as $code => $_rates): ?> diff --git a/app/code/Magento/Multishipping/view/frontend/templates/checkout/success.phtml b/app/code/Magento/Multishipping/view/frontend/templates/checkout/success.phtml index aeb0de21440b71764a706d296c22b13cd64a4cc2..a2371c2b40efaf7e205fd42a00838ac682199cd3 100644 --- a/app/code/Magento/Multishipping/view/frontend/templates/checkout/success.phtml +++ b/app/code/Magento/Multishipping/view/frontend/templates/checkout/success.phtml @@ -9,7 +9,7 @@ ?> <div class="multicheckout success"> <h2 class="subtitle"><?php echo __('Thank you for your purchase!') ?></h2> - <p><?php echo __('Thanks for your order. We\'ll send you emails with order details and tracking information.') ?></p> + <p><?php echo __('Thanks for your order. We\'ll email you order details and tracking information.') ?></p> <?php if ($_orderIds = $block->getOrderIds()): ?> <p class="order-number"> <?php $flag = false ?> diff --git a/app/code/Magento/Newsletter/Block/Adminhtml/Template/Grid/Renderer/Action.php b/app/code/Magento/Newsletter/Block/Adminhtml/Template/Grid/Renderer/Action.php index c099dde6c068405e7a62a4d2569c8d6d40d51c70..14cc03317248bc6257aa8813377f5c918d4d7ee3 100644 --- a/app/code/Magento/Newsletter/Block/Adminhtml/Template/Grid/Renderer/Action.php +++ b/app/code/Magento/Newsletter/Block/Adminhtml/Template/Grid/Renderer/Action.php @@ -24,7 +24,7 @@ class Action extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\Action if ($row->isValidForSend()) { $actions[] = [ 'url' => $this->getUrl('*/queue/edit', ['template_id' => $row->getId()]), - 'caption' => __('Queue Newsletter...'), + 'caption' => __('Queue Newsletter'), ]; } diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Save.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Save.php index 39535cd89af534429b189e75fe5251e93541602e..33fd2052a42056497f4e1be99d1571952a9aa210 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Save.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Queue/Save.php @@ -80,7 +80,7 @@ class Save extends \Magento\Newsletter\Controller\Adminhtml\Queue $queue->save(); - $this->messageManager->addSuccess(__('The newsletter queue has been saved.')); + $this->messageManager->addSuccess(__('You saved the newsletter queue.')); $this->_getSession()->setFormData(false); $this->_redirect('*/*'); diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php index a16b3bfcf34b4ae676c572e287cc771d893a3e2a..4ea5f85728efdd7f2df57bf5d8ff742382774950 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php @@ -28,7 +28,7 @@ class MassDelete extends \Magento\Newsletter\Controller\Adminhtml\Subscriber ); $subscriber->delete(); } - $this->messageManager->addSuccess(__('Total of %1 record(s) were deleted', count($subscribersIds))); + $this->messageManager->addSuccess(__('Total of %1 record(s) were deleted.', count($subscribersIds))); } catch (\Exception $e) { $this->messageManager->addError($e->getMessage()); } diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Save.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Save.php index 3e83573ff78c5f9fafe4b5cb64df4c6c64d8a4ba..e70b3a8809cf3467639203076f626ca9e0a7c046 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Save.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Save.php @@ -67,7 +67,7 @@ class Save extends \Magento\Newsletter\Controller\Adminhtml\Template $this->messageManager->addError(nl2br($e->getMessage())); $this->_getSession()->setData('newsletter_template_form_data', $this->getRequest()->getParams()); } catch (\Exception $e) { - $this->messageManager->addException($e, __('An error occurred while saving this template.')); + $this->messageManager->addException($e, __('Something went wrong while saving this template.')); $this->_getSession()->setData('newsletter_template_form_data', $this->getRequest()->getParams()); } diff --git a/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php b/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php index bb28a220d8769077814271d59d23898fde4647a1..9fb7575699a4958000ca564134fcb3569e0440bb 100644 --- a/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php +++ b/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php @@ -20,11 +20,11 @@ class Unsubscribe extends \Magento\Newsletter\Controller\Subscriber if ($id && $code) { try { $this->_subscriberFactory->create()->load($id)->setCheckCode($code)->unsubscribe(); - $this->messageManager->addSuccess(__('You have been unsubscribed.')); + $this->messageManager->addSuccess(__('You unsubscribed.')); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addException($e, $e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addException($e, __('Something went wrong with the un-subscription.')); + $this->messageManager->addException($e, __('Something went wrong while unsubscribing you.')); } } $this->getResponse()->setRedirect($this->_redirect->getRedirectUrl()); diff --git a/app/code/Magento/Newsletter/Model/Queue.php b/app/code/Magento/Newsletter/Model/Queue.php index 4c34f3419f10ad6f41717fd31d5b656d2d849ffb..3a42e4ac6e36ba5b352caffd24f13cf5e23c48d7 100644 --- a/app/code/Magento/Newsletter/Model/Queue.php +++ b/app/code/Magento/Newsletter/Model/Queue.php @@ -119,13 +119,15 @@ class Queue extends \Magento\Email\Model\AbstractTemplate * @param \Magento\Newsletter\Model\ProblemFactory $problemFactory * @param \Magento\Newsletter\Model\Resource\Subscriber\CollectionFactory $subscriberCollectionFactory * @param \Magento\Newsletter\Model\Queue\TransportBuilder $transportBuilder + * @param \Magento\Framework\Model\Resource\AbstractResource $resource + * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( \Magento\Framework\Model\Context $context, - \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, + \Magento\Framework\View\DesignInterface $design, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Newsletter\Model\Template\Filter $templateFilter, @@ -134,9 +136,20 @@ class Queue extends \Magento\Email\Model\AbstractTemplate \Magento\Newsletter\Model\ProblemFactory $problemFactory, \Magento\Newsletter\Model\Resource\Subscriber\CollectionFactory $subscriberCollectionFactory, \Magento\Newsletter\Model\Queue\TransportBuilder $transportBuilder, + \Magento\Framework\Model\Resource\AbstractResource $resource = null, + \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $design, $registry, $appEmulation, $storeManager, $data); + parent::__construct( + $context, + $registry, + $design, + $appEmulation, + $storeManager, + $data, + $resource, + $resourceCollection + ); $this->_templateFilter = $templateFilter; $this->_date = $date; $this->_templateFactory = $templateFactory; diff --git a/app/code/Magento/Newsletter/Model/Template.php b/app/code/Magento/Newsletter/Model/Template.php index 9f2dc723b155c0da2015d5cae3d906f5069ec660..9f439f7192713eb30dfff6dbc279b615cc53a6ff 100644 --- a/app/code/Magento/Newsletter/Model/Template.php +++ b/app/code/Magento/Newsletter/Model/Template.php @@ -106,8 +106,8 @@ class Template extends \Magento\Email\Model\AbstractTemplate */ public function __construct( \Magento\Framework\Model\Context $context, - \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, + \Magento\Framework\View\DesignInterface $design, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\App\RequestInterface $request, @@ -117,7 +117,7 @@ class Template extends \Magento\Email\Model\AbstractTemplate \Magento\Framework\Filter\FilterManager $filterManager, array $data = [] ) { - parent::__construct($context, $design, $registry, $appEmulation, $storeManager, $data); + parent::__construct($context, $registry, $design, $appEmulation, $storeManager, $data); $this->_storeManager = $storeManager; $this->_request = $request; $this->_filter = $filter; diff --git a/app/code/Magento/Newsletter/Setup/InstallSchema.php b/app/code/Magento/Newsletter/Setup/InstallSchema.php index f567558d0550f4ad4987a2b13d3418093c147c7c..85a6f6a249f17d78cc64bb17aa6894067fba09ce 100644 --- a/app/code/Magento/Newsletter/Setup/InstallSchema.php +++ b/app/code/Magento/Newsletter/Setup/InstallSchema.php @@ -107,7 +107,7 @@ class InstallSchema implements InstallSchemaInterface \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], - 'Template Id' + 'Template ID' ) ->addColumn( 'template_code', @@ -218,7 +218,7 @@ class InstallSchema implements InstallSchemaInterface \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['unsigned' => true, 'nullable' => false, 'default' => '0'], - 'Template Id' + 'Template ID' ) ->addColumn( 'newsletter_type', diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/Plugin/CustomerPluginTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/Plugin/CustomerPluginTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0c97d3ef5ef8a0b28513411058c1604b81aa6bed --- /dev/null +++ b/app/code/Magento/Newsletter/Test/Unit/Model/Plugin/CustomerPluginTest.php @@ -0,0 +1,94 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Newsletter\Test\Unit\Model\Plugin; + +class CustomerPluginTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Newsletter\Model\Plugin\CustomerPlugin + */ + protected $plugin; + + /** + * @var \Magento\Newsletter\Model\SubscriberFactory|\PHPUnit_Framework_MockObject_MockObject + */ + private $subscriberFactory; + + /** + * @var \Magento\Newsletter\Model\Subscriber|\PHPUnit_Framework_MockObject_MockObject + */ + private $subscriber; + + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + protected $objectManager; + + public function setUp() + { + $this->subscriberFactory = $this->getMockBuilder('\Magento\Newsletter\Model\SubscriberFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->subscriber = $this->getMockBuilder('\Magento\Newsletter\Model\Subscriber') + ->setMethods(['loadByEmail', 'getId', 'delete', 'updateSubscription']) + ->disableOriginalConstructor() + ->getMock(); + $this->subscriberFactory->expects($this->any())->method('create')->willReturn($this->subscriber); + + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->plugin = $this->objectManager->getObject( + 'Magento\Newsletter\Model\Plugin\CustomerPlugin', + [ + 'subscriberFactory' => $this->subscriberFactory + ] + ); + } + + public function testAfterSave() + { + $customerId = 1; + $subject = $this->getMock('\Magento\Customer\Api\CustomerRepositoryInterface'); + $customer = $this->getMock('Magento\Customer\Api\Data\CustomerInterface'); + $customer->expects($this->once())->method('getId')->willReturn($customerId); + $this->subscriber->expects($this->once())->method('updateSubscription')->with($customerId)->willReturnSelf(); + + $this->assertEquals($customer, $this->plugin->afterSave($subject, $customer)); + } + + public function testAroundDelete() + { + $deleteCustomer = function () { + return true; + }; + $subject = $this->getMock('\Magento\Customer\Api\CustomerRepositoryInterface'); + $customer = $this->getMock('Magento\Customer\Api\Data\CustomerInterface'); + $customer->expects($this->once())->method('getEmail')->willReturn('test@test.com'); + $this->subscriber->expects($this->once())->method('loadByEmail')->with('test@test.com')->willReturnSelf(); + $this->subscriber->expects($this->once())->method('getId')->willReturn(1); + $this->subscriber->expects($this->once())->method('delete')->willReturnSelf(); + + $this->assertEquals(true, $this->plugin->aroundDelete($subject, $deleteCustomer, $customer)); + } + + public function testAroundDeleteById() + { + $customerId = 1; + $deleteCustomerById = function () { + return true; + }; + $subject = $this->getMock('\Magento\Customer\Api\CustomerRepositoryInterface'); + $customer = $this->getMock('Magento\Customer\Api\Data\CustomerInterface'); + $subject->expects($this->once())->method('getById')->willReturn($customer); + $customer->expects($this->once())->method('getEmail')->willReturn('test@test.com'); + $this->subscriber->expects($this->once())->method('loadByEmail')->with('test@test.com')->willReturnSelf(); + $this->subscriber->expects($this->once())->method('getId')->willReturn(1); + $this->subscriber->expects($this->once())->method('delete')->willReturnSelf(); + + $this->assertEquals(true, $this->plugin->aroundDeleteById($subject, $deleteCustomerById, $customerId)); + } +} diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/QueueTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/QueueTest.php new file mode 100644 index 0000000000000000000000000000000000000000..bb8ec3b719f54c143447aececfde24daccbcc5ce --- /dev/null +++ b/app/code/Magento/Newsletter/Test/Unit/Model/QueueTest.php @@ -0,0 +1,205 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Newsletter\Test\Unit\Model; + +class QueueTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Newsletter\Model\Queue + */ + protected $queue; + + /** + * @var \Magento\Newsletter\Model\Template\Filter|\PHPUnit_Framework_MockObject_MockObject + */ + protected $templateFilter; + + /** + * @var \Magento\Framework\Stdlib\DateTime\DateTime|\PHPUnit_Framework_MockObject_MockObject + */ + protected $date; + + /** + * @var \Magento\Newsletter\Model\TemplateFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $templateFactory; + + /** + * @var \Magento\Newsletter\Model\ProblemFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $problemFactory; + + /** + * @var \Magento\Newsletter\Model\Resource\Subscriber\Collection|\PHPUnit_Framework_MockObject_MockObject + */ + protected $subscribersCollection; + + /** + * @var \Magento\Newsletter\Model\Resource\Subscriber\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $subscribersCollectionFactory; + + /** + * @var \Magento\Newsletter\Model\Queue\TransportBuilder|\PHPUnit_Framework_MockObject_MockObject + */ + protected $transportBuilder; + + /** + * @var \Magento\Newsletter\Model\Resource\Queue|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resource; + + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + protected $objectManager; + + public function setUp() + { + $this->templateFilter = $this->getMockBuilder('\Magento\Newsletter\Model\Template\Filter') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->date = $this->getMockBuilder('\Magento\Framework\Stdlib\DateTime\DateTime') + ->disableOriginalConstructor() + ->getMock(); + $this->templateFactory = $this->getMockBuilder('\Magento\Newsletter\Model\TemplateFactory') + ->disableOriginalConstructor() + ->setMethods(['create', 'load']) + ->getMock(); + $this->problemFactory = $this->getMockBuilder('\Magento\Newsletter\Model\ProblemFactory') + ->disableOriginalConstructor() + ->getMock(); + $this->transportBuilder = $this->getMockBuilder('\Magento\Newsletter\Model\Queue\TransportBuilder') + ->disableOriginalConstructor() + ->setMethods( + ['setTemplateData', 'setTemplateOptions', 'setTemplateVars', 'setFrom', 'addTo', 'getTransport'] + ) + ->getMock(); + $this->subscribersCollection = $this->getMockBuilder('\Magento\Newsletter\Model\Resource\Subscriber\Collection') + ->disableOriginalConstructor() + ->getMock(); + $this->resource = $this->getMockBuilder('\Magento\Newsletter\Model\Resource\Queue') + ->disableOriginalConstructor() + ->getMock(); + $this->subscribersCollectionFactory = $this->getMockBuilder( + '\Magento\Newsletter\Model\Resource\Subscriber\CollectionFactory' + ) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->subscribersCollectionFactory->expects($this->any())->method('create')->willReturn( + $this->subscribersCollection + ); + + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->queue = $this->objectManager->getObject( + '\Magento\Newsletter\Model\Queue', + [ + 'templateFilter' => $this->templateFilter, + 'date' => $this->date, + 'templateFactory' => $this->templateFactory, + 'problemFactory' => $this->problemFactory, + 'subscriberCollectionFactory' => $this->subscribersCollectionFactory, + 'transportBuilder' => $this->transportBuilder, + 'resource' => $this->resource + ] + ); + } + + public function testSendPerSubscriber1() + { + $this->queue->setQueueStatus(2); + $this->queue->setQueueStartAt(1); + + $this->assertEquals($this->queue, $this->queue->sendPerSubscriber()); + } + + public function testSendPerSubscriberZeroSize() + { + $this->queue->setQueueStatus(1); + $this->queue->setQueueStartAt(1); + $this->subscribersCollection->expects($this->once())->method('getQueueJoinedFlag')->willReturn(false); + $this->subscribersCollection->expects($this->once())->method('useQueue')->with($this->queue)->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('getSize')->willReturn(0); + $this->date->expects($this->once())->method('gmtDate')->willReturn('any_date'); + + $this->assertEquals($this->queue, $this->queue->sendPerSubscriber()); + } + + public function testSendPerSubscriber2() + { + $this->queue->setQueueStatus(1); + $this->queue->setQueueStartAt(1); + $collection = $this->getMockBuilder('\Magento\Framework\Data\Collection') + ->disableOriginalConstructor() + ->setMethods(['getItems']) + ->getMock(); + $item = $this->getMockBuilder('\Magento\Newsletter\Model\Subscriber') + ->disableOriginalConstructor() + ->setMethods(['getStoreId', 'getSubscriberEmail', 'getSubscriberFullName', 'received']) + ->getMock(); + $transport = $this->getMock('\Magento\Framework\Mail\TransportInterface'); + $this->subscribersCollection->expects($this->once())->method('getQueueJoinedFlag')->willReturn(false); + $this->subscribersCollection->expects($this->once())->method('useQueue')->with($this->queue)->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('getSize')->willReturn(5); + $this->subscribersCollection->expects($this->once())->method('useOnlyUnsent')->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('showCustomerInfo')->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('setPageSize')->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('setCurPage')->willReturnSelf(); + $this->subscribersCollection->expects($this->once())->method('load')->willReturn($collection); + $this->transportBuilder->expects($this->once())->method('setTemplateData')->willReturnSelf(); + $collection->expects($this->atLeastOnce())->method('getItems')->willReturn([$item]); + $item->expects($this->once())->method('getStoreId')->willReturn('store_id'); + $item->expects($this->once())->method('getSubscriberEmail')->willReturn('email'); + $item->expects($this->once())->method('getSubscriberFullName')->willReturn('full_name'); + $this->transportBuilder->expects($this->once())->method('setTemplateOptions')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('setTemplateVars')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('setFrom')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('addTo')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('getTransport')->willReturn($transport); + $item->expects($this->once())->method('received')->with($this->queue)->willReturnSelf(); + + $this->assertEquals($this->queue, $this->queue->sendPerSubscriber()); + } + + public function testGetDataForSave() + { + $result = [ + 'template_id' => 'id', + 'queue_status' => 'status', + 'queue_start_at' => 'start_at', + 'queue_finish_at' => 'finish_at' + ]; + $this->queue->setTemplateId('id'); + $this->queue->setQueueStatus('status'); + $this->queue->setQueueStartAt('start_at'); + $this->queue->setQueueFinishAt('finish_at'); + + $this->assertEquals($result, $this->queue->getDataForSave()); + } + + public function testGetTemplate() + { + $template = $this->getMockBuilder('\Magento\Newsletter\Model\Template') + ->disableOriginalConstructor() + ->getMock(); + $this->queue->setTemplateId(2); + $this->templateFactory->expects($this->once())->method('create')->willReturn($template); + $template->expects($this->once())->method('load')->with(2)->willReturnSelf(); + + $this->assertEquals($template, $this->queue->getTemplate()); + } + + public function testGetStores() + { + $stores = ['store']; + $this->resource->expects($this->once())->method('getStores')->willReturn($stores); + + $this->assertEquals($stores, $this->queue->getStores()); + } +} diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/SubscriberTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/SubscriberTest.php index bd8380299a52ee06f8d95a9ddea229ae2649160e..90d5c2ca0a4886deac1ab31f7acf72a004ace884 100644 --- a/app/code/Magento/Newsletter/Test/Unit/Model/SubscriberTest.php +++ b/app/code/Magento/Newsletter/Test/Unit/Model/SubscriberTest.php @@ -100,7 +100,9 @@ class SubscriberTest extends \PHPUnit_Framework_TestCase [ 'loadByEmail', 'getIdFieldName', - 'save' + 'save', + 'loadByCustomerData', + 'received' ], [], '', @@ -134,7 +136,6 @@ class SubscriberTest extends \PHPUnit_Framework_TestCase 'name' => 'subscriber_name' ] ); - $this->resource->expects($this->any())->method('getIdFieldName')->willReturn('id_field'); $this->scopeConfig->expects($this->any())->method('getValue')->willReturn(true); $this->customerSession->expects($this->any())->method('isLoggedIn')->willReturn(true); $customerDataModel = $this->getMock('\Magento\Customer\Api\Data\CustomerInterface'); @@ -144,21 +145,193 @@ class SubscriberTest extends \PHPUnit_Framework_TestCase $this->customerRepository->expects($this->any())->method('getById')->willReturn($customerDataModel); $customerDataModel->expects($this->any())->method('getStoreId')->willReturn(1); $customerDataModel->expects($this->any())->method('getId')->willReturn(1); - $this->transportBuilder->expects($this->any())->method('setTemplateIdentifier')->willReturnSelf(); - $this->transportBuilder->expects($this->any())->method('setTemplateOptions')->willReturnSelf(); - $this->transportBuilder->expects($this->any())->method('setTemplateVars')->willReturnSelf(); - $this->transportBuilder->expects($this->any())->method('setFrom')->willReturnSelf(); - $this->transportBuilder->expects($this->any())->method('addTo')->willReturnSelf(); - $storeModel = $this->getMock('\Magento\Store\Model\Store', ['getId'], [], '', false); - $this->scopeConfig->expects($this->any())->method('getValue')->willReturn('owner_email@magento.com'); - $this->storeManager->expects($this->any())->method('getStore')->willReturn($storeModel); - $storeModel->expects($this->any())->method('getId')->willReturn(1); - $transport = $this->getMock('\Magento\Framework\Mail\TransportInterface'); - $this->transportBuilder->expects($this->any())->method('getTransport')->willReturn($transport); - $transport->expects($this->any())->method('sendMessage')->willReturnSelf(); - $inlineTranslation = $this->getMock('Magento\Framework\Translate\Inline\StateInterface'); - $inlineTranslation->expects($this->any())->method('resume')->willReturnSelf(); + $this->sendEmailCheck(); $this->resource->expects($this->atLeastOnce())->method('save')->willReturnSelf(); + $this->assertEquals(1, $this->subscriber->subscribe($email)); } + + public function testSubscribeNotLoggedIn() + { + $email = 'subscriber_email@magento.com'; + $this->resource->expects($this->any())->method('loadByEmail')->willReturn( + [ + 'subscriber_status' => 3, + 'subscriber_email' => $email, + 'name' => 'subscriber_name' + ] + ); + $this->scopeConfig->expects($this->any())->method('getValue')->willReturn(true); + $this->customerSession->expects($this->any())->method('isLoggedIn')->willReturn(false); + $customerDataModel = $this->getMock('\Magento\Customer\Api\Data\CustomerInterface'); + $this->customerSession->expects($this->any())->method('getCustomerDataObject')->willReturn($customerDataModel); + $this->customerSession->expects($this->any())->method('getCustomerId')->willReturn(1); + $customerDataModel->expects($this->any())->method('getEmail')->willReturn($email); + $this->customerRepository->expects($this->any())->method('getById')->willReturn($customerDataModel); + $customerDataModel->expects($this->any())->method('getStoreId')->willReturn(1); + $customerDataModel->expects($this->any())->method('getId')->willReturn(1); + $this->sendEmailCheck(); + $this->resource->expects($this->atLeastOnce())->method('save')->willReturnSelf(); + + $this->assertEquals(2, $this->subscriber->subscribe($email)); + } + + public function testUpdateSubscription() + { + $customerId = 1; + $customerDataMock = $this->getMockBuilder('\Magento\Customer\Api\Data\CustomerInterface') + ->getMock(); + $this->customerRepository->expects($this->atLeastOnce()) + ->method('getById') + ->with($customerId)->willReturn($customerDataMock); + $this->resource->expects($this->atLeastOnce()) + ->method('loadByCustomerData') + ->with($customerDataMock) + ->willReturn( + [ + 'subscriber_id' => 1, + 'subscriber_status' => 1 + ] + ); + $customerDataMock->expects($this->atLeastOnce())->method('getId')->willReturn('id'); + $this->resource->expects($this->atLeastOnce())->method('save')->willReturnSelf(); + $this->customerAccountManagement->expects($this->once()) + ->method('getConfirmationStatus') + ->with($customerId) + ->willReturn('account_confirmation_required'); + $customerDataMock->expects($this->once())->method('getStoreId')->willReturn('store_id'); + $customerDataMock->expects($this->once())->method('getEmail')->willReturn('email'); + + $this->assertEquals($this->subscriber, $this->subscriber->updateSubscription($customerId)); + } + + public function testUnsubscribeCustomerById() + { + $customerId = 1; + $customerDataMock = $this->getMockBuilder('\Magento\Customer\Api\Data\CustomerInterface') + ->getMock(); + $this->customerRepository->expects($this->atLeastOnce()) + ->method('getById') + ->with($customerId)->willReturn($customerDataMock); + $this->resource->expects($this->atLeastOnce()) + ->method('loadByCustomerData') + ->with($customerDataMock) + ->willReturn( + [ + 'subscriber_id' => 1, + 'subscriber_status' => 1 + ] + ); + $customerDataMock->expects($this->atLeastOnce())->method('getId')->willReturn('id'); + $this->resource->expects($this->atLeastOnce())->method('save')->willReturnSelf(); + $customerDataMock->expects($this->once())->method('getStoreId')->willReturn('store_id'); + $customerDataMock->expects($this->once())->method('getEmail')->willReturn('email'); + $this->sendEmailCheck(); + + $this->subscriber->unsubscribeCustomerById($customerId); + } + + public function testSubscribeCustomerById() + { + $customerId = 1; + $customerDataMock = $this->getMockBuilder('\Magento\Customer\Api\Data\CustomerInterface') + ->getMock(); + $this->customerRepository->expects($this->atLeastOnce()) + ->method('getById') + ->with($customerId)->willReturn($customerDataMock); + $this->resource->expects($this->atLeastOnce()) + ->method('loadByCustomerData') + ->with($customerDataMock) + ->willReturn( + [ + 'subscriber_id' => 1, + 'subscriber_status' => 3 + ] + ); + $customerDataMock->expects($this->atLeastOnce())->method('getId')->willReturn('id'); + $this->resource->expects($this->atLeastOnce())->method('save')->willReturnSelf(); + $customerDataMock->expects($this->once())->method('getStoreId')->willReturn('store_id'); + $customerDataMock->expects($this->once())->method('getEmail')->willReturn('email'); + $this->sendEmailCheck(); + + $this->subscriber->subscribeCustomerById($customerId); + } + + public function testUnsubscribe() + { + $this->resource->expects($this->once())->method('save')->willReturnSelf(); + $this->sendEmailCheck(); + + $this->assertEquals($this->subscriber, $this->subscriber->unsubscribe()); + } + + /** + * @expectedException \Magento\Framework\Exception\LocalizedException + * @expectedExceptionMessage This is an invalid subscription confirmation code. + */ + public function testUnsubscribeException() + { + $this->subscriber->setCode(111); + $this->subscriber->setCheckCode(222); + + $this->subscriber->unsubscribe(); + } + + public function testGetSubscriberFullName() + { + $this->subscriber->setCustomerFirstname('John'); + $this->subscriber->setCustomerLastname('Doe'); + + $this->assertEquals('John Doe', $this->subscriber->getSubscriberFullName()); + } + + public function testConfirm() + { + $code = 111; + $this->subscriber->setCode($code); + $this->resource->expects($this->once())->method('save')->willReturnSelf(); + + $this->assertTrue($this->subscriber->confirm($code)); + } + + public function testConfirmWrongCode() + { + $code = 111; + $this->subscriber->setCode(222); + + $this->assertFalse($this->subscriber->confirm($code)); + } + + public function testReceived() + { + $queue = $this->getMockBuilder('\Magento\Newsletter\Model\Queue') + ->disableOriginalConstructor() + ->getMock(); + $this->resource->expects($this->once())->method('received')->with($this->subscriber, $queue)->willReturnSelf(); + + $this->assertEquals($this->subscriber, $this->subscriber->received($queue)); + } + + protected function sendEmailCheck() + { + $storeModel = $this->getMockBuilder('\Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->setMethods(['getId']) + ->getMock(); + $transport = $this->getMock('\Magento\Framework\Mail\TransportInterface'); + $this->scopeConfig->expects($this->any())->method('getValue')->willReturn(true); + $this->transportBuilder->expects($this->once())->method('setTemplateIdentifier')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('setTemplateOptions')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('setTemplateVars')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('setFrom')->willReturnSelf(); + $this->transportBuilder->expects($this->once())->method('addTo')->willReturnSelf(); + $this->storeManager->expects($this->any())->method('getStore')->willReturn($storeModel); + $storeModel->expects($this->any())->method('getId')->willReturn(1); + $this->transportBuilder->expects($this->once())->method('getTransport')->willReturn($transport); + $transport->expects($this->once())->method('sendMessage')->willReturnSelf(); + $this->inlineTranslation->expects($this->once())->method('suspend')->willReturnSelf(); + $this->inlineTranslation->expects($this->once())->method('resume')->willReturnSelf(); + + return $this; + } } diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/TemplateTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/TemplateTest.php index 1b599897715f903b48a95b6432f14c96a74f3f4f..0bbd428237b19edb86a68947a8964696d138baa9 100644 --- a/app/code/Magento/Newsletter/Test/Unit/Model/TemplateTest.php +++ b/app/code/Magento/Newsletter/Test/Unit/Model/TemplateTest.php @@ -65,8 +65,8 @@ class TemplateTest extends \PHPUnit_Framework_TestCase ['_init'], [ $context, - $design, $registry, + $design, $appEmulation, $storeManager, $request, diff --git a/app/code/Magento/Newsletter/view/adminhtml/templates/template/edit.phtml b/app/code/Magento/Newsletter/view/adminhtml/templates/template/edit.phtml index 1f7fad5b10004259a0fb2d33d69baf0ca6b36bdc..e7700bf62f8551519a11c03032a8148392d449bb 100644 --- a/app/code/Magento/Newsletter/view/adminhtml/templates/template/edit.phtml +++ b/app/code/Magento/Newsletter/view/adminhtml/templates/template/edit.phtml @@ -126,7 +126,7 @@ require([ } if($F('code').blank() || $F('code')==templateControl.templateName) { - value = prompt('<?php echo __('Please enter new template name.') ?>', templateControl.templateName + '<?php echo __(' Copy') ?>'); + value = prompt('<?php echo __('Please enter a new template name.') ?>', templateControl.templateName + '<?php echo __(' Copy') ?>'); if(!value) { if(value !== null) { $('code').value = ''; @@ -174,7 +174,7 @@ require([ }, deleteTemplate: function() { - if(window.confirm("<?php echo __('Are you sure that you want to delete this template?') ?>")) { + if(window.confirm("<?php echo __('Are you sure you want to delete this template?') ?>")) { window.location.href = '<?php echo $block->getDeleteUrl() ?>'; } }, diff --git a/app/code/Magento/OfflinePayments/view/adminhtml/templates/info/purchaseorder.phtml b/app/code/Magento/OfflinePayments/view/adminhtml/templates/info/purchaseorder.phtml index 38ba36e0fe15b832850403b94da282ce4da1dac2..27497613b01f93653abf2f71d16d55be9db292f3 100644 --- a/app/code/Magento/OfflinePayments/view/adminhtml/templates/info/purchaseorder.phtml +++ b/app/code/Magento/OfflinePayments/view/adminhtml/templates/info/purchaseorder.phtml @@ -4,5 +4,10 @@ * See COPYING.txt for license details. */ ?> -<p><?php echo $block->escapeHtml($block->getMethod()->getTitle()) ?></p> -<p><?php echo __('Purchase Order Number: %1', $block->escapeHtml($block->getInfo()->getPoNumber())) ?></p> +<div class="order-payment-method-name"><?php echo $block->escapeHtml($block->getMethod()->getTitle()); ?></div> +<table class="data-table admin__table-secondary"> + <tr> + <th><?php echo $block->escapeHtml(__('Purchase Order Number')); ?>:</th> + <td><?php echo $block->escapeHtml($block->getInfo()->getPoNumber()); ?></td> + </tr> +</table> diff --git a/app/code/Magento/Payment/Model/Method/AbstractMethod.php b/app/code/Magento/Payment/Model/Method/AbstractMethod.php index 441547499d81b937367dc408fda83270171d32e4..69b8dcf74d20e9baca5a55ec4bff44df945f5be1 100644 --- a/app/code/Magento/Payment/Model/Method/AbstractMethod.php +++ b/app/code/Magento/Payment/Model/Method/AbstractMethod.php @@ -676,7 +676,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl public function void(\Magento\Payment\Model\InfoInterface $payment) { if (!$this->canVoid()) { - throw new \Magento\Framework\Exception\LocalizedException(__('Void action is not available.')); + throw new \Magento\Framework\Exception\LocalizedException(__('The void action is not available.')); } return $this; } diff --git a/app/code/Magento/Payment/Model/Method/Cc.php b/app/code/Magento/Payment/Model/Method/Cc.php index dd8bd650bc73b33a23a681a9ad2d4a41403562a3..9f84700d7dac8dedbc315a32e180b655aa4338cc 100644 --- a/app/code/Magento/Payment/Model/Method/Cc.php +++ b/app/code/Magento/Payment/Model/Method/Cc.php @@ -191,13 +191,13 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod $ccType = $ccNumAndTypeMatches ? $info->getCcType() : 'OT'; if (!$ccNumAndTypeMatches && !$this->otherCcType($info->getCcType())) { - $errorMsg = __('Credit card number mismatch with credit card type.'); + $errorMsg = __('The credit card number doesn\'t match the credit card type.'); } } else { $errorMsg = __('Invalid Credit Card Number'); } } else { - $errorMsg = __('Credit card type is not allowed for this payment method.'); + $errorMsg = __('This credit card type is not allowed for this payment method.'); } //validate credit card verification number @@ -210,7 +210,7 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod } if ($ccType != 'SS' && !$this->_validateExpDate($info->getCcExpYear(), $info->getCcExpMonth())) { - $errorMsg = __('We found an incorrect credit card expiration date.'); + $errorMsg = __('Please enter a valid credit card expiration date.'); } if ($errorMsg) { diff --git a/app/code/Magento/Payment/view/adminhtml/templates/info/default.phtml b/app/code/Magento/Payment/view/adminhtml/templates/info/default.phtml index b4538bd9f23f7bf3079c601a5c43288ca21c5456..b9540f98df28b19ba3fa79fc1b53c9712bf144eb 100644 --- a/app/code/Magento/Payment/view/adminhtml/templates/info/default.phtml +++ b/app/code/Magento/Payment/view/adminhtml/templates/info/default.phtml @@ -15,7 +15,7 @@ <?php echo $block->escapeHtml($block->getMethod()->getTitle()) ?> <?php if ($_specificInfo = $block->getSpecificInformation()):?> -<table class="data-table"> +<table class="data-table admin__table-secondary"> <?php foreach ($_specificInfo as $_label => $_value):?> <tr> <th><?php echo $block->escapeHtml($_label)?>:</th> diff --git a/app/code/Magento/Payment/view/adminhtml/templates/transparent/info.phtml b/app/code/Magento/Payment/view/adminhtml/templates/transparent/info.phtml index badfd92d13a478cb0c409eccb4f9f3af9210e150..6eccac93aca2e5c93c35167f630d0971cd7ab0d3 100644 --- a/app/code/Magento/Payment/view/adminhtml/templates/transparent/info.phtml +++ b/app/code/Magento/Payment/view/adminhtml/templates/transparent/info.phtml @@ -9,5 +9,5 @@ */ ?> <fieldset id="payment_form_<?php echo $block->getMethodCode() ?>" style="display:none" class="fieldset items redirect"> - <div><?php echo __('You\'ll be asked for your payment details before placing an order.') ?></div> + <div><?php echo __('We\'ll ask for your payment details before you place an order.') ?></div> </fieldset> diff --git a/app/code/Magento/Payment/view/frontend/templates/transparent/info.phtml b/app/code/Magento/Payment/view/frontend/templates/transparent/info.phtml index badfd92d13a478cb0c409eccb4f9f3af9210e150..6eccac93aca2e5c93c35167f630d0971cd7ab0d3 100644 --- a/app/code/Magento/Payment/view/frontend/templates/transparent/info.phtml +++ b/app/code/Magento/Payment/view/frontend/templates/transparent/info.phtml @@ -9,5 +9,5 @@ */ ?> <fieldset id="payment_form_<?php echo $block->getMethodCode() ?>" style="display:none" class="fieldset items redirect"> - <div><?php echo __('You\'ll be asked for your payment details before placing an order.') ?></div> + <div><?php echo __('We\'ll ask for your payment details before you place an order.') ?></div> </fieldset> diff --git a/app/code/Magento/Persistent/Model/Observer/PreventExpressCheckout.php b/app/code/Magento/Persistent/Model/Observer/PreventExpressCheckout.php index 6b2614c23a2f3be73ed5b3a4e60291c2614ec6dd..e6f0f3a7a745bae1bfeda28bc19e83e42bb9e9d3 100644 --- a/app/code/Magento/Persistent/Model/Observer/PreventExpressCheckout.php +++ b/app/code/Magento/Persistent/Model/Observer/PreventExpressCheckout.php @@ -79,7 +79,7 @@ class PreventExpressCheckout return; } - $this->messageManager->addNotice(__('To check out, please log in using your email address.')); + $this->messageManager->addNotice(__('To check out, please sign in using your email address.')); $customerBeforeAuthUrl = $this->_url->getUrl('persistent/index/expressCheckout'); $this->_expressRedirectHelper->redirectLogin($controllerAction, $customerBeforeAuthUrl); diff --git a/app/code/Magento/Persistent/etc/adminhtml/system.xml b/app/code/Magento/Persistent/etc/adminhtml/system.xml index 777373b142266898782503b60c14135bb015047a..6e04f0a06410bf5c37b349aa8d512351abe29e90 100644 --- a/app/code/Magento/Persistent/etc/adminhtml/system.xml +++ b/app/code/Magento/Persistent/etc/adminhtml/system.xml @@ -40,7 +40,7 @@ </depends> </field> <field id="logout_clear" translate="label" type="select" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="0"> - <label>Clear Persistence on Log Out</label> + <label>Clear Persistence on Sign Out</label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> <depends> <field id="enabled">1</field> diff --git a/app/code/Magento/Persistent/view/frontend/templates/remember_me.phtml b/app/code/Magento/Persistent/view/frontend/templates/remember_me.phtml index 0546274aaf16eba284e7aaeab390d739ddfe2e1d..24542d32a06ec98cbde201ab7eb3dd8f2719c995 100644 --- a/app/code/Magento/Persistent/view/frontend/templates/remember_me.phtml +++ b/app/code/Magento/Persistent/view/frontend/templates/remember_me.phtml @@ -21,7 +21,7 @@ <span class="tooltip wrapper"> <a class="link tooltip toggle" href="#"><?php echo __('What\'s this?') ?></a> <span class="tooltip content"> - <?php echo __('Check "Remember Me" to access your shopping cart on this computer when you are logged out')?> + <?php echo __('Check "Remember Me" to access your shopping cart on this computer even if you are not signed in.')?> </span> </span> </div> diff --git a/app/code/Magento/Persistent/view/frontend/web/template/remember-me.html b/app/code/Magento/Persistent/view/frontend/web/template/remember-me.html index 086ba1e3b1afecea5d2e0bd9a2e1f0fc7f8032ef..12ebb8ec864c9cc1b77b9b9831f1cc407c6aa2f0 100644 --- a/app/code/Magento/Persistent/view/frontend/web/template/remember-me.html +++ b/app/code/Magento/Persistent/view/frontend/web/template/remember-me.html @@ -10,7 +10,7 @@ <label for="persistent_remember_me" class="label"><span data-bind="text: $t('Remember Me')"></span></label> <span class="tooltip wrapper"> <a class="link tooltip toggle" href="#" data-bind="text: $t('What\'s this?')"></a> - <span class="tooltip content" data-bind="text: $t('Check \'Remember Me\' to access your shopping cart on this computer when you are logged out')"></span> + <span class="tooltip content" data-bind="text: $t('Check \'Remember Me\' to access your shopping cart on this computer even if you are not signed in.')"></span> </span> </div> <!-- /ko --> diff --git a/app/code/Magento/ProductAlert/Controller/Add/Price.php b/app/code/Magento/ProductAlert/Controller/Add/Price.php index 9e1a6d21fb27072e2ef43d70e4ddebb62368e82f..7ee60ebf79966894a1d6f86911ddeadfc00afa1b 100644 --- a/app/code/Magento/ProductAlert/Controller/Add/Price.php +++ b/app/code/Magento/ProductAlert/Controller/Add/Price.php @@ -98,7 +98,7 @@ class Price extends AddController } return $resultRedirect; } catch (\Exception $e) { - $this->messageManager->addException($e, __('Unable to update the alert subscription.')); + $this->messageManager->addException($e, __('We can\'t update the alert subscription right now.')); } $resultRedirect->setUrl($this->_redirect->getRedirectUrl()); return $resultRedirect; diff --git a/app/code/Magento/ProductAlert/Controller/Add/Stock.php b/app/code/Magento/ProductAlert/Controller/Add/Stock.php index c0a5ff8801c72b5cdcfabce50bd53d59c25182ba..ea0cb55cc15848258372be9acc726a42c0ab5101 100644 --- a/app/code/Magento/ProductAlert/Controller/Add/Stock.php +++ b/app/code/Magento/ProductAlert/Controller/Add/Stock.php @@ -67,7 +67,7 @@ class Stock extends AddController $resultRedirect->setUrl($backUrl); return $resultRedirect; } catch (\Exception $e) { - $this->messageManager->addException($e, __('Unable to update the alert subscription.')); + $this->messageManager->addException($e, __('We can\'t update the alert subscription right now.')); } $resultRedirect->setUrl($this->_redirect->getRedirectUrl()); return $resultRedirect; diff --git a/app/code/Magento/ProductAlert/Controller/Unsubscribe/Price.php b/app/code/Magento/ProductAlert/Controller/Unsubscribe/Price.php index 0f2c5334a099d667fd9ae696b1635d48de16b6cc..46ba80f4b3a55cf98baf0fecfaad40f92b2432b1 100644 --- a/app/code/Magento/ProductAlert/Controller/Unsubscribe/Price.php +++ b/app/code/Magento/ProductAlert/Controller/Unsubscribe/Price.php @@ -72,7 +72,7 @@ class Price extends UnsubscribeController $resultRedirect->setPath('customer/account/'); return $resultRedirect; } catch (\Exception $e) { - $this->messageManager->addException($e, __('Unable to update the alert subscription.')); + $this->messageManager->addException($e, __('We can\'t update the alert subscription right now.')); } $resultRedirect->setUrl($product->getProductUrl()); return $resultRedirect; diff --git a/app/code/Magento/ProductAlert/Controller/Unsubscribe/Stock.php b/app/code/Magento/ProductAlert/Controller/Unsubscribe/Stock.php index 703bb606f16878353249cafc2e9663cc2acc88bb..3052fcfe0abefb78c1138f0da0c5ea86d2607db1 100644 --- a/app/code/Magento/ProductAlert/Controller/Unsubscribe/Stock.php +++ b/app/code/Magento/ProductAlert/Controller/Unsubscribe/Stock.php @@ -70,7 +70,7 @@ class Stock extends UnsubscribeController $resultRedirect->setPath('customer/account/'); return $resultRedirect; } catch (\Exception $e) { - $this->messageManager->addException($e, __('Unable to update the alert subscription.')); + $this->messageManager->addException($e, __('We can\'t update the alert subscription right now.')); } $resultRedirect->setUrl($product->getProductUrl()); return $resultRedirect; diff --git a/app/code/Magento/ProductAlert/view/frontend/templates/email/price.phtml b/app/code/Magento/ProductAlert/view/frontend/templates/email/price.phtml index 19a060cd4c27d8e1dedd7d3dc6a1adb71e5b3050..f0e9c131837ff212a5380f47476cb08a55367a1a 100644 --- a/app/code/Magento/ProductAlert/view/frontend/templates/email/price.phtml +++ b/app/code/Magento/ProductAlert/view/frontend/templates/email/price.phtml @@ -9,7 +9,7 @@ /** @var $block \Magento\ProductAlert\Block\Email\Price */ ?> <?php if ($_products = $block->getProducts()): ?> -<p><?php echo __('You are receiving this notification because you subscribed to receive alerts when the prices for the following products changed:') ?></p> +<p><?php echo __('Price change alert! We wanted you to know that prices have changed for these products:') ?></p> <table> <?php /** @var $_product \Magento\Catalog\Model\Product */ ?> <?php foreach ($_products as $_product): ?> @@ -38,7 +38,7 @@ ); ?> </p> - <p><small><a href="<?php echo $block->getProductUnsubscribeUrl($_product->getId()) ?>"><?php echo __('Click here not to receive alerts for this product.') ?></a></small></p> + <p><small><a href="<?php echo $block->getProductUnsubscribeUrl($_product->getId()) ?>"><?php echo __('Click here to stop alerts for this product.') ?></a></small></p> </td> </tr> <?php endforeach; ?> diff --git a/app/code/Magento/ProductAlert/view/frontend/templates/email/stock.phtml b/app/code/Magento/ProductAlert/view/frontend/templates/email/stock.phtml index afe06fa6ed8fb50a05f7d2121285b3cabf03df8e..7c2a812b970e2fd40d40948024f27aa226835713 100644 --- a/app/code/Magento/ProductAlert/view/frontend/templates/email/stock.phtml +++ b/app/code/Magento/ProductAlert/view/frontend/templates/email/stock.phtml @@ -9,7 +9,7 @@ /** @var $block \Magento\ProductAlert\Block\Email\Stock */ ?> <?php if ($_products = $block->getProducts()): ?> -<p><?php echo __('You are receiving this notification because you subscribed to receive alerts when the following products are back in stock:') ?></p> +<p><?php echo __('In stock alert! We wanted you to know that these products are now available:') ?></p> <table> <?php foreach ($_products as $_product): ?> <tr> @@ -37,7 +37,7 @@ ); ?> </p> - <p><small><a href="<?php echo $block->getProductUnsubscribeUrl($_product->getId()) ?>"><?php echo __('Click here not to receive alerts for this product.') ?></a></small></p> + <p><small><a href="<?php echo $block->getProductUnsubscribeUrl($_product->getId()) ?>"><?php echo __('Click here to stop alerts for this product.') ?></a></small></p> </td> </tr> <?php endforeach; ?> diff --git a/app/code/Magento/Quote/Api/Data/EstimateAddressInterface.php b/app/code/Magento/Quote/Api/Data/EstimateAddressInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..5d5eb86351846141bfbd6c6bdca9ef58b6fa63bb --- /dev/null +++ b/app/code/Magento/Quote/Api/Data/EstimateAddressInterface.php @@ -0,0 +1,103 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Quote\Api\Data; + +/** + * Interface EstimateAddressInterface + * @api + */ +interface EstimateAddressInterface extends \Magento\Framework\Api\CustomAttributesDataInterface +{ + /**#@+ + * Constants defined for keys of array, makes typos less likely + */ + const KEY_COUNTRY_ID = 'country_id'; + + const KEY_REGION_ID = 'region_id'; + + const KEY_REGION = 'region'; + + const KEY_POSTCODE = 'postcode'; + + /**#@-*/ + + /** + * Get region name + * + * @return string + */ + public function getRegion(); + + /** + * Set region name + * + * @param string $region + * @return $this + */ + public function setRegion($region); + + /** + * Get region id + * + * @return int + */ + public function getRegionId(); + + /** + * Set region id + * + * @param int $regionId + * @return $this + */ + public function setRegionId($regionId); + + /** + * Get country id + * + * @return string + */ + public function getCountryId(); + + /** + * Set country id + * + * @param string $countryId + * @return $this + */ + public function setCountryId($countryId); + + /** + * Get postcode + * + * @return string + */ + public function getPostcode(); + + /** + * Set postcode + * + * @param string $postcode + * @return $this + */ + public function setPostcode($postcode); + + /** + * Retrieve existing extension attributes object or create a new one. + * + * @return \Magento\Quote\Api\Data\EstimateAddressExtensionInterface|null + */ + public function getExtensionAttributes(); + + /** + * Set an extension attributes object. + * + * @param \Magento\Quote\Api\Data\EstimateAddressExtensionInterface $extensionAttributes + * @return $this + */ + public function setExtensionAttributes( + \Magento\Quote\Api\Data\EstimateAddressExtensionInterface $extensionAttributes + ); +} diff --git a/app/code/Magento/Quote/Api/ShippingMethodManagementInterface.php b/app/code/Magento/Quote/Api/ShippingMethodManagementInterface.php index 51044998e15e0e20520f690e21bcb0fd51f581d5..e9edbf4241fd0fa6d0decfeacad347b10aa2c04a 100644 --- a/app/code/Magento/Quote/Api/ShippingMethodManagementInterface.php +++ b/app/code/Magento/Quote/Api/ShippingMethodManagementInterface.php @@ -26,6 +26,24 @@ interface ShippingMethodManagementInterface */ public function set($cartId, $carrierCode, $methodCode); + /** + * Estimate shipping + * + * @param int $cartId The shopping cart ID. + * @param \Magento\Quote\Api\Data\EstimateAddressInterface $address The estimate address + * @return \Magento\Quote\Api\Data\ShippingMethodInterface[] An array of shipping methods. + */ + public function estimateByAddress($cartId, \Magento\Quote\Api\Data\EstimateAddressInterface $address); + + /** + * Estimate shipping + * + * @param int $cartId The shopping cart ID. + * @param int $addressId The estimate address id + * @return \Magento\Quote\Api\Data\ShippingMethodInterface[] An array of shipping methods. + */ + public function estimateByAddressId($cartId, $addressId); + /** * Returns selected shipping method for a specified quote. * diff --git a/app/code/Magento/Quote/Model/EstimateAddress.php b/app/code/Magento/Quote/Model/EstimateAddress.php new file mode 100644 index 0000000000000000000000000000000000000000..652f8a00f685c9ac36752c1463dda9a5e9f592d4 --- /dev/null +++ b/app/code/Magento/Quote/Model/EstimateAddress.php @@ -0,0 +1,119 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Quote\Model; + +use Magento\Framework\Model\AbstractExtensibleModel; +use Magento\Quote\Api\Data\EstimateAddressInterface; + +class EstimateAddress extends AbstractExtensibleModel implements EstimateAddressInterface +{ + /** + * Get region name + * + * @return string + */ + public function getRegion() + { + return $this->getData(self::KEY_REGION); + } + + /** + * Set region name + * + * @param string $region + * @return $this + */ + public function setRegion($region) + { + return $this->setData(self::KEY_REGION, $region); + } + + /** + * Get region id + * + * @return int + */ + public function getRegionId() + { + return $this->getData(self::KEY_REGION_ID); + } + + /** + * Set region id + * + * @param int $regionId + * @return $this + */ + public function setRegionId($regionId) + { + return $this->setData(self::KEY_REGION_ID, $regionId); + } + + /** + * Get country id + * + * @return string + */ + public function getCountryId() + { + return $this->getData(self::KEY_COUNTRY_ID); + } + + /** + * Set country id + * + * @param string $countryId + * @return $this + */ + public function setCountryId($countryId) + { + return $this->setData(self::KEY_COUNTRY_ID, $countryId); + } + + /** + * Get postcode + * + * @return string + */ + public function getPostcode() + { + return $this->getData(self::KEY_POSTCODE); + } + + /** + * Set postcode + * + * @param string $postcode + * @return $this + */ + public function setPostcode($postcode) + { + return $this->setData(self::KEY_POSTCODE, $postcode); + } + + /** + * Retrieve existing extension attributes object or create a new one. + * + * @return \Magento\Quote\Api\Data\EstimateAddressExtensionInterface|null + */ + public function getExtensionAttributes() + { + return $this->_getExtensionAttributes(); + } + + /** + * Set an extension attributes object. + * + * @param \Magento\Quote\Api\Data\EstimateAddressExtensionInterface $extensionAttributes + * @return $this + */ + public function setExtensionAttributes( + \Magento\Quote\Api\Data\EstimateAddressExtensionInterface $extensionAttributes + ) { + $this->_setExtensionAttributes($extensionAttributes); + } +} diff --git a/app/code/Magento/Quote/Model/ShippingMethodManagement.php b/app/code/Magento/Quote/Model/ShippingMethodManagement.php index c1dc45aee4a479b3bfaa1f8671aadd57f9a8ad01..f8a39533b4233cf77b9365821857ca0e973ada0c 100644 --- a/app/code/Magento/Quote/Model/ShippingMethodManagement.php +++ b/app/code/Magento/Quote/Model/ShippingMethodManagement.php @@ -33,18 +33,29 @@ class ShippingMethodManagement implements ShippingMethodManagementInterface */ protected $converter; + /** + * Customer Address repository + * + * @var \Magento\Customer\Api\AddressRepositoryInterface + */ + protected $addressRepository; + /** * Constructs a shipping method read service object. * * @param QuoteRepository $quoteRepository Quote repository. * @param \Magento\Quote\Model\Cart\ShippingMethodConverter $converter Shipping method converter. + * @param \Magento\Customer\Api\AddressRepositoryInterface $addressRepository Customer Address repository + * */ public function __construct( QuoteRepository $quoteRepository, - Cart\ShippingMethodConverter $converter + Cart\ShippingMethodConverter $converter, + \Magento\Customer\Api\AddressRepositoryInterface $addressRepository ) { $this->quoteRepository = $quoteRepository; $this->converter = $converter; + $this->addressRepository = $addressRepository; } /** @@ -146,4 +157,78 @@ class ShippingMethodManagement implements ShippingMethodManagementInterface } return true; } + + /** + * {@inheritDoc} + */ + public function estimateByAddress($cartId, \Magento\Quote\Api\Data\EstimateAddressInterface $address) + { + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->quoteRepository->getActive($cartId); + + // no methods applicable for empty carts or carts with virtual products + if ($quote->isVirtual() || 0 == $quote->getItemsCount()) { + return []; + } + + return $this->getEstimatedRates( + $quote, + $address->getCountryId(), + $address->getPostcode(), + $address->getRegionId(), + $address->getRegion() + ); + } + + /** + * {@inheritDoc} + */ + public function estimateByAddressId($cartId, $addressId) + { + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->quoteRepository->getActive($cartId); + + // no methods applicable for empty carts or carts with virtual products + if ($quote->isVirtual() || 0 == $quote->getItemsCount()) { + return []; + } + $address = $this->addressRepository->getById($addressId); + + return $this->getEstimatedRates( + $quote, + $address->getCountryId(), + $address->getPostcode(), + $address->getRegionId(), + $address->getRegion() + ); + } + + /** + * Get estimated rates + * + * @param Quote $quote + * @param int $country + * @param string $postcode + * @param int $regionId + * @param string $region + * @return \Magento\Quote\Api\Data\ShippingMethodInterface[] An array of shipping methods. + */ + protected function getEstimatedRates(\Magento\Quote\Model\Quote $quote, $country, $postcode, $regionId, $region) + { + $output = []; + $shippingAddress = $quote->getShippingAddress(); + $shippingAddress->setCountryId($country); + $shippingAddress->setPostcode($postcode); + $shippingAddress->setRegionId($regionId); + $shippingAddress->setRegion($region); + $shippingAddress->setCollectShippingRates(true); + $shippingAddress->collectShippingRates(); + $shippingRates = $shippingAddress->getGroupedAllShippingRates(); + foreach ($shippingRates as $carrierRates) { + foreach ($carrierRates as $rate) { + $output[] = $this->converter->modelToDataObject($rate, $quote->getQuoteCurrencyCode()); + } + } + return $output; + } } diff --git a/app/code/Magento/Quote/etc/di.xml b/app/code/Magento/Quote/etc/di.xml index a9c14a1991ffbe85f900d457d5fb7c7193f554a8..66cae592e21018589902a907529cbcc87007c8e4 100644 --- a/app/code/Magento/Quote/etc/di.xml +++ b/app/code/Magento/Quote/etc/di.xml @@ -37,6 +37,7 @@ <preference for="Magento\Quote\Api\GuestBillingAddressManagementInterface" type="Magento\Quote\Model\GuestCart\GuestBillingAddressManagement" /> <preference for="Magento\Quote\Api\GuestAddressDetailsManagementInterface" type="Magento\Quote\Model\GuestCart\GuestAddressDetailsManagement" /> <preference for="Magento\Quote\Api\GuestCartTotalManagementInterface" type="\Magento\Quote\Model\GuestCart\GuestCartTotalManagement" /> + <preference for="Magento\Quote\Api\Data\EstimateAddressInterface" type="Magento\Quote\Model\EstimateAddress" /> <type name="Magento\Webapi\Controller\Rest\ParamsOverrider"> <arguments> <argument name="paramOverriders" xsi:type="array"> diff --git a/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php index 7c18123b5fa881d59ad91ce148ca94d2ed168e22..335952ca4de8b007e49860881a68faea0f09d3dc 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Filter; /** @@ -42,6 +40,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic * @param string $fieldId * @param bool $visibility * + * @codeCoverageIgnore * @return void */ public function setFieldVisibility($fieldId, $visibility) @@ -95,6 +94,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic * @param string $key * @param string $value * @return $this + * @codeCoverageIgnore */ public function addReportTypeOption($key, $value) { @@ -113,7 +113,13 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic /** @var \Magento\Framework\Data\Form $form */ $form = $this->_formFactory->create( - ['data' => ['id' => 'filter_form', 'action' => $actionUrl, 'method' => 'get']] + [ + 'data' => [ + 'id' => 'filter_form', + 'action' => $actionUrl, + 'method' => 'get' + ] + ] ); $htmlIdPrefix = 'sales_report_'; @@ -127,7 +133,11 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic $fieldset->addField( 'report_type', 'select', - ['name' => 'report_type', 'options' => $this->_reportTypeOptions, 'label' => __('Match Period To')] + [ + 'name' => 'report_type', + 'options' => $this->_reportTypeOptions, + 'label' => __('Date Used') + ] ); $fieldset->addField( diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid.php index 9fe1fa27a2c481ff73d35930f66aec1e5ea298e6..463339d2949ad37ca67bdb46c17ea109bb77ddb5 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml; /** @@ -81,7 +79,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid { $filter = $this->getParam($this->getVarNameFilter(), null); - if (is_null($filter)) { + if (null === $filter) { $filter = $this->_defaultFilter; } @@ -154,7 +152,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Get allowed stores * - * @return array + * @return array|\int[] */ protected function _getAllowedStoreIds() { @@ -205,7 +203,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid * Set visibility of store switcher * * @param bool $visible - * + * @codeCoverageIgnore * @return void */ public function setStoreSwitcherVisibility($visible = true) @@ -215,6 +213,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return visibility of store switcher + * @codeCoverageIgnore * * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) @@ -226,6 +225,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return store switcher html + * @codeCoverageIgnore * * @return string */ @@ -238,8 +238,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid * Set visibility of date filter * * @param bool $visible - * * @return void + * @codeCoverageIgnore */ public function setDateFilterVisibility($visible = true) { @@ -248,6 +248,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return visibility of date filter + * @codeCoverageIgnore * * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) @@ -259,6 +260,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return date filter html + * @codeCoverageIgnore * * @return string */ @@ -289,6 +291,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return refresh button html + * @codeCoverageIgnore * * @return string */ @@ -302,8 +305,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid * * @param string $name * @param string $value - * * @return void + * @codeCoverageIgnore */ public function setFilter($name, $value) { @@ -331,8 +334,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid * Set sub-report rows count * * @param int $size - * * @return void + * @codeCoverageIgnore */ public function setSubReportSize($size) { @@ -341,6 +344,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return sub-report rows count + * @codeCoverageIgnore * * @return int */ @@ -353,6 +357,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid * Retrieve errors * * @return array + * @codeCoverageIgnore */ public function getErrors() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php index 68b0b78bbbd23ea397af64e076ece23c9972025a..f169dd2c8e5dea332af923133738b55536462e34 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php @@ -71,6 +71,8 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended } /** + * Pseudo constructor + * * @return void */ protected function _construct() @@ -82,10 +84,14 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended if (isset($this->_columnGroupBy)) { $this->isColumnGrouped($this->_columnGroupBy, true); } - $this->setEmptyCellLabel(__('We couldn\'t find records for this period.')); + $this->setEmptyCellLabel(__('We can\'t find records for this period.')); } /** + * Get resource collection name + * + * @codeCoverageIgnore + * * @return string */ public function getResourceCollectionName() @@ -339,9 +345,11 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended } /** - * @param array $storeIds + * StoreIds setter * + * @param array $storeIds * @return $this + * @codeCoverageIgnore */ public function setStoreIds($storeIds) { @@ -396,6 +404,7 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended * @param \Magento\Framework\Object $filterData * @return $this * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * @codeCoverageIgnore */ protected function _addCustomFilter($collection, $filterData) { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid/Column/Renderer/Currency.php b/app/code/Magento/Reports/Block/Adminhtml/Grid/Column/Renderer/Currency.php index ac9cf8c700bd7efc13558d6fb0161388dd2de4e3..30555dbca8d2b14a12cff014d8e3da1b667a6591 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid/Column/Renderer/Currency.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid/Column/Renderer/Currency.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Grid\Column\Renderer; /** @@ -24,15 +22,15 @@ class Currency extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\Curren public function render(\Magento\Framework\Object $row) { $data = $row->getData($this->getColumn()->getIndex()); - $currency_code = $this->_getCurrencyCode($row); + $currencyCode = $this->_getCurrencyCode($row); - if (!$currency_code) { + if (!$currencyCode) { return $data; } $data = floatval($data) * $this->_getRate($row); $data = sprintf("%f", $data); - $data = $this->_localeCurrency->getCurrency($currency_code)->toCurrency($data); + $data = $this->_localeCurrency->getCurrency($currencyCode)->toCurrency($data); return $data; } } diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid/Shopcart.php b/app/code/Magento/Reports/Block/Adminhtml/Grid/Shopcart.php index 023f4f4bac729ed0fb6e44b7ffc123a595464b1a..0c635887cf0bc156ba384355eacf96de09ab76cd 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid/Shopcart.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid/Shopcart.php @@ -28,6 +28,7 @@ class Shopcart extends \Magento\Backend\Block\Widget\Grid\Extended /** * StoreIds setter + * @codeCoverageIgnore * * @param array $storeIds * @return $this diff --git a/app/code/Magento/Reports/Block/Adminhtml/Product.php b/app/code/Magento/Reports/Block/Adminhtml/Product.php index 9c5cad9fc76f8398a9cef6677f51183ee0d94e9d..4adc6dccbc09aa166b571c6e73e39ace1ed60187 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Product.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Product.php @@ -13,7 +13,7 @@ namespace Magento\Reports\Block\Adminhtml; class Product extends \Magento\Backend\Block\Widget\Grid\Container { /** - * @return void + * {@inheritdoc} */ protected function _construct() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers.php index d872439b7f8e6417d2ea613f868105c0764a20fb..32a25599702e9d312ac79160b5d0d5b8f38199ca 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Bestsellers extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Bestsellers extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers/Grid.php index d6820a811970fded00679f36d5ad6564ccae7e36..bedef6d74acceb8be7e61ef3d045faf17f1c98be 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Bestsellers/Grid.php @@ -14,12 +14,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Bestsellers; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -28,7 +31,8 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} + * @codeCoverageIgnore */ public function getResourceCollectionName() { @@ -36,7 +40,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} */ protected function _prepareColumns() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons.php index c14f1c248b15bdbd2c3ee8a859d9a3fe32c41c6d..cfd20f5e3a468e5948e746da801ddc2b8291db3d 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Coupons extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Coupons extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons/Grid.php index c04265b1c531f9c8eaef861a81eacdd8998afc84..cf79f4c06682831286c114354b47d1943008b5ed 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons/Grid.php @@ -14,12 +14,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Coupons; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -29,7 +32,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { @@ -41,7 +44,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function _prepareColumns() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Grid/Column/Renderer/Date.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Grid/Column/Renderer/Date.php index b18faf62ef5530eefda4516a5de9410c0277468a..30b6fccb13435e396ce06d6383768b301f0f399c 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Grid/Column/Renderer/Date.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Grid/Column/Renderer/Date.php @@ -13,6 +13,8 @@ use Magento\Framework\Locale\Bundle\DataBundle; class Date extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\Date { /** + * Constructor + * * @param \Magento\Backend\Block\Context $context * @param \Magento\Framework\Locale\ResolverInterface $localeResolver * @param array $data diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced.php index 3b6cf45846551dae90daad88e9d1b02f3e186793..e6de75fb9545e9723b5a02f1e87ee9f4cc434259 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Invoiced extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Invoiced extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php index 414c2e775872a1e9a36795e820c9b417533c1416..854520bafad351539f350b4f1c9369db8fdd0372 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Sales\Invoiced; /** @@ -17,12 +15,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Invoiced; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY condition + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -31,18 +32,17 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { - return $this->getFilterData()->getData( - 'report_type' - ) == - 'created_at_invoice' ? 'Magento\Sales\Model\Resource\Report\Invoiced\Collection\Invoiced' : 'Magento\Sales\Model\Resource\Report\Invoiced\Collection\Order'; + return ($this->getFilterData()->getData('report_type')) == 'created_at_invoice' + ? 'Magento\Sales\Model\Resource\Report\Invoiced\Collection\Invoiced' + : 'Magento\Sales\Model\Resource\Report\Invoiced\Collection\Order'; } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} */ protected function _prepareColumns() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded.php index 6ff26a3822b8a7f76f37ff4a046314317f538db0..c48dee92771a07839ef2e352350d0ed9a52f8446 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Refunded extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Refunded extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php index e5f68a315f74013a51de8df19dc74cfbc996efb5..c3964e9675cd7f4b67807df54e548cef34028d13 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Sales\Refunded; /** @@ -17,12 +15,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Refunded; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -31,18 +32,17 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { - return $this->getFilterData()->getData( - 'report_type' - ) == - 'created_at_refunded' ? 'Magento\Sales\Model\Resource\Report\Refunded\Collection\Refunded' : 'Magento\Sales\Model\Resource\Report\Refunded\Collection\Order'; + return $this->getFilterData()->getData('report_type') == 'created_at_refunded' + ? 'Magento\Sales\Model\Resource\Report\Refunded\Collection\Refunded' + : 'Magento\Sales\Model\Resource\Report\Refunded\Collection\Order'; } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} */ protected function _prepareColumns() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales.php index 6c6ca70730a2111e637426a159365a973a5be8e3..ad43f74e52646da9445d0d8a2c12500f3b761f8f 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Sales extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Sales extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php index 012e170b2c269dac90cdd6b43d1461edf4aa4ee4..6f7b99bb8941fe4cef1547a952e9e00583bfb9c0 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Sales\Sales; /** @@ -17,12 +15,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Sales; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -31,18 +32,18 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { - return $this->getFilterData()->getData( - 'report_type' - ) == - 'updated_at_order' ? 'Magento\Sales\Model\Resource\Report\Order\Updatedat\Collection' : 'Magento\Sales\Model\Resource\Report\Order\Collection'; + return $this->getFilterData()->getData('report_type') == 'updated_at_order' + ? 'Magento\Sales\Model\Resource\Report\Order\Updatedat\Collection' + : 'Magento\Sales\Model\Resource\Report\Order\Collection'; } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} + * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function _prepareColumns() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping.php index 0499c0ee07af14dbf113e5a4fc6aa388bdb4f04e..e72406788d3ec9a30fe366c536e7d68d80fb222d 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Shipping extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Shipping extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php index ee594aaa3447565990652114cee7ba498b1f3011..28d8bbe6b196fb55963f61797c95a09962960e50 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Sales\Shipping; /** @@ -17,12 +15,15 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Shipping; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * Group by criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -32,18 +33,17 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { - return $this->getFilterData()->getData( - 'report_type' - ) == - 'created_at_shipment' ? 'Magento\Sales\Model\Resource\Report\Shipping\Collection\Shipment' : 'Magento\Sales\Model\Resource\Report\Shipping\Collection\Order'; + return $this->getFilterData()->getData('report_type') == 'created_at_shipment' + ? 'Magento\Sales\Model\Resource\Report\Shipping\Collection\Shipment' + : 'Magento\Sales\Model\Resource\Report\Shipping\Collection\Order'; } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} */ protected function _prepareColumns() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax.php index 767760eabb655e8849f345c7db16503ce145432e..ed27f1616518c78751c902e7433f2c8a35b86511 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax.php @@ -13,12 +13,14 @@ namespace Magento\Reports\Block\Adminhtml\Sales; class Tax extends \Magento\Backend\Block\Widget\Grid\Container { /** + * Template file + * * @var string */ protected $_template = 'report/grid/container.phtml'; /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -35,6 +37,8 @@ class Tax extends \Magento\Backend\Block\Widget\Grid\Container } /** + * Get filter URL + * * @return string */ public function getFilterUrl() diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php index 48c3a647299b4b3cc76dde1dd63ed36a0e05f7a2..7196f1ff332533630ba0241383ffc6cd6a12e030 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml\Sales\Tax; /** @@ -17,16 +15,22 @@ namespace Magento\Reports\Block\Adminhtml\Sales\Tax; class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid { /** + * GROUP BY criteria + * * @var string */ protected $_columnGroupBy = 'period'; /** + * Config factory + * * @var \Magento\Sales\Model\Order\ConfigFactory */ protected $_configFactory; /** + * Constructor + * * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Backend\Helper\Data $backendHelper * @param \Magento\Reports\Model\Resource\Report\Collection\Factory $resourceFactory @@ -49,7 +53,8 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return void + * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { @@ -59,18 +64,17 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return string + * {@inheritdoc} */ public function getResourceCollectionName() { - return $this->getFilterData()->getData( - 'report_type' - ) == - 'updated_at_order' ? 'Magento\Tax\Model\Resource\Report\Updatedat\Collection' : 'Magento\Tax\Model\Resource\Report\Collection'; + return $this->getFilterData()->getData('report_type') == 'updated_at_order' + ? 'Magento\Tax\Model\Resource\Report\Updatedat\Collection' + : 'Magento\Tax\Model\Resource\Report\Collection'; } /** - * @return \Magento\Backend\Block\Widget\Grid\Extended + * {@inheritdoc} */ protected function _prepareColumns() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php b/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php index 690c98b4d692559de2d645c23623801f0ebe4705..df114f5e653e6b121874ab9aad21a71174abcb43 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Adminhtml; /** @@ -16,36 +14,8 @@ namespace Magento\Reports\Block\Adminhtml; class Wishlist extends \Magento\Backend\Block\Template { /** - * @var int - */ - public $wishlists_count; - - /** - * @var int - */ - public $items_bought; - - /** - * @var int - */ - public $shared_count; - - /** - * @var int - */ - public $referrals_count; - - /** - * @var int - */ - public $conversions_count; - - /** - * @var int - */ - public $customer_with_wishlist; - - /** + * Template file + * * @var string */ protected $_template = 'report/wishlist.phtml'; @@ -58,6 +28,8 @@ class Wishlist extends \Magento\Backend\Block\Template protected $_wishlistFactory; /** + * Constructor + * * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Reports\Model\Resource\Wishlist\CollectionFactory $wishlistFactory * @param array $data @@ -72,9 +44,9 @@ class Wishlist extends \Magento\Backend\Block\Template } /** - * @return $this + * {@inheritdoc} */ - public function _beforeToHtml() + protected function _beforeToHtml() { $this->setChild( 'grid', diff --git a/app/code/Magento/Reports/Block/Product/AbstractProduct.php b/app/code/Magento/Reports/Block/Product/AbstractProduct.php index dfe51eea66fed23301c4f8d4a0d9bdb6945e4d69..cf420b4d3cebeddc38077c1f3619ac4ae5fcf403 100644 --- a/app/code/Magento/Reports/Block/Product/AbstractProduct.php +++ b/app/code/Magento/Reports/Block/Product/AbstractProduct.php @@ -81,11 +81,11 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr } /** - * Retrieve Product Index model instance + * Public method for retrieve Product Index model * * @return \Magento\Reports\Model\Product\Index\AbstractIndex */ - protected function _getModel() + public function getModel() { try { $model = $this->_indexFactory->get($this->_indexType); @@ -96,16 +96,6 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr return $model; } - /** - * Public method for retrieve Product Index model - * - * @return \Magento\Reports\Model\Product\Index\AbstractIndex - */ - public function getModel() - { - return $this->_getModel(); - } - /** * Retrieve Index Product Collection * @@ -116,14 +106,14 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr if ($this->_collection === null) { $attributes = $this->_catalogConfig->getProductAttributes(); - $this->_collection = $this->_getModel()->getCollection()->addAttributeToSelect($attributes); + $this->_collection = $this->getModel()->getCollection()->addAttributeToSelect($attributes); if ($this->getCustomerId()) { $this->_collection->setCustomerId($this->getCustomerId()); } $this->_collection->excludeProductIds( - $this->_getModel()->getExcludeProductIds() + $this->getModel()->getExcludeProductIds() )->addUrlRewrite()->setPageSize( $this->getPageSize() )->setCurPage( @@ -152,7 +142,7 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr */ public function getCount() { - if (!$this->_getModel()->getCount()) { + if (!$this->getModel()->getCount()) { return 0; } return $this->getItemsCollection()->count(); diff --git a/app/code/Magento/Reports/Block/Product/Compared.php b/app/code/Magento/Reports/Block/Product/Compared.php index 6693d0053ea87edac053ff4e54bb3ada3de04152..67e3d641b829a4c8add0ba1df7fa85749c9f79f7 100644 --- a/app/code/Magento/Reports/Block/Product/Compared.php +++ b/app/code/Magento/Reports/Block/Product/Compared.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Product; /** @@ -15,6 +13,9 @@ namespace Magento\Reports\Block\Product; */ class Compared extends \Magento\Reports\Block\Product\AbstractProduct { + /** + * Config path for compared products count + */ const XML_PATH_RECENTLY_COMPARED_COUNT = 'catalog/recently_products/compared_count'; /** @@ -34,7 +35,10 @@ class Compared extends \Magento\Reports\Block\Product\AbstractProduct if ($this->hasData('page_size')) { return $this->getData('page_size'); } - return $this->_scopeConfig->getValue(self::XML_PATH_RECENTLY_COMPARED_COUNT, \Magento\Store\Model\ScopeInterface::SCOPE_STORE); + return $this->_scopeConfig->getValue( + self::XML_PATH_RECENTLY_COMPARED_COUNT, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ); } /** diff --git a/app/code/Magento/Reports/Block/Product/Viewed.php b/app/code/Magento/Reports/Block/Product/Viewed.php index 947c90c89505ce4e8957ff7870c13862da31f526..9a689ec5a6da59c758e9b85e01125a27f897089e 100644 --- a/app/code/Magento/Reports/Block/Product/Viewed.php +++ b/app/code/Magento/Reports/Block/Product/Viewed.php @@ -4,17 +4,20 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Product; +use \Magento\Framework\Object\IdentityInterface; + /** * Reports Recently Viewed Products Block * * @author Magento Core Team <core@magentocommerce.com> */ -class Viewed extends \Magento\Reports\Block\Product\AbstractProduct implements \Magento\Framework\Object\IdentityInterface +class Viewed extends AbstractProduct implements IdentityInterface { + /** + * Config path to recently viewed product count + */ const XML_PATH_RECENTLY_VIEWED_COUNT = 'catalog/recently_products/viewed_count'; /** @@ -34,7 +37,10 @@ class Viewed extends \Magento\Reports\Block\Product\AbstractProduct implements \ if ($this->hasData('page_size')) { return $this->getData('page_size'); } - return $this->_scopeConfig->getValue(self::XML_PATH_RECENTLY_VIEWED_COUNT, \Magento\Store\Model\ScopeInterface::SCOPE_STORE); + return $this->_scopeConfig->getValue( + self::XML_PATH_RECENTLY_VIEWED_COUNT, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ); } /** diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshLifetime.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshLifetime.php index 119375fb9ca5c12f9a23526249eec804d448c52f..35222afc53af688cd31d3c83078ad074bdc5d8ea 100644 --- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshLifetime.php +++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Statistics/RefreshLifetime.php @@ -21,7 +21,7 @@ class RefreshLifetime extends \Magento\Reports\Controller\Adminhtml\Report\Stati foreach ($collectionsNames as $collectionName) { $this->_objectManager->create($collectionName)->aggregate(); } - $this->messageManager->addSuccess(__('We updated lifetime statistics.')); + $this->messageManager->addSuccess(__('You refreshed lifetime statistics.')); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { diff --git a/app/code/Magento/Reports/Helper/Data.php b/app/code/Magento/Reports/Helper/Data.php index 50856d3b37cde36d9b1066dcc9aa5d608a004b9b..c33b0791a559ec899c8477972f803320245df473 100644 --- a/app/code/Magento/Reports/Helper/Data.php +++ b/app/code/Magento/Reports/Helper/Data.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - /** * Reports data helper */ @@ -23,16 +21,22 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper const REPORT_PERIOD_TYPE_YEAR = 'year'; /** + * Item factory + * * @var \Magento\Reports\Model\ItemFactory */ protected $_itemFactory; /** + * Constructor + * * @param \Magento\Framework\App\Helper\Context $context * @param \Magento\Reports\Model\ItemFactory $itemFactory */ - public function __construct(\Magento\Framework\App\Helper\Context $context, \Magento\Reports\Model\ItemFactory $itemFactory) - { + public function __construct( + \Magento\Framework\App\Helper\Context $context, + \Magento\Reports\Model\ItemFactory $itemFactory + ) { parent::__construct($context); $this->_itemFactory = $itemFactory; } @@ -55,7 +59,7 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper $dateStart = new \DateTime($from); $dateEnd = new \DateTime($to); - while ($dateStart->diff($dateEnd)->invert = 0) { + while ($dateStart->diff($dateEnd)->invert == 0) { switch ($period) { case self::REPORT_PERIOD_TYPE_DAY: $intervals[] = $dateStart->format('Y-m-d'); diff --git a/app/code/Magento/Reports/Model/Flag.php b/app/code/Magento/Reports/Model/Flag.php index d289a0ce35412498b963fb7ce3e3059591fcf7f5..3782a655f24862cbf5dee4291ed8ab0832a9fa3e 100644 --- a/app/code/Magento/Reports/Model/Flag.php +++ b/app/code/Magento/Reports/Model/Flag.php @@ -30,6 +30,7 @@ class Flag extends \Magento\Framework\Flag /** * Setter for flag code + * @codeCoverageIgnore * * @param string $code * @return $this diff --git a/app/code/Magento/Reports/Model/Grouped/Collection.php b/app/code/Magento/Reports/Model/Grouped/Collection.php index 6f8e9d561dad6cd65a5ea80b76e2a15465c1f50f..3f00e36c1a7a7ec4d78f975baaa33bd3bc3f747d 100644 --- a/app/code/Magento/Reports/Model/Grouped/Collection.php +++ b/app/code/Magento/Reports/Model/Grouped/Collection.php @@ -25,6 +25,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Set column to group by + * @codeCoverageIgnore * * @param string $column * @return $this @@ -61,6 +62,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Setter for resource collection + * @codeCoverageIgnore * * @param DbCollection $collection * @return $this diff --git a/app/code/Magento/Reports/Model/Item.php b/app/code/Magento/Reports/Model/Item.php index ecc9c805e91722136affdff251c4123ca873613c..01a60c397c5eab8bc83b6345979e1f982601ee9b 100644 --- a/app/code/Magento/Reports/Model/Item.php +++ b/app/code/Magento/Reports/Model/Item.php @@ -19,6 +19,7 @@ class Item extends \Magento\Framework\Object /** * Set is empty indicator + * @codeCoverageIgnore * * @param bool $flag * @return $this @@ -31,6 +32,7 @@ class Item extends \Magento\Framework\Object /** * Get is empty indicator + * @codeCoverageIgnore * * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) @@ -49,6 +51,7 @@ class Item extends \Magento\Framework\Object /** * Get children + * @codeCoverageIgnore * * @return array */ @@ -59,6 +62,7 @@ class Item extends \Magento\Framework\Object /** * Set children + * @codeCoverageIgnore * * @param array $children * @return $this diff --git a/app/code/Magento/Reports/Model/Resource/Event/Collection.php b/app/code/Magento/Reports/Model/Resource/Event/Collection.php index 7a515823998ef5c5787fbd9fdb1fd72f4f30ee00..94124028fdb3716c430e6c44bfdf3497786988b0 100644 --- a/app/code/Magento/Reports/Model/Resource/Event/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Event/Collection.php @@ -32,6 +32,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac /** * Add store ids filter + * @codeCoverageIgnore * * @param array $storeIds * @return $this diff --git a/app/code/Magento/Reports/Model/Resource/Order/Collection.php b/app/code/Magento/Reports/Model/Resource/Order/Collection.php index 60b24016381f63220ffc29feabe48525f12be626..07c2e2aa8c4a76d1d262f38904d52b00ea622f99 100644 --- a/app/code/Magento/Reports/Model/Resource/Order/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Order/Collection.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Model\Resource\Order; use Magento\Framework\DB\Select; @@ -40,26 +38,36 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection protected $_scopeConfig; /** + * Store manager instance + * * @var \Magento\Store\Model\StoreManagerInterface */ protected $_storeManager; /** + * Locale date instance + * * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface */ protected $_localeDate; /** + * Order config instance + * * @var \Magento\Sales\Model\Order\Config */ protected $_orderConfig; /** + * Reports order factory + * * @var \Magento\Sales\Model\Resource\Report\OrderFactory */ protected $_reportOrderFactory; /** + * Constructor + * * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy @@ -128,6 +136,7 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection * Retrieve is live flag for rep * * @return bool + * @codeCoverageIgnore */ public function isLive() { @@ -162,7 +171,7 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection */ protected function _getSalesAmountExpression() { - if (is_null($this->_salesAmountExpression)) { + if (null === $this->_salesAmountExpression) { $adapter = $this->getConnection(); $expressionTransferObject = new \Magento\Framework\Object( [ @@ -257,8 +266,8 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection * Prepare report summary from aggregated data * * @param string $range - * @param mixed $customStart - * @param mixed $customEnd + * @param string|null $customStart + * @param string|null $customEnd * @return $this */ protected function _prepareSummaryAggregated($range, $customStart, $customEnd) @@ -271,13 +280,13 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection $rangePeriod = $this->_getRangeExpressionForAttribute($range, 'main_table.period'); $tableName = $this->getConnection()->quoteIdentifier('main_table.period'); - $rangePeriod2 = str_replace($tableName, "MIN({$tableName})", $rangePeriod); + $rangePeriodAggregateStmt = str_replace($tableName, "MIN({$tableName})", $rangePeriod); $this->getSelect()->columns( [ 'revenue' => 'SUM(main_table.total_revenue_amount)', 'quantity' => 'SUM(main_table.orders_count)', - 'range' => $rangePeriod2, + 'range' => $rangePeriodAggregateStmt, ] )->order( 'range' @@ -349,8 +358,8 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection * * @param string $range * @param string $attribute - * @param mixed $from - * @param mixed $to + * @param string|null $from + * @param string|null $to * @return string */ protected function _getTZRangeOffsetExpression($range, $attribute, $from = null, $to = null) @@ -665,7 +674,7 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection /** * Set store filter collection * - * @param array $storeIds + * @param int[] $storeIds * @return $this */ public function setStoreIds($storeIds) @@ -778,16 +787,15 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection */ public function addSumAvgTotals($storeId = 0) { - $adapter = $this->getConnection(); - $baseSubtotalRefunded = $adapter->getIfNullSql('main_table.base_subtotal_refunded', 0); - $baseSubtotalCanceled = $adapter->getIfNullSql('main_table.base_subtotal_canceled', 0); - $baseDiscountCanceled = $adapter->getIfNullSql('main_table.base_discount_canceled', 0); - /** * calculate average and total amount */ - $expr = $storeId == - 0 ? "(main_table.base_subtotal -\n {$baseSubtotalRefunded} - {$baseSubtotalCanceled} - ABS(main_table.base_discount_amount) -\n {$baseDiscountCanceled}) * main_table.base_to_global_rate" : "main_table.base_subtotal - {$baseSubtotalCanceled} - {$baseSubtotalRefunded} -\n ABS(main_table.base_discount_amount) - {$baseDiscountCanceled}"; + $expr = $this->getTotalsExpression( + $storeId, + $this->getConnection()->getIfNullSql('main_table.base_subtotal_refunded', 0), + $this->getConnection()->getIfNullSql('main_table.base_subtotal_canceled', 0), + $this->getConnection()->getIfNullSql('main_table.base_discount_canceled', 0) + ); $this->getSelect()->columns( ['orders_avg_amount' => "AVG({$expr})"] @@ -798,6 +806,28 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection return $this; } + /** + * Get SQL expression for totals + * + * @param int $storeId + * @param string $baseSubtotalRefunded + * @param string $baseSubtotalCanceled + * @param string $baseDiscountCanceled + * @return string + */ + protected function getTotalsExpression( + $storeId, + $baseSubtotalRefunded, + $baseSubtotalCanceled, + $baseDiscountCanceled + ) { + $template = ($storeId != 0) + ? 'main_table.base_subtotal - %2$s - %1$s - ABS(main_table.base_discount_amount) - %3$s' + : '(main_table.base_subtotal - %1$s - %2$s - ABS(main_table.base_discount_amount) - %3$s) ' + . ' * main_table.base_to_global_rate'; + return sprintf($template, $baseSubtotalRefunded, $baseSubtotalCanceled, $baseDiscountCanceled); + } + /** * Sort order by total amount * @@ -869,6 +899,7 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection * Initialize initial fields to select * * @return $this + * @codeCoverageIgnore */ protected function _initInitialFieldsToSelect() { diff --git a/app/code/Magento/Reports/Model/Resource/Product/Collection.php b/app/code/Magento/Reports/Model/Resource/Product/Collection.php index 3eb9ac629a26e8fdcd075618a98ea3c26357ce1a..7df4b5dc4d9d0bc3616cb6221d4609ad158f8f40 100644 --- a/app/code/Magento/Reports/Model/Resource/Product/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Product/Collection.php @@ -147,8 +147,8 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Set Type for COUNT SQL Select + * @codeCoverageIgnore * - * @codeCoverageIgnoreStart * @param int $type * @return $this */ @@ -160,6 +160,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Set product entity id + * @codeCoverageIgnore * * @param string $entityId * @return $this @@ -172,6 +173,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Get product entity id + * @codeCoverageIgnore * * @return int */ @@ -182,6 +184,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Set product entity table name + * @codeCoverageIgnore * * @param string $value * @return $this @@ -194,6 +197,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Get product entity table name + * @codeCoverageIgnore * * @return string */ @@ -204,6 +208,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Get product attribute set id + * @codeCoverageIgnore * * @return int */ @@ -214,6 +219,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection /** * Set product attribute set id + * @codeCoverageIgnore * * @param int $value * @return $this @@ -223,7 +229,6 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection $this->_productEntityAttributeSetId = $value; return $this; } - //@codeCoverageIgnoreEnd /** * Join fields diff --git a/app/code/Magento/Reports/Model/Resource/Product/Index/AbstractIndex.php b/app/code/Magento/Reports/Model/Resource/Product/Index/AbstractIndex.php index 52d72406cb130d56d6a11e75ed1d68e139268287..45b1c2c5e9d51e3bbb6a0633c821187f731434df 100644 --- a/app/code/Magento/Reports/Model/Resource/Product/Index/AbstractIndex.php +++ b/app/code/Magento/Reports/Model/Resource/Product/Index/AbstractIndex.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Model\Resource\Product\Index; /** @@ -14,16 +12,22 @@ namespace Magento\Reports\Model\Resource\Product\Index; abstract class AbstractIndex extends \Magento\Framework\Model\Resource\Db\AbstractDb { /** + * DateItime instance + * * @var \Magento\Framework\Stdlib\DateTime */ protected $dateTime; /** + * Reports helper + * * @var \Magento\Reports\Model\Resource\Helper */ protected $_resourceHelper; /** + * Constructor + * * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Magento\Reports\Model\Resource\Helper $resourceHelper * @param \Magento\Framework\Stdlib\DateTime $dateTime @@ -55,7 +59,9 @@ abstract class AbstractIndex extends \Magento\Framework\Model\Resource\Db\Abstra return $this; } $adapter = $this->_getWriteAdapter(); - $select = $adapter->select()->from($this->getMainTable())->where('visitor_id = ?', $object->getVisitorId()); + $select = $adapter->select() + ->from($this->getMainTable()) + ->where('visitor_id = ?', $object->getVisitorId()); $rowSet = $select->query()->fetchAll(); foreach ($rowSet as $row) { @@ -76,7 +82,7 @@ abstract class AbstractIndex extends \Magento\Framework\Model\Resource\Db\Abstra if ($idx) { /** - * If we are here it means that we have two rows: one with known customer, but second just visitor is set + * If we are here it means that we have two rows: one with known customer and second with guest visitor * One row should be updated with customer_id, second should be deleted */ $adapter->delete($this->getMainTable(), ['index_id = ?' => $row['index_id']]); @@ -192,7 +198,7 @@ abstract class AbstractIndex extends \Magento\Framework\Model\Resource\Db\Abstra * Add information about product ids to visitor/customer * * @param \Magento\Framework\Object|\Magento\Reports\Model\Product\Index\AbstractIndex $object - * @param array $productIds + * @param int[] $productIds * @return $this */ public function registerIds(\Magento\Framework\Object $object, $productIds) diff --git a/app/code/Magento/Reports/Model/Resource/Product/Index/Collection/AbstractCollection.php b/app/code/Magento/Reports/Model/Resource/Product/Index/Collection/AbstractCollection.php index b172b4e053c274e51f42417e56f381343b2abb9d..77ea700b2cc00c843a8df396649870d0e9009b67 100644 --- a/app/code/Magento/Reports/Model/Resource/Product/Index/Collection/AbstractCollection.php +++ b/app/code/Magento/Reports/Model/Resource/Product/Index/Collection/AbstractCollection.php @@ -179,6 +179,7 @@ abstract class AbstractCollection extends \Magento\Catalog\Model\Resource\Produc /** * Set customer id, that will be used in 'whereCondition' + * @codeCoverageIgnore * * @param int $id * @return $this diff --git a/app/code/Magento/Reports/Model/Resource/Product/Index/Viewed.php b/app/code/Magento/Reports/Model/Resource/Product/Index/Viewed.php index 0ad3ffd330f063475affcd8cb56e36a9e5b4b7b8..93a22cf0011189fb11b3306525879f4f7b4685a1 100644 --- a/app/code/Magento/Reports/Model/Resource/Product/Index/Viewed.php +++ b/app/code/Magento/Reports/Model/Resource/Product/Index/Viewed.php @@ -17,6 +17,7 @@ class Viewed extends \Magento\Reports\Model\Resource\Product\Index\AbstractIndex * Initialize connection and main resource table * * @return void + * @codeCoverageIgnore */ protected function _construct() { diff --git a/app/code/Magento/Reports/Model/Resource/Report/AbstractReport.php b/app/code/Magento/Reports/Model/Resource/Report/AbstractReport.php index 84a6d7d6a25efac94bd4ff2f7f3935a5c2ee70c1..777d13232b2a349e64b58ff63cd0b382012232a6 100644 --- a/app/code/Magento/Reports/Model/Resource/Report/AbstractReport.php +++ b/app/code/Magento/Reports/Model/Resource/Report/AbstractReport.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Model\Resource\Report; /** @@ -22,21 +20,29 @@ abstract class AbstractReport extends \Magento\Framework\Model\Resource\Db\Abstr protected $_flag = null; /** + * Logger instance + * * @var \Psr\Log\LoggerInterface */ protected $_logger; /** + * Locale date instance + * * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface */ protected $_localeDate; /** + * Reports flag factory + * * @var \Magento\Reports\Model\FlagFactory */ protected $_reportsFlagFactory; /** + * Constructor + * * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate @@ -179,7 +185,7 @@ abstract class AbstractReport extends \Magento\Framework\Model\Resource\Db\Abstr * @param string $whereColumn * @param null|string|\DateTime $from * @param null|string|\DateTime $to - * @param array $additionalWhere + * @param [][] $additionalWhere * @param string $alias * @return \Magento\Framework\DB\Select */ @@ -281,12 +287,12 @@ abstract class AbstractReport extends \Magento\Framework\Model\Resource\Db\Abstr * * @param string $table * @param string $relatedTable - * @param array $joinCondition + * @param [] $joinCondition * @param string $column * @param string $whereColumn * @param string|null $from * @param string|null $to - * @param array $additionalWhere + * @param [][] $additionalWhere * @param string $alias * @param string $relatedAlias * @return \Magento\Framework\DB\Select @@ -353,7 +359,7 @@ abstract class AbstractReport extends \Magento\Framework\Model\Resource\Db\Abstr /** * Retrieve query for attribute with timezone conversion * - * @param string|array $table + * @param string|[] $table * @param string $column * @param null|mixed $from * @param null|mixed $to diff --git a/app/code/Magento/Reports/Model/Resource/Report/Collection.php b/app/code/Magento/Reports/Model/Resource/Report/Collection.php index 2de5f389f25247113bbb141ddfc84486d8ab7bd6..abc6db15ad0380ba97d6d0efc337961c4b775f65 100644 --- a/app/code/Magento/Reports/Model/Resource/Report/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Report/Collection.php @@ -96,6 +96,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Set period + * @codeCoverageIgnore * * @param int $period * @return $this @@ -108,6 +109,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Set interval + * @codeCoverageIgnore * * @param \DateTime $fromDate * @param \DateTime $toDate @@ -260,6 +262,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Set store ids + * @codeCoverageIgnore * * @param array $storeIds * @return $this @@ -272,6 +275,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Get store ids + * @codeCoverageIgnore * * @return array */ @@ -292,6 +296,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Set page size + * @codeCoverageIgnore * * @param int $size * @return $this @@ -304,6 +309,7 @@ class Collection extends \Magento\Framework\Data\Collection /** * Get page size + * @codeCoverageIgnore * * @return int */ diff --git a/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php b/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php index 234d520b32b126a6641fb8288b09c2e990fe19de..4575ec6394c844f38d4d871042095f612de90e9e 100644 --- a/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php +++ b/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php @@ -64,6 +64,7 @@ class AbstractCollection extends \Magento\Framework\Model\Resource\Db\Collection /** * Set array of columns that should be aggregated + * @codeCoverageIgnore * * @param array $columns * @return $this @@ -76,6 +77,7 @@ class AbstractCollection extends \Magento\Framework\Model\Resource\Db\Collection /** * Retrieve array of columns that should be aggregated + * @codeCoverageIgnore * * @return array */ @@ -86,6 +88,7 @@ class AbstractCollection extends \Magento\Framework\Model\Resource\Db\Collection /** * Set date range + * @codeCoverageIgnore * * @param mixed $from * @param mixed $to @@ -100,6 +103,7 @@ class AbstractCollection extends \Magento\Framework\Model\Resource\Db\Collection /** * Set period + * @codeCoverageIgnore * * @param string $period * @return $this @@ -218,6 +222,7 @@ class AbstractCollection extends \Magento\Framework\Model\Resource\Db\Collection /** * Setter for isSubTotals + * @codeCoverageIgnore * * @param bool $flag * @return $this diff --git a/app/code/Magento/Reports/Model/Resource/Report/Product/Viewed.php b/app/code/Magento/Reports/Model/Resource/Report/Product/Viewed.php index 56e658e56db51f51339f45c7d28785fe9281dd62..432ebc9b5d432e6f4653e1789e280a6a0a595c4f 100644 --- a/app/code/Magento/Reports/Model/Resource/Report/Product/Viewed.php +++ b/app/code/Magento/Reports/Model/Resource/Report/Product/Viewed.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - /** * Most viewed product report aggregate resource model * @@ -31,16 +29,22 @@ class Viewed extends \Magento\Sales\Model\Resource\Report\AbstractReport const AGGREGATION_YEARLY = 'report_viewed_product_aggregated_yearly'; /** + * Product resource instance + * * @var \Magento\Catalog\Model\Resource\Product */ protected $_productResource; /** + * Resource helper instance + * * @var \Magento\Reports\Model\Resource\Helper */ protected $_resourceHelper; /** + * Constructor + * * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate diff --git a/app/code/Magento/Reports/Model/Resource/Wishlist/Collection.php b/app/code/Magento/Reports/Model/Resource/Wishlist/Collection.php index 797b20da8555176e603785c511672062d90830ac..ab98d411ca05510003c9c9e4fc1cf7e8e2d7bfa7 100644 --- a/app/code/Magento/Reports/Model/Resource/Wishlist/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Wishlist/Collection.php @@ -60,6 +60,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac /** * Set wishlist table name + * @codeCoverageIgnore * * @param string $value * @return $this @@ -72,6 +73,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac /** * Retrieve wishlist table name + * @codeCoverageIgnore * * @return string */ diff --git a/app/code/Magento/Reports/Setup/InstallData.php b/app/code/Magento/Reports/Setup/InstallData.php index 071ed7c29645029f880b7af63cb0950259590f98..fef292ffb21a02c04131a4a1cd209555951f1496 100644 --- a/app/code/Magento/Reports/Setup/InstallData.php +++ b/app/code/Magento/Reports/Setup/InstallData.php @@ -7,8 +7,6 @@ namespace Magento\Reports\Setup; -// @codingStandardsIgnoreFile - use Magento\Cms\Model\PageFactory; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; @@ -82,11 +80,13 @@ class InstallData implements \Magento\Framework\Setup\InstallDataInterface $cms = $this->pageFactory->create(); $cms->load('home', 'identifier'); + // @codingStandardsIgnoreStart $reportLayoutUpdate = '<!-- <referenceContainer name="right"> <action method="unsetChild"><argument name="alias" xsi:type="string">right.reports.product.viewed</argument></action> <action method="unsetChild"><argument name="alias" xsi:type="string">right.reports.product.compared</argument></action> </referenceContainer>-->'; + // @codingStandardsIgnoreEnd /* * Merge and save old layout update data with report layout data diff --git a/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php b/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php new file mode 100644 index 0000000000000000000000000000000000000000..81eb87c4cac8a1532b08a48e109af0a6c42327fd --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php @@ -0,0 +1,147 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Helper; + +use Magento\Reports\Helper\Data; + +class DataTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Helper\Data + */ + protected $data; + + /** + * @var \Magento\Framework\App\Helper\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $contextMock; + + /** + * @var \Magento\Reports\Model\ItemFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $itemFactoryMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->contextMock = $this->getMockBuilder('Magento\Framework\App\Helper\Context') + ->disableOriginalConstructor() + ->getMock(); + $this->itemFactoryMock = $this->getMockBuilder('Magento\Reports\Model\ItemFactory') + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + + $this->data = new Data( + $this->contextMock, + $this->itemFactoryMock + ); + } + + /** + * @param string $from + * @param string $to + * @param string $period + * @param array $results + * @dataProvider intervalsDataProvider + * @return void + */ + public function testGetIntervals($from, $to, $period, $results) + { + $this->assertEquals($this->data->getIntervals($from, $to, $period), $results); + } + + /** + * @param string $from + * @param string $to + * @param string $period + * @param array $results + * @dataProvider intervalsDataProvider + * @return void + */ + public function testPrepareIntervalsCollection($from, $to, $period, $results) + { + $collection = $this->getMockBuilder('Magento\Framework\Data\Collection') + ->disableOriginalConstructor() + ->setMethods(['addItem']) + ->getMock(); + + $item = $this->getMockBuilder('Magento\Reports\Model\Item') + ->disableOriginalConstructor() + ->setMethods(['setPeriod', 'setIsEmpty']) + ->getMock(); + + $this->itemFactoryMock->expects($this->exactly(count($results))) + ->method('create') + ->willReturn($item); + $item->expects($this->exactly(count($results))) + ->method('setIsEmpty'); + $collection->expects($this->exactly(count($results))) + ->method('addItem'); + + foreach ($results as $key => $result) { + $item->expects($this->at($key + $key)) + ->method('setPeriod') + ->with($result); + } + + $this->data->prepareIntervalsCollection($collection, $from, $to, $period); + } + + /** + * @return array + */ + public function intervalsDataProvider() + { + return [ + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2000-01-15 11:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_DAY, + 'results' => ['2000-01-15'] + ], + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2000-01-17 10:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_MONTH, + 'results' => ['2000-01'] + ], + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2000-02-15 10:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_YEAR, + 'results' => ['2000'] + ], + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2000-01-16 11:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_DAY, + 'results' => ['2000-01-15', '2000-01-16'] + ], + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2000-02-17 10:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_MONTH, + 'results' => ['2000-01', '2000-02'] + ], + [ + 'from' => '2000-01-15 10:00:00', + 'to' => '2003-02-15 10:00:00', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_YEAR, + 'results' => ['2000', '2001', '2002', '2003'] + ], + [ + 'from' => '', + 'to' => '', + 'period' => \Magento\Reports\Helper\Data::REPORT_PERIOD_TYPE_YEAR, + 'results' => [] + ] + ]; + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Event/ObserverTest.php b/app/code/Magento/Reports/Test/Unit/Model/Event/ObserverTest.php index ba4dc5396b30df834f76dba8b40183af149af079..7e53522ac6680d17587318727bf538a6bebbdd0e 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Event/ObserverTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Event/ObserverTest.php @@ -47,6 +47,14 @@ class ObserverTest extends \PHPUnit_Framework_TestCase */ protected $productCompModelMock; + /** + * @var \Magento\Reports\Model\Product\Index\ViewedFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $productIndexFactoryMock; + + /** + * {@inheritDoc} + */ public function setUp() { $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -56,13 +64,13 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $this->customerVisitorMock = $this->getMockBuilder('Magento\Customer\Model\Visitor') ->disableOriginalConstructor()->getMock(); - $productIndexFactoryMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\ViewedFactory') + $this->productIndexFactoryMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\ViewedFactory') ->setMethods(['create']) ->disableOriginalConstructor()->getMock(); $this->productIndexMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\Viewed') ->disableOriginalConstructor()->getMock(); - $productIndexFactoryMock->expects($this->any()) + $this->productIndexFactoryMock->expects($this->any()) ->method('create') ->willReturn($this->productIndexMock); @@ -84,20 +92,25 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $storeManager->expects($this->any()) ->method('getStore') ->willReturn($this->storeMock); - $this->productCompFactoryMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\ComparedFactory') + + $this->productCompModelMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\Compared') ->disableOriginalConstructor() - ->setMethods(['create']) ->getMock(); - $this->productCompModelMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\Compared') + + $this->productCompFactoryMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\ComparedFactory') ->disableOriginalConstructor() + ->setMethods(['create']) ->getMock(); + $this->productCompFactoryMock->expects($this->any()) + ->method('create') + ->willReturn($this->productCompModelMock); $this->observer = $objectManager->getObject( 'Magento\Reports\Model\Event\Observer', [ 'customerSession' => $this->customerSessionMock, 'customerVisitor' => $this->customerVisitorMock, - 'productIndxFactory' => $productIndexFactoryMock, + 'productIndxFactory' => $this->productIndexFactoryMock, 'productCompFactory' => $this->productCompFactoryMock, 'storeManager' => $storeManager, 'event' => $reportEventFactory @@ -105,6 +118,9 @@ class ObserverTest extends \PHPUnit_Framework_TestCase ); } + /** + * @return void + */ public function testCatalogProductViewCustomer() { $productId = 5; @@ -123,17 +139,10 @@ class ObserverTest extends \PHPUnit_Framework_TestCase 'store_id' => $storeId, ]; - $this->storeMock->expects($this->any()) - ->method('getId') - ->willReturn($storeId); - - $this->customerSessionMock->expects($this->any()) - ->method('isLoggedIn') - ->willReturn(true); + $this->storeMock->expects($this->any())->method('getId')->willReturn($storeId); - $this->customerSessionMock->expects($this->any()) - ->method('getCustomerId') - ->willReturn($customerId); + $this->customerSessionMock->expects($this->any())->method('isLoggedIn')->willReturn(true); + $this->customerSessionMock->expects($this->any())->method('getCustomerId')->willReturn($customerId); $this->prepareProductIndexMock($expectedViewedData); $this->prepareReportEventModel($expectedEventData); @@ -141,6 +150,9 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $this->observer->catalogProductView($eventObserver); } + /** + * @return void + */ public function testCatalogProductViewVisitor() { $productId = 6; @@ -159,17 +171,11 @@ class ObserverTest extends \PHPUnit_Framework_TestCase 'store_id' => $storeId, ]; - $this->storeMock->expects($this->any()) - ->method('getId') - ->willReturn($storeId); + $this->storeMock->expects($this->any())->method('getId')->willReturn($storeId); - $this->customerSessionMock->expects($this->any()) - ->method('isLoggedIn') - ->willReturn(false); + $this->customerSessionMock->expects($this->any())->method('isLoggedIn')->willReturn(false); - $this->customerVisitorMock->expects($this->any()) - ->method('getId') - ->willReturn($visitorId); + $this->customerVisitorMock->expects($this->any())->method('getId')->willReturn($visitorId); $this->prepareProductIndexMock($expectedViewedData); $this->prepareReportEventModel($expectedEventData); @@ -182,6 +188,7 @@ class ObserverTest extends \PHPUnit_Framework_TestCase * @param string $userKey * @param int $userId * @dataProvider catalogProductCompareAddProductDataProvider + * @return void */ public function testCatalogProductCompareAddProduct($isLoggedIn, $userKey, $userId) { @@ -193,31 +200,84 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $userKey => $userId ]; $observerMock = $this->getObserverMock($productId); - $this->customerSessionMock->expects($this->any()) - ->method('isLoggedIn') - ->willReturn($isLoggedIn); - $this->customerSessionMock->expects($this->any()) - ->method('getCustomerId') - ->willReturn($customerId); - $this->customerVisitorMock->expects($this->any()) - ->method('getId') - ->willReturn($visitorId); - $this->productCompFactoryMock->expects($this->any()) - ->method('create') - ->willReturn($this->productCompModelMock); - $this->productCompModelMock->expects($this->any()) - ->method('setData') - ->with($viewData) - ->willReturnSelf(); - $this->productCompModelMock->expects($this->any()) - ->method('save') - ->willReturnSelf(); - $this->productCompModelMock->expects($this->any()) - ->method('calculate') - ->willReturnSelf(); + + $this->customerSessionMock->expects($this->any())->method('isLoggedIn')->willReturn($isLoggedIn); + $this->customerSessionMock->expects($this->any())->method('getCustomerId')->willReturn($customerId); + + $this->customerVisitorMock->expects($this->any())->method('getId')->willReturn($visitorId); + + $this->productCompModelMock->expects($this->any())->method('setData')->with($viewData)->willReturnSelf(); + $this->productCompModelMock->expects($this->any())->method('save')->willReturnSelf(); + $this->productCompModelMock->expects($this->any())->method('calculate')->willReturnSelf(); + $this->assertEquals($this->observer, $this->observer->catalogProductCompareAddProduct($observerMock)); } + /** + * @return void + */ + public function testCustomerLoginLoggedInTrue() + { + $customerId = 222; + $visitorId = 333; + $observerMock = $this->getObserverMock(111); + + $this->customerSessionMock->expects($this->once())->method('isLoggedIn')->willReturn(true); + $this->customerSessionMock->expects($this->once())->method('getCustomerId')->willReturn($customerId); + + $this->customerVisitorMock->expects($this->once())->method('getId')->willReturn($visitorId); + + $this->reportEventMock->expects($this->once())->method('updateCustomerType')->with($visitorId, $customerId); + + $this->productCompModelMock->expects($this->once())->method('updateCustomerFromVisitor')->willReturnSelf(); + $this->productCompModelMock->expects($this->once())->method('calculate')->willReturnSelf(); + + $this->productIndexMock->expects($this->once())->method('updateCustomerFromVisitor')->willReturnSelf(); + $this->productIndexMock->expects($this->once())->method('calculate')->willReturnSelf(); + + $this->assertEquals($this->observer, $this->observer->customerLogin($observerMock)); + } + + /** + * @return void + */ + public function testCustomerLoginLoggedInFalse() + { + $observerMock = $this->getObserverMock(111); + + $this->customerSessionMock->expects($this->once())->method('isLoggedIn')->willReturn(false); + $this->customerSessionMock->expects($this->never())->method('getCustomerId'); + + $this->customerVisitorMock->expects($this->never())->method('getId'); + + $this->productCompModelMock->expects($this->never())->method('updateCustomerFromVisitor')->willReturnSelf(); + $this->productCompModelMock->expects($this->never())->method('calculate')->willReturnSelf(); + + $this->productIndexMock->expects($this->never())->method('updateCustomerFromVisitor')->willReturnSelf(); + $this->productIndexMock->expects($this->never())->method('calculate')->willReturnSelf(); + + $this->assertEquals($this->observer, $this->observer->customerLogin($observerMock)); + } + + /** + * @return void + */ + public function testCustomerLogout() + { + $observerMock = $this->getObserverMock(111); + + $this->productCompModelMock->expects($this->once())->method('purgeVisitorByCustomer')->willReturnSelf(); + $this->productCompModelMock->expects($this->once())->method('calculate')->willReturnSelf(); + + $this->productIndexMock->expects($this->once())->method('purgeVisitorByCustomer')->willReturnSelf(); + $this->productIndexMock->expects($this->once())->method('calculate')->willReturnSelf(); + + $this->assertEquals($this->observer, $this->observer->customerLogout($observerMock)); + } + + /** + * @return array + */ public function catalogProductCompareAddProductDataProvider() { return [ @@ -260,14 +320,8 @@ class ObserverTest extends \PHPUnit_Framework_TestCase */ protected function prepareReportEventModel($expectedEventData) { - $this->reportEventMock->expects($this->any()) - ->method('setData') - ->with($expectedEventData) - ->willReturnSelf(); - - $this->reportEventMock->expects($this->any()) - ->method('save') - ->willReturnSelf(); + $this->reportEventMock->expects($this->any())->method('setData')->with($expectedEventData)->willReturnSelf(); + $this->reportEventMock->expects($this->any())->method('save')->willReturnSelf(); } /** @@ -276,22 +330,21 @@ class ObserverTest extends \PHPUnit_Framework_TestCase */ protected function getObserverMock($productId) { - $eventObserverMock = $this->getMockBuilder('Magento\Framework\Event\Observer')->disableOriginalConstructor() + $eventObserverMock = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() ->getMock(); - $eventMock = $this->getMockBuilder('Magento\Framework\Event')->disableOriginalConstructor() + $eventMock = $this->getMockBuilder('Magento\Framework\Event') + ->disableOriginalConstructor() ->setMethods(['getProduct'])->getMock(); - $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product')->disableOriginalConstructor() + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() ->getMock(); - $productMock->expects($this->any()) - ->method('getId') - ->willReturn($productId); - $eventMock->expects($this->any()) - ->method('getProduct') - ->willReturn($productMock); - $eventObserverMock->expects($this->any()) - ->method('getEvent') - ->willReturn($eventMock); + $productMock->expects($this->any())->method('getId')->willReturn($productId); + + $eventMock->expects($this->any())->method('getProduct')->willReturn($productMock); + + $eventObserverMock->expects($this->any())->method('getEvent')->willReturn($eventMock); return $eventObserverMock; } diff --git a/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php b/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php index a6585041528a549b1d69b10135614c1270f44937..f9ee6d86285e0aad348824a00a26ae17f2e42e7f 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php @@ -3,82 +3,84 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ + namespace Magento\Reports\Test\Unit\Model\Plugin; +use Magento\Reports\Model\Plugin\Log; + class LogTest extends \PHPUnit_Framework_TestCase { /** * @var \Magento\Reports\Model\Plugin\Log */ - protected $model; + protected $log; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Reports\Model\Event|\PHPUnit_Framework_MockObject_MockObject */ - protected $reportEventMock; + protected $eventMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Reports\Model\Product\Index\Compared|\PHPUnit_Framework_MockObject_MockObject */ - protected $cmpProductIdxMock; + protected $comparedMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Reports\Model\Product\Index\Viewed|\PHPUnit_Framework_MockObject_MockObject */ - protected $viewProductIdxMock; + protected $viewedMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Log\Model\Resource\Log|\PHPUnit_Framework_MockObject_MockObject */ protected $logResourceMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Log\Model\Resource\Log|\PHPUnit_Framework_MockObject_MockObject */ protected $subjectMock; + /** + * {@inheritDoc} + */ protected function setUp() { - $this->reportEventMock = $this->getMock('Magento\Reports\Model\Event', [], [], '', false); - $this->cmpProductIdxMock = $this->getMock( - 'Magento\Reports\Model\Product\Index\Compared', - [], - [], - '', - false - ); - $this->viewProductIdxMock = $this->getMock( - 'Magento\Reports\Model\Product\Index\Viewed', - [], - [], - '', - false - ); + $this->eventMock = $this->getMockBuilder('Magento\Reports\Model\Event') + ->disableOriginalConstructor() + ->getMock(); + $this->comparedMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\Compared') + ->disableOriginalConstructor() + ->getMock(); + $this->viewedMock = $this->getMockBuilder('Magento\Reports\Model\Product\Index\Viewed') + ->disableOriginalConstructor() + ->getMock(); - $this->logResourceMock = $this->getMock('Magento\Log\Model\Resource\Log', [], [], '', false); + $this->logResourceMock = $this->getMockBuilder('Magento\Log\Model\Resource\Log') + ->disableOriginalConstructor() + ->getMock(); + $this->subjectMock = $this->getMockBuilder('Magento\Log\Model\Resource\Log') + ->disableOriginalConstructor() + ->getMock(); - $this->subjectMock = $this->getMock('Magento\Log\Model\Resource\Log', [], [], '', false); - $this->model = new \Magento\Reports\Model\Plugin\Log( - $this->reportEventMock, - $this->cmpProductIdxMock, - $this->viewProductIdxMock + $this->log = new Log( + $this->eventMock, + $this->comparedMock, + $this->viewedMock ); } /** - * @covers \Magento\Reports\Model\Plugin\Log::afterClean + * @return void */ public function testAfterClean() { - $this->reportEventMock->expects($this->once())->method('clean'); - - $this->cmpProductIdxMock->expects($this->once())->method('clean'); - - $this->viewProductIdxMock->expects($this->once())->method('clean'); + $this->eventMock->expects($this->once())->method('clean'); + $this->comparedMock->expects($this->once())->method('clean'); + $this->viewedMock->expects($this->once())->method('clean'); $this->assertEquals( $this->logResourceMock, - $this->model->afterClean($this->subjectMock, $this->logResourceMock) + $this->log->afterClean($this->subjectMock, $this->logResourceMock) ); } } diff --git a/app/code/Magento/Reports/Test/Unit/Model/Product/Index/ComparedTest.php b/app/code/Magento/Reports/Test/Unit/Model/Product/Index/ComparedTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7a2a7213a6b7899f7f89fd47a04bb66fb31539ea --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Product/Index/ComparedTest.php @@ -0,0 +1,149 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Product\Index; + +use Magento\Reports\Model\Product\Index\Compared; + +class ComparedTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Product\Index\Compared + */ + protected $compared; + + /** + * @var \Magento\Framework\Model\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $contextMock; + + /** + * @var \Magento\Framework\Registry|\PHPUnit_Framework_MockObject_MockObject + */ + protected $registryMock; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManagerMock; + + /** + * @var \Magento\Customer\Model\Visitor|\PHPUnit_Framework_MockObject_MockObject + */ + protected $visitorMock; + + /** + * @var \Magento\Customer\Model\Session|\PHPUnit_Framework_MockObject_MockObject + */ + protected $sessionMock; + + /** + * @var \Magento\Framework\Session\Generic|\PHPUnit_Framework_MockObject_MockObject + */ + protected $genericMock; + + /** + * @var \Magento\Catalog\Model\Product\Visibility|\PHPUnit_Framework_MockObject_MockObject + */ + protected $visibilityMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dateTimeMock; + + /** + * @var \Magento\Catalog\Helper\Product\Compare|\PHPUnit_Framework_MockObject_MockObject + */ + protected $catalogProductHelperMock; + + /** + * @var \Magento\Framework\Model\Resource\AbstractResource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * @var \Magento\Framework\Data\Collection\AbstractDb|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dbMock; + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Context') + ->disableOriginalConstructor() + ->getMock(); + $this->registryMock = $this->getMockBuilder('Magento\Framework\Registry') + ->getMock(); + $this->storeManagerMock = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') + ->getMock(); + $this->visitorMock = $this->getMockBuilder('Magento\Customer\Model\Visitor') + ->disableOriginalConstructor() + ->getMock(); + $this->sessionMock = $this->getMockBuilder('Magento\Customer\Model\Session') + ->disableOriginalConstructor() + ->getMock(); + $this->genericMock = $this->getMockBuilder('Magento\Framework\Session\Generic') + ->disableOriginalConstructor() + ->getMock(); + $this->visibilityMock = $this->getMockBuilder('Magento\Catalog\Model\Product\Visibility') + ->disableOriginalConstructor() + ->getMock(); + $this->dateTimeMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime') + ->getMock(); + $this->catalogProductHelperMock = $this->getMockBuilder('Magento\Catalog\Helper\Product\Compare') + ->disableOriginalConstructor() + ->getMock(); + + $this->resourceMock = $this->getMockBuilder('Magento\Framework\Model\Resource\AbstractResource') + ->disableOriginalConstructor() + ->setMethods(['getIdFieldName', '_construct', '_getReadAdapter', '_getWriteAdapter']) + ->getMock(); + $this->dbMock = $this->getMockBuilder('Magento\Framework\Data\Collection\AbstractDb') + ->disableOriginalConstructor() + ->getMock(); + + $this->compared = new Compared( + $this->contextMock, + $this->registryMock, + $this->storeManagerMock, + $this->visitorMock, + $this->sessionMock, + $this->genericMock, + $this->visibilityMock, + $this->dateTimeMock, + $this->catalogProductHelperMock, + $this->resourceMock, + $this->dbMock + ); + } + + /** + * @return void + */ + public function testGetExcludeProductIds() + { + $collection = $this->getMockBuilder('Magento\Catalog\Model\Resource\Product\Compare\Item\Collection') + ->disableOriginalConstructor() + ->setMethods(['getEntityId']) + ->getMock(); + $collection->expects($this->once())->method('getEntityId')->willReturn(1); + + $product = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->setMethods(['getId']) + ->getMock(); + $product->expects($this->once())->method('getId')->willReturn(2); + + $this->catalogProductHelperMock->expects($this->once())->method('hasItems')->willReturn(true); + $this->catalogProductHelperMock->expects($this->once())->method('getItemCollection')->willReturn([$collection]); + + $this->registryMock->expects($this->any())->method('registry')->willReturn($product); + + $this->assertEquals([1, 2], $this->compared->getExcludeProductIds()); + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/Event/CollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Event/CollectionTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2191830c60ffd3ebdad30f105190cc31f9aa2b7f --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Event/CollectionTest.php @@ -0,0 +1,161 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Resource\Event; + +use Magento\Reports\Model\Resource\Event\Collection; + +class CollectionTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Resource\Event\Collection + */ + protected $collection; + + /** + * @var \Magento\Framework\Data\Collection\EntityFactoryInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entityFactoryMock; + + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $loggerMock; + + /** + * @var \Magento\Framework\Data\Collection\Db\FetchStrategyInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $fetchStrategyMock; + + /** + * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $managerMock; + + /** + * @var \Magento\Framework\Model\Resource\Db\AbstractDb|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * @var \Zend_Db_Adapter_Abstract|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dbMock; + + /** + * @var \Zend_Db_Select|\PHPUnit_Framework_MockObject_MockObject + */ + protected $selectMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->entityFactoryMock = $this->getMockBuilder('Magento\Framework\Data\Collection\EntityFactoryInterface') + ->getMock(); + $this->loggerMock = $this->getMockBuilder('Psr\Log\LoggerInterface') + ->getMock(); + $this->fetchStrategyMock = $this->getMockBuilder('Magento\Framework\Data\Collection\Db\FetchStrategyInterface') + ->getMock(); + $this->managerMock = $this->getMockBuilder('Magento\Framework\Event\ManagerInterface') + ->getMock(); + + $this->selectMock = $this->getMockBuilder('Zend_Db_Select') + ->setMethods(['where', 'from']) + ->disableOriginalConstructor() + ->getMock(); + $this->selectMock->expects($this->any()) + ->method('from') + ->willReturnSelf(); + $this->selectMock->expects($this->any()) + ->method('where') + ->willReturnSelf(); + + $this->dbMock = $this->getMockBuilder('Zend_Db_Adapter_Abstract') + ->disableOriginalConstructor() + ->getMock(); + $this->dbMock->expects($this->any()) + ->method('select') + ->willReturn($this->selectMock); + + $this->resourceMock = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\AbstractDb') + ->disableOriginalConstructor() + ->setMethods(['getReadConnection', 'getCurrentStoreIds', '_construct', 'getMainTable', 'getTable']) + ->getMock(); + $this->resourceMock->expects($this->any()) + ->method('getReadConnection') + ->willReturn($this->dbMock); + + $this->collection = new Collection( + $this->entityFactoryMock, + $this->loggerMock, + $this->fetchStrategyMock, + $this->managerMock, + null, + $this->resourceMock + ); + } + + /** + * @param mixed $ignoreData + * @param 'string' $ignoreSql + * @dataProvider ignoresDataProvider + * @return void + */ + public function testAddStoreFilter($ignoreData, $ignoreSql) + { + $typeId = 1; + $subjectId =2; + $subtype = 3; + $limit = 0; + $stores = [1, 2]; + + $this->resourceMock + ->expects($this->once()) + ->method('getCurrentStoreIds') + ->willReturn($stores); + $this->selectMock + ->expects($this->at(0)) + ->method('where') + ->with('event_type_id = ?', $typeId); + $this->selectMock + ->expects($this->at(1)) + ->method('where') + ->with('subject_id = ?', $subjectId); + $this->selectMock + ->expects($this->at(2)) + ->method('where') + ->with('subtype = ?', $subtype); + $this->selectMock + ->expects($this->at(3)) + ->method('where') + ->with('store_id IN(?)', $stores); + $this->selectMock + ->expects($this->at(4)) + ->method('where') + ->with($ignoreSql, $ignoreData); + + $this->collection->addRecentlyFiler($typeId, $subjectId, $subtype, $ignoreData, $limit); + } + + /** + * @return array + */ + public function ignoresDataProvider() + { + return [ + [ + 'ignoreData' => 1, + 'ignoreSql' => 'object_id <> ?' + ], + [ + 'ignoreData' => [1], + 'ignoreSql' => 'object_id NOT IN(?)' + ] + ]; + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php new file mode 100644 index 0000000000000000000000000000000000000000..5d1dc3bbcea0733b49ccf35ba68ae9f3d948581a --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php @@ -0,0 +1,248 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Resource; + +use Magento\Reports\Model\Resource\Event; + +class EventTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Resource\Event + */ + protected $event; + + /** + * @var \Magento\Framework\Model\Resource\Db\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $contextMock; + + /** + * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $scopeConfigMock; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManagerMock; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $connectionMock; + + /** + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * @var \Magento\Store\Model\Store|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\Context') + ->disableOriginalConstructor() + ->getMock(); + + $this->scopeConfigMock = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') + ->getMock(); + + $this->storeManagerMock = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') + ->getMock(); + + $this->storeMock = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + + $this->storeManagerMock + ->expects($this->any()) + ->method('getStore') + ->willReturn($this->storeMock); + + $this->connectionMock = $this->getMockBuilder('Magento\Framework\DB\Adapter\AdapterInterface') + ->getMock(); + + $this->resourceMock = $this->getMockBuilder('Magento\Framework\App\Resource') + ->disableOriginalConstructor() + ->getMock(); + $this->resourceMock + ->expects($this->any()) + ->method('getConnection') + ->willReturn($this->connectionMock); + + $this->contextMock + ->expects($this->any()) + ->method('getResources') + ->willReturn($this->resourceMock); + + $this->event = new Event( + $this->contextMock, + $this->scopeConfigMock, + $this->storeManagerMock + ); + } + + /** + * @return void + */ + public function testUpdateCustomerTypeWithoutType() + { + $eventMock = $this->getMockBuilder('Magento\Reports\Model\Event') + ->disableOriginalConstructor() + ->getMock(); + $this->connectionMock + ->expects($this->never()) + ->method('update'); + + $this->event->updateCustomerType($eventMock, 1, 1); + + } + + /** + * @return void + */ + public function testUpdateCustomerTypeWithType() + { + $eventMock = $this->getMockBuilder('Magento\Reports\Model\Event') + ->disableOriginalConstructor() + ->getMock(); + $this->connectionMock + ->expects($this->once()) + ->method('update'); + + $this->event->updateCustomerType($eventMock, 1, 1, ['type']); + + } + + /** + * @return void + */ + public function testApplyLogToCollection() + { + $derivedSelect = 'SELECT * FROM table'; + $idFieldName = 'IdFieldName'; + + $collectionSelectMock = $this->getMockBuilder('Magento\Framework\DB\Select') + ->disableOriginalConstructor() + ->setMethods(['joinInner', 'order']) + ->getMock(); + $collectionSelectMock + ->expects($this->once()) + ->method('joinInner') + ->with( + ['evt' => new \Zend_Db_Expr("({$derivedSelect})")], + "{$idFieldName} = evt.object_id", + [] + ) + ->willReturnSelf(); + $collectionSelectMock + ->expects($this->once()) + ->method('order') + ->willReturnSelf(); + + $collectionMock = $this->getMockBuilder('Magento\Framework\Data\Collection\AbstractDb') + ->disableOriginalConstructor() + ->getMock(); + $collectionMock + ->expects($this->once()) + ->method('getResource') + ->willReturnSelf(); + $collectionMock + ->expects($this->once()) + ->method('getIdFieldName') + ->willReturn($idFieldName); + $collectionMock + ->expects($this->any()) + ->method('getSelect') + ->willReturn($collectionSelectMock); + + $selectMock = $this->getMockBuilder('Magento\Framework\DB\Select') + ->disableOriginalConstructor() + ->setMethods(['from', 'where', 'group', 'joinInner', '__toString']) + ->getMock(); + $selectMock + ->expects($this->once()) + ->method('from') + ->willReturnSelf(); + $selectMock + ->expects($this->any()) + ->method('where') + ->willReturnSelf(); + $selectMock + ->expects($this->once()) + ->method('group') + ->willReturnSelf(); + $selectMock + ->expects($this->any()) + ->method('__toString') + ->willReturn($derivedSelect); + + $this->connectionMock + ->expects($this->once()) + ->method('select') + ->willReturn($selectMock); + + $this->storeMock + ->expects($this->any()) + ->method('getId') + ->willReturn(1); + + $this->event->applyLogToCollection($collectionMock, 1, 1, 1); + } + + /** + * @return void + */ + public function testClean() + { + $eventMock = $this->getMockBuilder('Magento\Reports\Model\Event') + ->disableOriginalConstructor() + ->getMock(); + + $selectMock = $this->getMockBuilder('Magento\Framework\DB\Select') + ->disableOriginalConstructor() + ->setMethods(['select', 'from', 'joinLeft', 'where', 'limit', 'fetchCol']) + ->getMock(); + + $this->connectionMock + ->expects($this->at(3)) + ->method('fetchCol') + ->willReturn(1); + $this->connectionMock + ->expects($this->once()) + ->method('delete'); + $this->connectionMock + ->expects($this->any()) + ->method('select') + ->willReturn($selectMock); + + $selectMock + ->expects($this->exactly(2)) + ->method('from') + ->willReturnSelf(); + $selectMock + ->expects($this->exactly(2)) + ->method('joinLeft') + ->willReturnSelf(); + $selectMock + ->expects($this->any()) + ->method('where') + ->willReturnSelf(); + $selectMock + ->expects($this->exactly(2)) + ->method('limit') + ->willReturnSelf(); + + $this->event->clean($eventMock); + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b000c4ad43ab230bf9b648241354cb3cd60b65d3 --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php @@ -0,0 +1,122 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Resource; + +use Magento\Reports\Model\Resource\Helper; + +class HelperTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Resource\Helper + */ + protected $helper; + + /** + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $connectionMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->resourceMock = $this->getMockBuilder('Magento\Framework\App\Resource') + ->disableOriginalConstructor() + ->getMock(); + + $this->connectionMock = $this->getMockBuilder('Magento\Framework\DB\Adapter\AdapterInterface') + ->getMock(); + + $this->resourceMock + ->expects($this->any()) + ->method('getConnection') + ->willReturn($this->connectionMock); + + $this->helper = new Helper( + $this->resourceMock + ); + } + + /** + * @return void + */ + public function testMergeVisitorProductIndex() + { + $mainTable = 'mainTable'; + $data = ['dataKey' => 'dataValue']; + $matchFields = ['matchField']; + + $this->connectionMock + ->expects($this->once()) + ->method('insertOnDuplicate') + ->with($mainTable, $data, array_keys($data)); + + $this->helper->mergeVisitorProductIndex($mainTable, $data, $matchFields); + } + + /** + * @param string $type + * @param array $result + * @dataProvider typesDataProvider + * @return void + */ + public function testUpdateReportRatingPos($type, $result) + { + $mainTable = 'mainTable'; + $column = 'column'; + $aggregationTable = 'aggregationTable'; + + $selectMock = $this->getMockBuilder('Magento\Framework\DB\Select') + ->disableOriginalConstructor() + ->getMock(); + $selectMock + ->expects($this->any()) + ->method('from') + ->willReturnSelf(); + $selectMock + ->expects($this->once()) + ->method('group') + ->willReturnSelf(); + $selectMock + ->expects($this->once()) + ->method('order') + ->willReturnSelf(); + $selectMock + ->expects($this->once()) + ->method('insertFromSelect') + ->with($aggregationTable, $result) + ->willReturnSelf(); + + $this->connectionMock + ->expects($this->any()) + ->method('select') + ->willReturn($selectMock); + + $this->helper->updateReportRatingPos($this->connectionMock, $type, $column, $mainTable, $aggregationTable); + } + + /** + * @return array + */ + public function typesDataProvider() + { + $mResult = ['period', 'store_id', 'product_id', 'product_name', 'product_price', 'column', 'rating_pos']; + $dResult = ['period', 'store_id', 'product_id', 'product_name', 'product_price', 'id', 'column', 'rating_pos']; + return [ + ['type' => 'year', 'result' => $mResult], + ['type' => 'month', 'result' => $mResult], + ['type' => 'day', 'result' => $dResult], + ['type' => null, 'result' => $mResult] + ]; + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php new file mode 100644 index 0000000000000000000000000000000000000000..22a6bb1be49c2719d81af2339c7feef95295a195 --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php @@ -0,0 +1,509 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Resource\Order; + +use Magento\Reports\Model\Resource\Order\Collection; + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class CollectionTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Resource\Order\Collection + */ + protected $collection; + + /** + * @var \Magento\Framework\Data\Collection\EntityFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entityFactoryMock; + + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $loggerMock; + + /** + * @var \Magento\Framework\Data\Collection\Db\FetchStrategyInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $fetchStrategyMock; + + /** + * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $managerMock; + + /** + * @var \Magento\Sales\Model\Resource\EntitySnapshot|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entitySnapshotMock; + + /** + * @var \Magento\Framework\DB\Helper|\PHPUnit_Framework_MockObject_MockObject + */ + protected $helperMock; + + /** + * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $scopeConfigMock; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManagerMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $timezoneMock; + + /** + * @var \Magento\Sales\Model\Order\Config|\PHPUnit_Framework_MockObject_MockObject + */ + protected $configMock; + + /** + * @var \Magento\Sales\Model\Resource\Report\OrderFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $orderFactoryMock; + + /** + * @var \Zend_Db_Adapter_Abstract|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dbMock; + + /** + * @var \Zend_Db_Select|\PHPUnit_Framework_MockObject_MockObject + */ + protected $selectMock; + + /** + * @var \Magento\Framework\Model\Resource\Db\AbstractDb|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->entityFactoryMock = $this->getMockBuilder('Magento\Framework\Data\Collection\EntityFactory') + ->disableOriginalConstructor() + ->getMock(); + $this->loggerMock = $this->getMockBuilder('Psr\Log\LoggerInterface') + ->getMock(); + $this->fetchStrategyMock = $this->getMockBuilder('Magento\Framework\Data\Collection\Db\FetchStrategyInterface') + ->getMock(); + $this->managerMock = $this->getMockBuilder('Magento\Framework\Event\ManagerInterface') + ->getMock(); + $this->entitySnapshotMock = $this->getMockBuilder('Magento\Sales\Model\Resource\EntitySnapshot') + ->disableOriginalConstructor() + ->getMock(); + $this->helperMock = $this->getMockBuilder('Magento\Framework\DB\Helper') + ->disableOriginalConstructor() + ->getMock(); + $this->scopeConfigMock = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') + ->getMock(); + $this->storeManagerMock = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') + ->getMock(); + $this->timezoneMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime\TimezoneInterface') + ->getMock(); + $this->configMock = $this->getMockBuilder('Magento\Sales\Model\Order\Config') + ->disableOriginalConstructor() + ->getMock(); + $this->orderFactoryMock = $this->getMockBuilder('Magento\Sales\Model\Resource\Report\OrderFactory') + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->selectMock = $this->getMockBuilder('Zend_Db_Select') + ->disableOriginalConstructor() + ->getMock(); + $this->selectMock + ->expects($this->any()) + ->method('columns') + ->willReturnSelf(); + $this->selectMock + ->expects($this->any()) + ->method('where') + ->willReturnSelf(); + $this->selectMock + ->expects($this->any()) + ->method('order') + ->willReturnSelf(); + $this->selectMock + ->expects($this->any()) + ->method('group') + ->willReturnSelf(); + $this->selectMock + ->expects($this->any()) + ->method('getPart') + ->willReturn([]); + + $this->dbMock = $this->getMockForAbstractClass( + 'Zend_Db_Adapter_Abstract', + [], + '', + false, + true, + true, + ['select', 'getIfNullSql', 'getDateFormatSql', 'prepareSqlCondition', 'getCheckSql'] + ); + $this->dbMock + ->expects($this->any()) + ->method('select') + ->willReturn($this->selectMock); + + $this->resourceMock = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\AbstractDb') + ->disableOriginalConstructor() + ->getMock(); + $this->resourceMock + ->expects($this->once()) + ->method('getReadConnection') + ->willReturn($this->dbMock); + + $this->collection = new Collection( + $this->entityFactoryMock, + $this->loggerMock, + $this->fetchStrategyMock, + $this->managerMock, + $this->entitySnapshotMock, + $this->helperMock, + $this->scopeConfigMock, + $this->storeManagerMock, + $this->timezoneMock, + $this->configMock, + $this->orderFactoryMock, + null, + $this->resourceMock + ); + } + + /** + * @return void + */ + public function testCheckIsLive() + { + $range = ''; + $this->scopeConfigMock + ->expects($this->once()) + ->method('getValue') + ->with( + 'sales/dashboard/use_aggregated_data', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ); + + $this->collection->checkIsLive($range); + } + + /** + * @param int $useAggregatedData + * @param string $mainTable + * @param int $isFilter + * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $getIfNullSqlResult + * @dataProvider useAggregatedDataDataProvider + * @return void + */ + public function testPrepareSummary($useAggregatedData, $mainTable, $isFilter, $getIfNullSqlResult) + { + $range = ''; + $customStart = 1; + $customEnd = 10; + + $this->scopeConfigMock + ->expects($this->once()) + ->method('getValue') + ->with( + 'sales/dashboard/use_aggregated_data', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ->willReturn($useAggregatedData); + + $orderMock = $this->getMockBuilder('Magento\Sales\Model\Resource\Report\Order') + ->disableOriginalConstructor() + ->getMock(); + + $this->orderFactoryMock + ->expects($this->any()) + ->method('create') + ->willReturn($orderMock); + + $this->resourceMock + ->expects($this->at(0)) + ->method('getTable') + ->with($mainTable); + + $this->dbMock + ->expects($getIfNullSqlResult) + ->method('getIfNullSql'); + + $this->collection->prepareSummary($range, $customStart, $customEnd, $isFilter); + } + + /** + * @param int $range + * @param string $customStart + * @param string $customEnd + * @param string $expectedInterval + * @dataProvider firstPartDateRangeDataProvider + * @return void + */ + public function testGetDateRangeFirstPart($range, $customStart, $customEnd, $expectedInterval) + { + $result = $this->collection->getDateRange($range, $customStart, $customEnd); + $interval = $result['to']->diff($result['from']); + $intervalResult = $interval->format('%y %m %d %h:%i:%s'); + $this->assertEquals($expectedInterval, $intervalResult); + } + + /** + * @param int $range + * @param string $customStart + * @param string $customEnd + * @param string $config + * @dataProvider secondPartDateRangeDataProvider + * @return void + */ + public function testGetDateRangeSecondPart($range, $customStart, $customEnd, $config) + { + $this->scopeConfigMock + ->expects($this->once()) + ->method('getValue') + ->with( + $config, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ->willReturn(1); + + $result = $this->collection->getDateRange($range, $customStart, $customEnd); + $this->assertEquals(3, count($result)); + } + + /** + * @return void + */ + public function testGetDateRangeWithReturnObject() + { + $this->assertEquals(2, count($this->collection->getDateRange('7d', '', '', true))); + $this->assertEquals(3, count($this->collection->getDateRange('7d', '', '', false))); + } + + /** + * @return void + */ + public function testAddItemCountExpr() + { + $this->selectMock + ->expects($this->once()) + ->method('columns') + ->with(['items_count' => 'total_item_count'], 'main_table'); + $this->collection->addItemCountExpr(); + } + + /** + * @param int $isFilter + * @param int $useAggregatedData + * @param string $mainTable + * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $getIfNullSqlResult + * @dataProvider totalsDataProvider + * @return void + */ + public function testCalculateTotals($isFilter, $useAggregatedData, $mainTable, $getIfNullSqlResult) + { + $this->scopeConfigMock + ->expects($this->once()) + ->method('getValue') + ->with( + 'sales/dashboard/use_aggregated_data', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ->willReturn($useAggregatedData); + + $this->resourceMock + ->expects($this->at(0)) + ->method('getTable') + ->with($mainTable); + + $this->dbMock + ->expects($getIfNullSqlResult) + ->method('getIfNullSql'); + + $this->collection->checkIsLive(''); + $this->collection->calculateTotals($isFilter); + } + + /** + * @param int $isFilter + * @param string $useAggregatedData + * @param string $mainTable + * @dataProvider salesDataProvider + * @return void + */ + public function testCalculateSales($isFilter, $useAggregatedData, $mainTable) + { + $this->scopeConfigMock + ->expects($this->once()) + ->method('getValue') + ->with( + 'sales/dashboard/use_aggregated_data', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ) + ->willReturn($useAggregatedData); + + $storeMock = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + + $this->storeManagerMock + ->expects($this->any()) + ->method('getStore') + ->willReturn($storeMock); + + $this->resourceMock + ->expects($this->at(0)) + ->method('getTable') + ->with($mainTable); + + $this->collection->calculateSales($isFilter); + } + + /** + * @return void + */ + public function testSetDateRange() + { + $fromDate = '1'; + $toDate = '2'; + + $this->dbMock + ->expects($this->at(0)) + ->method('prepareSqlCondition') + ->with('"created_at"', ['from' => $fromDate, 'to' => $toDate]); + + $this->collection->setDateRange($fromDate, $toDate); + } + + /** + * @param array $storeIds + * @param array $parameters + * @dataProvider storesDataProvider + * @return void + */ + public function testSetStoreIds($storeIds, $parameters) + { + $this->dbMock + ->expects($this->any()) + ->method('getIfNullSql') + ->willReturn('text'); + + $this->selectMock + ->expects($this->once()) + ->method('columns') + ->with($parameters) + ->willReturnSelf(); + + $this->collection->setStoreIds($storeIds); + } + + /** + * @return array + */ + public function useAggregatedDataDataProvider() + { + return [ + [1, 'sales_order_aggregated_created', 0, $this->never()], + [0, 'sales_order', 0, $this->exactly(7)], + [0, 'sales_order', 1, $this->exactly(6)] + ]; + } + + /** + * @return array + */ + public function firstPartDateRangeDataProvider() + { + return [ + ['', '', '', '0 0 0 23:59:59'], + ['24h', '', '', '0 0 1 0:0:0'], + ['7d', '', '', '0 0 6 23:59:59'] + ]; + } + + /** + * @return array + */ + public function secondPartDateRangeDataProvider() + { + return [ + ['1m', 1, 10, 'reports/dashboard/mtd_start'], + ['1y', 1, 10, 'reports/dashboard/ytd_start'], + ['2y', 1, 10, 'reports/dashboard/ytd_start'] + ]; + } + + /** + * @return array + */ + public function totalsDataProvider() + { + return [ + [1, 1, 'sales_order_aggregated_created', $this->never()], + [0, 1, 'sales_order_aggregated_created', $this->never()], + [1, 0, 'sales_order', $this->exactly(10)], + [0, 0, 'sales_order', $this->exactly(11)] + ]; + } + + /** + * @return array + */ + public function salesDataProvider() + { + return [ + [1, 1, 'sales_order_aggregated_created'], + [0, 1, 'sales_order_aggregated_created'], + [1, 0, 'sales_order'], + [0, 0, 'sales_order'] + ]; + } + + /** + * @return array + */ + public function storesDataProvider() + { + $firstReturn = [ + 'subtotal' => 'SUM(main_table.base_subtotal * main_table.base_to_global_rate)', + 'tax' => 'SUM(main_table.base_tax_amount * main_table.base_to_global_rate)', + 'shipping' => 'SUM(main_table.base_shipping_amount * main_table.base_to_global_rate)', + 'discount' => 'SUM(main_table.base_discount_amount * main_table.base_to_global_rate)', + 'total' => 'SUM(main_table.base_grand_total * main_table.base_to_global_rate)', + 'invoiced' => 'SUM(main_table.base_total_paid * main_table.base_to_global_rate)', + 'refunded' => 'SUM(main_table.base_total_refunded * main_table.base_to_global_rate)', + 'profit' => 'SUM(text * main_table.base_to_global_rate) + SUM(text * main_table.base_to_global_rate) '. + '- SUM(text * main_table.base_to_global_rate) - SUM(text * main_table.base_to_global_rate) '. + '- SUM(text * main_table.base_to_global_rate)', + ]; + + $secondReturn = [ + 'subtotal' => 'SUM(main_table.base_subtotal)', + 'tax' => 'SUM(main_table.base_tax_amount)', + 'shipping' => 'SUM(main_table.base_shipping_amount)', + 'discount' => 'SUM(main_table.base_discount_amount)', + 'total' => 'SUM(main_table.base_grand_total)', + 'invoiced' => 'SUM(main_table.base_total_paid)', + 'refunded' => 'SUM(main_table.base_total_refunded)', + 'profit' => 'SUM(text) + SUM(text) - SUM(text) - SUM(text) - SUM(text)', + ]; + + return [ + [[], $firstReturn], + [[1], $secondReturn] + ]; + } +} diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Collection/AbstractCollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Collection/AbstractCollectionTest.php index 96ad13c9b21868aa019927b72cee62eba019797b..ed5075a8bf70b7e4aeeb28e4e5eec0e08af3d08f 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Collection/AbstractCollectionTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Collection/AbstractCollectionTest.php @@ -4,16 +4,16 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Test\Unit\Model\Resource\Report\Collection; class AbstractCollectionTest extends \PHPUnit_Framework_TestCase { /** - * @var AbstractCollection + * Tested collection + * + * @var \Magento\Reports\Model\Resource\Report\Collection\AbstractCollection */ - protected $_model; + protected $collection; protected function setUp() { @@ -29,7 +29,7 @@ class AbstractCollectionTest extends \PHPUnit_Framework_TestCase ->getMockForAbstractClass(); $resource->method('getReadConnection')->willReturn($connection); - $this->_model = new \Magento\Reports\Model\Resource\Report\Collection\AbstractCollection( + $this->collection = new \Magento\Reports\Model\Resource\Report\Collection\AbstractCollection( $entityFactory, $logger, $fetchStrategy, @@ -41,15 +41,15 @@ class AbstractCollectionTest extends \PHPUnit_Framework_TestCase public function testIsSubtotalsGetDefault() { - $this->assertFalse($this->_model->isSubTotals()); + $this->assertFalse($this->collection->isSubTotals()); } public function testSetIsSubtotals() { - $this->_model->setIsSubTotals(true); - $this->assertTrue($this->_model->isSubTotals()); + $this->collection->setIsSubTotals(true); + $this->assertTrue($this->collection->isSubTotals()); - $this->_model->setIsSubTotals(false); - $this->assertFalse($this->_model->isSubTotals()); + $this->collection->setIsSubTotals(false); + $this->assertFalse($this->collection->isSubTotals()); } } diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/CollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/CollectionTest.php index c1e8adeeee7d3c16a6bb8984939699ef12c1ef48..ca08b3b21761a51c314c60a315f89e1dc5d359e2 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/CollectionTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/CollectionTest.php @@ -3,32 +3,196 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ + namespace Magento\Reports\Test\Unit\Model\Resource\Report; +use Magento\Reports\Model\Resource\Report\Collection; + class CollectionTest extends \PHPUnit_Framework_TestCase { /** * @var \Magento\Reports\Model\Resource\Report\Collection */ - protected $_model; + protected $collection; + /** + * @var \Magento\Framework\Data\Collection\EntityFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entityFactoryMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $timezoneMock; + + /** + * @var \Magento\Reports\Model\Resource\Report\Collection\Factory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $factoryMock; + + /** + * {@inheritDoc} + */ protected function setUp() { - $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->_model = $helper->getObject('Magento\Reports\Model\Resource\Report\Collection'); + $this->entityFactoryMock = $this->getMockBuilder('Magento\Framework\Data\Collection\EntityFactory') + ->disableOriginalConstructor() + ->getMock(); + $this->timezoneMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime\TimezoneInterface') + ->getMock(); + $this->factoryMock = $this->getMockBuilder('Magento\Reports\Model\Resource\Report\Collection\Factory') + ->disableOriginalConstructor() + ->getMock(); + + $this->timezoneMock + ->expects($this->any()) + ->method('formatDateTime') + ->will($this->returnCallback([$this, 'formatDateTime'])); + + $this->collection = new Collection( + $this->entityFactoryMock, + $this->timezoneMock, + $this->factoryMock + ); } - public function testGetIntervalsWithoutSpecifiedPeriod() + /** + * @return void + */ + public function testGetPeriods() { - $startDate = new \DateTime('-3 day'); - $endDate = new \DateTime('+3 day'); - $this->_model->setInterval($startDate, $endDate); + $expectedArray = ['day' => 'Day', 'month' => 'Month', 'year' => 'Year']; + $this->assertEquals($expectedArray, $this->collection->getPeriods()); + } - $this->assertEquals(0, $this->_model->getSize()); + /** + * @return void + */ + public function testGetStoreIds() + { + $storeIds = [1]; + $this->assertEquals(null, $this->collection->getStoreIds()); + $this->collection->setStoreIds($storeIds); + $this->assertEquals($storeIds, $this->collection->getStoreIds()); } - public function testGetIntervalsWithoutSpecifiedInterval() + /** + * @param string $period + * @param \DateTime $fromDate + * @param \DateTime $toDate + * @param int $size + * @dataProvider intervalsDataProvider + * @return void + */ + public function testGetSize($period, $fromDate, $toDate, $size) { - $this->assertEquals(0, $this->_model->getSize()); + $this->collection->setPeriod($period); + $this->collection->setInterval($fromDate, $toDate); + $this->assertEquals($size, $this->collection->getSize()); + } + + /** + * @return void + */ + public function testGetPageSize() + { + $pageSize = 1; + $this->assertEquals(null, $this->collection->getPageSize()); + $this->collection->setPageSize($pageSize); + $this->assertEquals($pageSize, $this->collection->getPageSize()); + } + + /** + * @param string $period + * @param \DateTime $fromDate + * @param \DateTime $toDate + * @param int $size + * @dataProvider intervalsDataProvider + * @return void + */ + public function testGetReports($period, $fromDate, $toDate, $size) + { + $this->collection->setPeriod($period); + $this->collection->setInterval($fromDate, $toDate); + $reports = $this->collection->getReports(); + foreach ($reports as $report) { + $this->assertInstanceOf('\Magento\Framework\Object', $report); + $reportData = $report->getData(); + $this->assertTrue(empty($reportData['children'])); + $this->assertTrue($reportData['is_empty']); + } + $this->assertEquals($size, count($reports)); + } + + /** + * @return void + */ + public function testLoadData() + { + $this->assertInstanceOf('\Magento\Reports\Model\Resource\Report\Collection', $this->collection->loadData()); + } + + /** + * @return array + */ + public function intervalsDataProvider() + { + return [ + [ + '_period' => 'day', + '_from' => new \DateTime('-3 day'), + '_to' => new \DateTime('+3 day'), + 'size' => 7 + ], + [ + '_period' => 'month', + '_from' => new \DateTime('2015-01-15 11:11:11'), + '_to' => new \DateTime('2015-01-25 11:11:11'), + 'size' => 1 + ], + [ + '_period' => 'month', + '_from' => new \DateTime('2015-01-15 11:11:11'), + '_to' => new \DateTime('2015-02-25 11:11:11'), + 'size' => 2 + ], + [ + '_period' => 'year', + '_from' => new \DateTime('2015-01-15 11:11:11'), + '_to' => new \DateTime('2015-01-25 11:11:11'), + 'size' => 1 + ], + [ + '_period' => 'year', + '_from' => new \DateTime('2014-01-15 11:11:11'), + '_to' => new \DateTime('2015-01-25 11:11:11'), + 'size' => 2 + ], + [ + '_period' => null, + '_from' => new \DateTime('-3 day'), + '_to' => new \DateTime('+3 day'), + 'size' => 0 + ] + ]; + } + + /** + * @return string + */ + public function formatDateTime() + { + $args = func_get_args(); + + $dateStart = $args[0]; + + $formatter = new \IntlDateFormatter( + "en_US", + \IntlDateFormatter::SHORT, + \IntlDateFormatter::SHORT, + 'America/Los_Angeles' + ); + + return $formatter->format($dateStart); } } diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Product/ViewedTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Product/ViewedTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b22e4f2bf044939cb3db933093d341afbf6318ac --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Product/ViewedTest.php @@ -0,0 +1,286 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Reports\Test\Unit\Model\Resource\Report\Product; + +use Magento\Reports\Model\Resource\Report\Product\Viewed; + +/** + * @SuppressWarnings(PHPMD.TooManyFields) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class ViewedTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Reports\Model\Resource\Report\Product\Viewed + */ + protected $viewed; + + /** + * @var \Magento\Framework\Model\Resource\Db\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $contextMock; + + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $loggerMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $timezoneMock; + + /** + * @var \Magento\Reports\Model\FlagFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $flagFactoryMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dateTimeMock; + + /** + * @var \Magento\Framework\Stdlib\DateTime\Timezone\Validator|\PHPUnit_Framework_MockObject_MockObject + */ + protected $validatorMock; + + /** + * @var \Magento\Catalog\Model\Resource\Product|\PHPUnit_Framework_MockObject_MockObject + */ + protected $productMock; + + /** + * @var \Magento\Reports\Model\Resource\Helper|\PHPUnit_Framework_MockObject_MockObject + */ + protected $helperMock; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $connectionMock; + + /** + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceMock; + + /** + * @var \Magento\Framework\DB\Select|\PHPUnit_Framework_MockObject_MockObject + */ + protected $selectMock; + + /** + * @var \Zend_Db_Statement_Interface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $zendDbMock; + + /** + * @var \Magento\Eav\Model\Entity\Attribute\AbstractAttribute|\PHPUnit_Framework_MockObject_MockObject + */ + protected $attributeMock; + + /** + * @var \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend|\PHPUnit_Framework_MockObject_MockObject + */ + protected $backendMock; + + /** + * @var \Magento\Reports\Model\Flag|\PHPUnit_Framework_MockObject_MockObject + */ + protected $flagMock; + + /** + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * @return void + */ + protected function setUp() + { + $this->zendDbMock = $this->getMockBuilder('Zend_Db_Statement_Interface')->getMock(); + $this->zendDbMock->expects($this->any())->method('fetchColumn')->willReturn([]); + + $this->selectMock = $this->getMockBuilder('Magento\Framework\DB\Select') + ->disableOriginalConstructor() + ->setMethods( + [ + 'from', + 'where', + 'joinInner', + 'joinLeft', + 'having', + 'useStraightJoin', + 'insertFromSelect', + '__toString' + ] + ) + ->getMock(); + $this->selectMock->expects($this->any())->method('from')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('where')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('joinInner')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('joinLeft')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('having')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('useStraightJoin')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('insertFromSelect')->willReturnSelf(); + $this->selectMock->expects($this->any())->method('__toString')->willReturn('string'); + + $this->connectionMock = $this->getMockBuilder('Magento\Framework\DB\Adapter\AdapterInterface')->getMock(); + $this->connectionMock->expects($this->any())->method('select')->willReturn($this->selectMock); + $this->connectionMock->expects($this->any())->method('query')->willReturn($this->zendDbMock); + + $this->resourceMock = $this->getMockBuilder('Magento\Framework\App\Resource') + ->disableOriginalConstructor() + ->getMock(); + $this->resourceMock->expects($this->any())->method('getConnection')->willReturn($this->connectionMock); + $this->resourceMock->expects($this->any())->method('getTableName')->will( + $this->returnCallback( + function ($arg) { + return $arg; + } + ) + ); + + $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\Context') + ->disableOriginalConstructor() + ->getMock(); + $this->contextMock->expects($this->any())->method('getResources')->willReturn($this->resourceMock); + + $this->loggerMock = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock(); + + $dateTime = $this->getMockBuilder('DateTime')->getMock(); + + $this->timezoneMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime\TimezoneInterface')->getMock(); + $this->timezoneMock->expects($this->any())->method('scopeDate')->willReturn($dateTime); + + $this->dateTimeMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime')->getMock(); + + $this->flagMock = $this->getMockBuilder('Magento\Reports\Model\Flag') + ->disableOriginalConstructor() + ->setMethods(['setReportFlagCode', 'unsetData', 'loadSelf', 'setFlagData', 'setLastUpdate', 'save']) + ->getMock(); + + $this->flagFactoryMock = $this->getMockBuilder('Magento\Reports\Model\FlagFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->flagFactoryMock->expects($this->any())->method('create')->willReturn($this->flagMock); + + $this->validatorMock = $this->getMockBuilder('Magento\Framework\Stdlib\DateTime\Timezone\Validator') + ->disableOriginalConstructor() + ->getMock(); + + $this->backendMock = $this->getMockBuilder('Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend') + ->disableOriginalConstructor() + ->getMock(); + + $this->attributeMock = $this->getMockBuilder('Magento\Eav\Model\Entity\Attribute\AbstractAttribute') + ->disableOriginalConstructor() + ->getMock(); + $this->attributeMock->expects($this->any())->method('getBackend')->willReturn($this->backendMock); + + $this->productMock = $this->getMockBuilder('Magento\Catalog\Model\Resource\Product') + ->disableOriginalConstructor() + ->getMock(); + $this->productMock->expects($this->any())->method('getAttribute')->willReturn($this->attributeMock); + + $this->helperMock = $this->getMockBuilder('Magento\Reports\Model\Resource\Helper') + ->disableOriginalConstructor() + ->getMock(); + + $this->viewed = new Viewed( + $this->contextMock, + $this->loggerMock, + $this->timezoneMock, + $this->flagFactoryMock, + $this->dateTimeMock, + $this->validatorMock, + $this->productMock, + $this->helperMock + ); + } + + /** + * @param mixed $from + * @param mixed $to + * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $truncateCount + * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $deleteCount + * @dataProvider intervalsDataProvider + * @return void + */ + public function testAggregate($from, $to, $truncateCount, $deleteCount) + { + $this->connectionMock->expects($truncateCount)->method('truncateTable'); + $this->connectionMock->expects($deleteCount)->method('delete'); + + $this->helperMock + ->expects($this->at(0)) + ->method('updateReportRatingPos') + ->with( + $this->connectionMock, + 'day', + 'views_num', + 'report_viewed_product_aggregated_daily', + 'report_viewed_product_aggregated_daily' + ) + ->willReturnSelf(); + $this->helperMock + ->expects($this->at(1)) + ->method('updateReportRatingPos') + ->with( + $this->connectionMock, + 'month', + 'views_num', + 'report_viewed_product_aggregated_daily', + 'report_viewed_product_aggregated_monthly' + ) + ->willReturnSelf(); + $this->helperMock + ->expects($this->at(2)) + ->method('updateReportRatingPos') + ->with( + $this->connectionMock, + 'year', + 'views_num', + 'report_viewed_product_aggregated_daily', + 'report_viewed_product_aggregated_yearly' + ) + ->willReturnSelf(); + + $this->flagMock->expects($this->once())->method('unsetData')->willReturnSelf(); + $this->flagMock->expects($this->once())->method('loadSelf')->willReturnSelf(); + $this->flagMock->expects($this->never())->method('setFlagData')->willReturnSelf(); + $this->flagMock->expects($this->once())->method('setLastUpdate')->willReturnSelf(); + $this->flagMock->expects($this->once())->method('save')->willReturnSelf(); + $this->flagMock + ->expects($this->once()) + ->method('setReportFlagCode') + ->with(\Magento\Reports\Model\Flag::REPORT_PRODUCT_VIEWED_FLAG_CODE) + ->willReturnSelf(); + + $this->viewed->aggregate($from, $to); + } + + /** + * @return array + */ + public function intervalsDataProvider() + { + return [ + [ + 'from' => new \DateTime('+3 day'), + 'to' => new \DateTime('-3 day'), + 'truncateCount' => $this->never(), + 'deleteCount' => $this->once() + ], + [ + 'from' => null, + 'to' => null, + 'truncateCount' => $this->once(), + 'deleteCount' => $this->never() + ] + ]; + } +} diff --git a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_grid.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_grid.xml index 9bed8390ecb4b1fd6325c9dd188cb7b8119b8d62..54e6a1f160b832aeaccbb69bc532f8ad31e7a676 100644 --- a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_grid.xml +++ b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_grid.xml @@ -46,8 +46,8 @@ <block class="Magento\Backend\Block\Widget\Grid\ColumnSet" as="grid.columnSet" name="adminhtml.report.grid.columnSet"> <arguments> <argument name="filter_visibility" xsi:type="string">0</argument> - <argument name="empty_text" xsi:type="string" translate="true">We couldn't find records for this period.</argument> - <argument name="empty_cell_label" xsi:type="string" translate="true">We couldn't find records for this period.</argument> + <argument name="empty_text" xsi:type="string" translate="true">We can't find records for this period.</argument> + <argument name="empty_cell_label" xsi:type="string" translate="true">We can't find records for this period.</argument> </arguments> <block class="Magento\Backend\Block\Widget\Grid\Column" as="period"> <arguments> diff --git a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_product_viewed.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_product_viewed.xml index a6934ca9a62a6d8ad0e15de0b3f1473eb57e54a6..fd28a5b1e15edbb99f804fc5fb295e6e5561f881 100644 --- a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_product_viewed.xml +++ b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_product_viewed.xml @@ -9,7 +9,7 @@ <body> <referenceBlock name="messages"> <action method="addNotice"> - <argument translate="true" name="message" xsi:type="string">This report uses timezone configuration data. Be sure to refresh lifetime statistics any time you change store timezone.</argument> + <argument translate="true" name="message" xsi:type="string">For accurate reporting, be sure to refresh lifetime statistics whenever you change the time zone.</argument> </action> </referenceBlock> <referenceContainer name="page.main.actions"> diff --git a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_coupons.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_coupons.xml index 9fad06da5ac336d781ca77d03fb2cee77c7ef3bc..d9492bf13287413446c5899ed87af1ac5cc55b4a 100644 --- a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_coupons.xml +++ b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_coupons.xml @@ -26,16 +26,16 @@ <block class="Magento\Sales\Block\Adminhtml\Report\Filter\Form\Coupon" name="grid.filter.form"> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">created_at_order</argument> - <argument translate="true" name="value" xsi:type="string">Order Created Date</argument> + <argument translate="true" name="value" xsi:type="string">Order Created</argument> </action> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">updated_at_order</argument> - <argument translate="true" name="value" xsi:type="string">Order Updated Date</argument> + <argument translate="true" name="value" xsi:type="string">Order Updated</argument> </action> <action method="setFieldOption"> <argument name="field" xsi:type="string">report_type</argument> <argument name="option" xsi:type="string">note</argument> - <argument translate="true" name="value" xsi:type="string">The Order Updated Date report is displayed in real-time, and does not need to be refreshed.</argument> + <argument translate="true" name="value" xsi:type="string">The Order Updated report is created in real time and does not require a refresh.</argument> </action> </block> </block> diff --git a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_invoiced.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_invoiced.xml index abeb8254e927eb2dd1c4081fbc42d9139432e6c6..ad48c082cfe6e21b3e2153275c89cd26485b4a64 100644 --- a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_invoiced.xml +++ b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_invoiced.xml @@ -26,7 +26,7 @@ <block class="Magento\Sales\Block\Adminhtml\Report\Filter\Form" name="grid.filter.form"> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">created_at_order</argument> - <argument translate="true" name="value" xsi:type="string">Order Created Date</argument> + <argument translate="true" name="value" xsi:type="string">Order Created</argument> </action> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">created_at_invoice</argument> diff --git a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_refunded.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_refunded.xml index 7191b7bae098ea7b2de1d7f83482dba389e257c5..174cbb1960dafa5ff32176c6c219fd85875d628a 100644 --- a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_refunded.xml +++ b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_refunded.xml @@ -26,7 +26,7 @@ <block class="Magento\Sales\Block\Adminhtml\Report\Filter\Form" name="grid.filter.form"> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">created_at_order</argument> - <argument translate="true" name="value" xsi:type="string">Order Created Date</argument> + <argument translate="true" name="value" xsi:type="string">Order Created</argument> </action> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">created_at_refunded</argument> diff --git a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_sales.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_sales.xml index 20c787a6010ffdc9bb8f5352c0e7282b95c93e1c..b4ce0c4f80af034e0358c518e358e5ac15099e89 100644 --- a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_sales.xml +++ b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_sales.xml @@ -26,16 +26,16 @@ <block class="Magento\Sales\Block\Adminhtml\Report\Filter\Form\Order" name="grid.filter.form"> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">created_at_order</argument> - <argument translate="true" name="value" xsi:type="string">Order Created Date</argument> + <argument translate="true" name="value" xsi:type="string">Order Created</argument> </action> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">updated_at_order</argument> - <argument translate="true" name="value" xsi:type="string">Order Updated Date</argument> + <argument translate="true" name="value" xsi:type="string">Order Updated</argument> </action> <action method="setFieldOption"> <argument name="field" xsi:type="string">report_type</argument> <argument name="option" xsi:type="string">note</argument> - <argument translate="true" name="value" xsi:type="string">The Order Updated Date report is displayed in real-time, and does not need to be refreshed.</argument> + <argument translate="true" name="value" xsi:type="string">The Order Updated report is created in real time and does not require a refresh.</argument> </action> </block> </block> diff --git a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_shipping.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_shipping.xml index 3093e769e52c38d7a2016eb84234fdb7f98cec0c..c959aef4d9c7cd9a6f671fd4321b15273d81a7cc 100644 --- a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_shipping.xml +++ b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_shipping.xml @@ -26,7 +26,7 @@ <block class="Magento\Sales\Block\Adminhtml\Report\Filter\Form" name="grid.filter.form"> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">created_at_order</argument> - <argument translate="true" name="value" xsi:type="string">Order Created Date</argument> + <argument translate="true" name="value" xsi:type="string">Order Created</argument> </action> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">created_at_shipment</argument> diff --git a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_tax.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_tax.xml index 96fecf243b9f8432431563d1b74fdfe6ed3ed363..09b29d402578de8d016e0b708da8855f3fbbcb69 100644 --- a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_tax.xml +++ b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_sales_tax.xml @@ -26,16 +26,16 @@ <block class="Magento\Sales\Block\Adminhtml\Report\Filter\Form" name="grid.filter.form"> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">created_at_order</argument> - <argument translate="true" name="value" xsi:type="string">Order Created Date</argument> + <argument translate="true" name="value" xsi:type="string">Order Created</argument> </action> <action method="addReportTypeOption"> <argument name="key" xsi:type="string">updated_at_order</argument> - <argument translate="true" name="value" xsi:type="string">Order Updated Date</argument> + <argument translate="true" name="value" xsi:type="string">Order Updated</argument> </action> <action method="setFieldOption"> <argument name="field" xsi:type="string">report_type</argument> <argument name="option" xsi:type="string">note</argument> - <argument translate="true" name="value" xsi:type="string">The Order Updated Date report is displayed in real-time, and does not need to be refreshed.</argument> + <argument translate="true" name="value" xsi:type="string">The Order Updated report is created in real time and does not require a refresh.</argument> </action> </block> </block> diff --git a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_statistics_index.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_statistics_index.xml index 38f42a0c5b7fce801e88783577ca91c65cc3a5a4..23ae6eece72ea06a4f257280f5db6eafdac92a7b 100644 --- a/app/code/Magento/Reports/view/adminhtml/layout/reports_report_statistics_index.xml +++ b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_statistics_index.xml @@ -26,12 +26,12 @@ <item name="refresh_lifetime" xsi:type="array"> <item name="label" xsi:type="string" translate="true">Refresh Lifetime Statistics</item> <item name="url" xsi:type="string">*/*/refreshLifetime</item> - <item name="confirm" xsi:type="string" translate="true">Are you sure you want to refresh lifetime statistics? There can be performance impact during this operation.</item> + <item name="confirm" xsi:type="string" translate="true">Are you sure you want to refresh lifetime statistics right now? This operation may slow down your customers' shopping experience.</item> </item> <item name="refresh_recent" xsi:type="array"> <item name="label" xsi:type="string" translate="true">Refresh Statistics for the Last Day</item> <item name="url" xsi:type="string">*/*/refreshRecent</item> - <item name="confirm" xsi:type="string" translate="true">Are you sure you want to refresh statistics for last day?</item> + <item name="confirm" xsi:type="string" translate="true">Are you sure you want to refresh statistics for the last day?</item> <item name="selected" xsi:type="string">1</item> </item> </argument> diff --git a/app/code/Magento/Reports/view/adminhtml/layout/reports_sales.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_sales.xml index 3b1c1e58ef687ef7994c96f3c9f64f778ca7accb..e0f2f895b510d22d78394c19ae11545268fb25cd 100644 --- a/app/code/Magento/Reports/view/adminhtml/layout/reports_sales.xml +++ b/app/code/Magento/Reports/view/adminhtml/layout/reports_sales.xml @@ -9,7 +9,7 @@ <body> <referenceBlock name="messages"> <action method="addNotice"> - <argument translate="true" name="message" xsi:type="string">This report uses timezone configuration data. Be sure to refresh lifetime statistics any time you change store timezone.</argument> + <argument translate="true" name="message" xsi:type="string">For accurate reporting, be sure to refresh lifetime statistics whenever you change the time zone.</argument> </action> </referenceBlock> </body> diff --git a/app/code/Magento/Review/Block/Adminhtml/Add.php b/app/code/Magento/Review/Block/Adminhtml/Add.php index 448ae442a99418545889e135253ac597f2999a8d..95d67d4765033ee62410eeaf43de6c01bcb0eeff 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Add.php +++ b/app/code/Magento/Review/Block/Adminhtml/Add.php @@ -124,6 +124,6 @@ class Add extends \Magento\Backend\Block\Widget\Form\Container */ public function getHeaderText() { - return __('Add New Review'); + return __('New Review'); } } diff --git a/app/code/Magento/Review/Block/Adminhtml/Add/Form.php b/app/code/Magento/Review/Block/Adminhtml/Add/Form.php index ef18b5786913d006ecc81f2b1870731cb9140440..92b8ba3a926417974a614064ea86af45c54c13ca 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Add/Form.php +++ b/app/code/Magento/Review/Block/Adminhtml/Add/Form.php @@ -93,7 +93,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'select_stores', 'multiselect', [ - 'label' => __('Visible In'), + 'label' => __('Visibility'), 'required' => true, 'name' => 'select_stores[]', 'values' => $this->_systemStore->getStoreValuesForForm() diff --git a/app/code/Magento/Review/Block/Adminhtml/Edit/Form.php b/app/code/Magento/Review/Block/Adminhtml/Edit/Form.php index e5904fd543c42c30bb50f9689fce036319b5b2c5..14abe1ebe9214c573529a3844af0a4d4f0f3cbfc 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Edit/Form.php +++ b/app/code/Magento/Review/Block/Adminhtml/Edit/Form.php @@ -125,7 +125,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic ? __('Administrator') : __('Guest'); } - $fieldset->addField('customer', 'note', ['label' => __('Posted By'), 'text' => $customerText]); + $fieldset->addField('customer', 'note', ['label' => __('Author'), 'text' => $customerText]); $fieldset->addField( 'summary_rating', @@ -167,7 +167,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'select_stores', 'multiselect', [ - 'label' => __('Visible In'), + 'label' => __('Visibility'), 'required' => true, 'name' => 'stores[]', 'values' => $this->_systemStore->getStoreValuesForForm() diff --git a/app/code/Magento/Review/Block/Adminhtml/Main.php b/app/code/Magento/Review/Block/Adminhtml/Main.php index cdad4bd6d3a487f60a302aab64507aea554a3c1f..513d0bd1179c824fc90c08d72b6533e98ffe633a 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Main.php +++ b/app/code/Magento/Review/Block/Adminhtml/Main.php @@ -67,7 +67,7 @@ class Main extends \Magento\Backend\Block\Widget\Grid\Container */ protected function _construct() { - $this->_addButtonLabel = __('Add New Review'); + $this->_addButtonLabel = __('New Review'); parent::_construct(); $this->_blockGroup = 'Magento_Review'; diff --git a/app/code/Magento/Review/Block/Adminhtml/Rating/Edit/Tab/Form.php b/app/code/Magento/Review/Block/Adminhtml/Rating/Edit/Tab/Form.php index 57989416a511c112eb1fcf563da0c1a6856c39ac..ac13b56d00bc949c13350102a0af6dec75496624 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Rating/Edit/Tab/Form.php +++ b/app/code/Magento/Review/Block/Adminhtml/Rating/Edit/Tab/Form.php @@ -206,7 +206,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'stores', 'multiselect', [ - 'label' => __('Visible In'), + 'label' => __('Visibility'), 'name' => 'stores[]', 'values' => $this->systemStore->getStoreValuesForForm() ] diff --git a/app/code/Magento/Review/Block/Adminhtml/Rss.php b/app/code/Magento/Review/Block/Adminhtml/Rss.php index 42f9ef5583d60292d488c3cb571d2adc8025ce2a..c1b6724e142b37cee9eb8d412dd98f87444dca2d 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Rss.php +++ b/app/code/Magento/Review/Block/Adminhtml/Rss.php @@ -66,7 +66,7 @@ class Rss extends \Magento\Backend\Block\AbstractBlock implements DataProviderIn $description = '<p>' . __('Product: <a href="%1" target="_blank">%2</a> <br/>', $url, $item->getName()) . __('Summary of review: %1 <br/>', $item->getTitle()) . __('Review: %1 <br/>', $item->getDetail()) . __('Store: %1 <br/>', $storeName) - . __('Click <a href="%1">here</a> to view the review.', $reviewUrl) + . __('Click <a href="%1">here</a> to see the review.', $reviewUrl) . '</p>'; $data['entries'][] = [ diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/JsonProductInfo.php b/app/code/Magento/Review/Controller/Adminhtml/Product/JsonProductInfo.php index c3f6aac9880b686116571e7f8b4f810c218fec9c..0e6cf178d82dc4407d1666f5fcc453917bf681b9 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/JsonProductInfo.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/JsonProductInfo.php @@ -53,7 +53,7 @@ class JsonProductInfo extends ProductController $response->setError(0); } else { $response->setError(1); - $response->setMessage(__('We can\'t get the product ID.')); + $response->setMessage(__('We can\'t retrieve the product ID.')); } /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->resultFactory->create(ResultFactory::TYPE_JSON); diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/MassDelete.php b/app/code/Magento/Review/Controller/Adminhtml/Product/MassDelete.php index 0783cec7e24ad8eed8a57281407ae1af04fcdfa1..6a64c6cf54982c84dfc5aff6be22f7f185db6a75 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/MassDelete.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/MassDelete.php @@ -31,7 +31,7 @@ class MassDelete extends ProductController } catch (LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addException($e, __('An error occurred while deleting record(s).')); + $this->messageManager->addException($e, __('Something went wrong while deleting these records.')); } } /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */ diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/MassUpdateStatus.php b/app/code/Magento/Review/Controller/Adminhtml/Product/MassUpdateStatus.php index 422806f2a6fbe4227ae53f92d75b077ae5806567..285503a236500d506b746217ec92bdfc685457c1 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/MassUpdateStatus.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/MassUpdateStatus.php @@ -34,7 +34,7 @@ class MassUpdateStatus extends ProductController } catch (\Exception $e) { $this->messageManager->addException( $e, - __('An error occurred while updating the selected review(s).') + __('Something went wrong while updating these review(s).') ); } } diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/MassVisibleIn.php b/app/code/Magento/Review/Controller/Adminhtml/Product/MassVisibleIn.php index 5dbd33f8ee81c1616535466c1f236136f6144f36..4e65891133acef664ab66b80293888f2a9246a9d 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/MassVisibleIn.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/MassVisibleIn.php @@ -35,7 +35,7 @@ class MassVisibleIn extends ProductController } catch (\Exception $e) { $this->messageManager->addException( $e, - __('An error occurred while updating the selected review(s).') + __('Something went wrong while updating these review(s).') ); } } diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/Post.php b/app/code/Magento/Review/Controller/Adminhtml/Product/Post.php index 6a332eb52ef8f5197c6de7190220fca0e1e32869..f6b7f24bffdbfb9bad62511a7a0a4df1c2d95f9d 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/Post.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/Post.php @@ -59,7 +59,7 @@ class Post extends ProductController } catch (LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addException($e, __('An error occurred while saving review.')); + $this->messageManager->addException($e, __('Something went wrong while saving this review.')); } } $resultRedirect->setPath('review/*/'); diff --git a/app/code/Magento/Review/Controller/Product/Post.php b/app/code/Magento/Review/Controller/Product/Post.php index 56260350b878f2e4186693d3abc56961cc5cfd5b..a68f0d18c3bc56a807f46cb6596a2e6324a67ee0 100644 --- a/app/code/Magento/Review/Controller/Product/Post.php +++ b/app/code/Magento/Review/Controller/Product/Post.php @@ -62,10 +62,10 @@ class Post extends ProductController } $review->aggregate(); - $this->messageManager->addSuccess(__('Your review has been accepted for moderation.')); + $this->messageManager->addSuccess(__('You submitted your review for moderation.')); } catch (\Exception $e) { $this->reviewSession->setFormData($data); - $this->messageManager->addError(__('We cannot post the review.')); + $this->messageManager->addError(__('We can\'t post your review right now.')); } } else { $this->reviewSession->setFormData($data); @@ -74,7 +74,7 @@ class Post extends ProductController $this->messageManager->addError($errorMessage); } } else { - $this->messageManager->addError(__('We cannot post the review.')); + $this->messageManager->addError(__('We can\'t post your review right now.')); } } } diff --git a/app/code/Magento/Review/Model/Review.php b/app/code/Magento/Review/Model/Review.php index 63405dde14c7588458537f1d9ee4f47a5e38dc8b..ec1d84b348e0b880a2b46e05827654c7dbc9b176 100644 --- a/app/code/Magento/Review/Model/Review.php +++ b/app/code/Magento/Review/Model/Review.php @@ -6,6 +6,7 @@ namespace Magento\Review\Model; use Magento\Catalog\Model\Product; +use Magento\Framework\Object\IdentityInterface; use Magento\Review\Model\Resource\Review\Product\Collection as ProductCollection; use Magento\Review\Model\Resource\Review\Status\Collection as StatusCollection; @@ -21,7 +22,7 @@ use Magento\Review\Model\Resource\Review\Status\Collection as StatusCollection; * @method \Magento\Review\Model\Review setStatusId(int $value) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ -class Review extends \Magento\Framework\Model\AbstractModel +class Review extends \Magento\Framework\Model\AbstractModel implements IdentityInterface { /** * Event prefix for observer @@ -263,15 +264,15 @@ class Review extends \Magento\Framework\Model\AbstractModel $errors = []; if (!\Zend_Validate::is($this->getTitle(), 'NotEmpty')) { - $errors[] = __('The review summary field can\'t be empty.'); + $errors[] = __('Please enter a review summary.'); } if (!\Zend_Validate::is($this->getNickname(), 'NotEmpty')) { - $errors[] = __('The nickname field can\'t be empty.'); + $errors[] = __('Please enter a nickname.'); } if (!\Zend_Validate::is($this->getDetail(), 'NotEmpty')) { - $errors[] = __('The review field can\'t be empty.'); + $errors[] = __('Please enter a review.'); } if (empty($errors)) { @@ -359,4 +360,18 @@ class Review extends \Magento\Framework\Model\AbstractModel { return $this->getResource()->getEntityIdByCode($entityCode); } + + /** + * Return unique ID(s) for each object in system + * + * @return array + */ + public function getIdentities() + { + $tags = []; + if ($this->isApproved() && $this->getEntityPkValue()) { + $tags[] = Product::CACHE_TAG . '_' . $this->getEntityPkValue(); + } + return $tags; + } } diff --git a/app/code/Magento/Review/Setup/InstallSchema.php b/app/code/Magento/Review/Setup/InstallSchema.php index 147688bdf15e3b7dbab52eefab5c1104c547a77a..a4cf7d27db30e0a3e21f21d66611353d442f1688 100644 --- a/app/code/Magento/Review/Setup/InstallSchema.php +++ b/app/code/Magento/Review/Setup/InstallSchema.php @@ -390,7 +390,7 @@ class InstallSchema implements InstallSchemaInterface \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, null, ['unsigned' => true, 'nullable' => false, 'default' => 0], - 'Rating Position On Frontend' + 'Rating Position On Storefront' ) ->addColumn( 'is_active', @@ -460,7 +460,7 @@ class InstallSchema implements InstallSchemaInterface \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, null, ['unsigned' => true, 'nullable' => false, 'default' => 0], - 'Ration option position on frontend' + 'Ration option position on Storefront' ) ->addIndex( $installer->getIdxName('rating_option', ['rating_id']), diff --git a/app/code/Magento/Review/Test/Unit/Controller/Product/PostTest.php b/app/code/Magento/Review/Test/Unit/Controller/Product/PostTest.php index 5d1c1884335c7876991395067ccd25f9d84e81d6..9cedb87e15afe212c3dd428b623a7d1c95a3f1c5 100644 --- a/app/code/Magento/Review/Test/Unit/Controller/Product/PostTest.php +++ b/app/code/Magento/Review/Test/Unit/Controller/Product/PostTest.php @@ -309,7 +309,7 @@ class PostTest extends \PHPUnit_Framework_TestCase $this->review->expects($this->once())->method('aggregate') ->willReturnSelf(); $this->messageManager->expects($this->once())->method('addSuccess') - ->with(__('Your review has been accepted for moderation.')) + ->with(__('You submitted your review for moderation.')) ->willReturnSelf(); $this->reviewSession->expects($this->once())->method('getRedirectUrl') ->with(true) diff --git a/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php b/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php index e96842c2cc28601dd771445269d924f42cd51d01..4be052abd03baebb2d5125ab1662c30f99acd5bc 100644 --- a/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php +++ b/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php @@ -6,6 +6,7 @@ namespace Magento\Review\Test\Unit\Model; +use \Magento\Catalog\Model\Product; use \Magento\Review\Model\Review; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; @@ -270,4 +271,15 @@ class ReviewTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue($result)); $this->assertSame($result, $this->review->getEntityIdByCode($entityCode)); } + + public function testGetIdentities() + { + $this->review->setStatusId(Review::STATUS_PENDING); + $this->assertEmpty($this->review->getIdentities()); + + $productId = 1; + $this->review->setEntityPkValue($productId); + $this->review->setStatusId(Review::STATUS_APPROVED); + $this->assertEquals([Product::CACHE_TAG . '_' . $productId], $this->review->getIdentities()); + } } diff --git a/app/code/Magento/Review/view/frontend/layout/review_product_listajax.xml b/app/code/Magento/Review/view/frontend/layout/review_product_listajax.xml index 3af29a203ff8ff030ae04b5fa2dc651de88f9a5b..0f950489f8aae9dc1c8c8405a6c1c7a5adbf076a 100644 --- a/app/code/Magento/Review/view/frontend/layout/review_product_listajax.xml +++ b/app/code/Magento/Review/view/frontend/layout/review_product_listajax.xml @@ -7,7 +7,7 @@ --> <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/layout_generic.xsd"> <container name="root"> - <block class="Magento\Review\Block\Product\View\ListView" name="product.info.product_additional_data" as="product_additional_data" template="product/view/list.phtml"/> + <block class="Magento\Review\Block\Product\View\ListView" name="product.info.product_additional_data" as="product_additional_data" template="product/view/list.phtml" /> <block class="Magento\Theme\Block\Html\Pager" name="product_review_list.toolbar"> <arguments> <argument name="show_per_page" xsi:type="boolean">false</argument> diff --git a/app/code/Magento/Review/view/frontend/templates/customer/list.phtml b/app/code/Magento/Review/view/frontend/templates/customer/list.phtml index e90990095151a90e6277319328689994401f1534..4bd18e568a214634543a9d7ceb706ca8af18865e 100644 --- a/app/code/Magento/Review/view/frontend/templates/customer/list.phtml +++ b/app/code/Magento/Review/view/frontend/templates/customer/list.phtml @@ -44,7 +44,7 @@ </td> <td data-th="<?php echo $block->escapeHtml(__('Actions')) ?>" class="col actions"> <a href="<?php echo $block->getReviewLink() ?>id/<?php echo $_review->getReviewId() ?>" class="action more"> - <span><?php echo __('View Details') ?></span> + <span><?php echo __('See Details') ?></span> </a> </td> </tr> diff --git a/app/code/Magento/Review/view/frontend/templates/form.phtml b/app/code/Magento/Review/view/frontend/templates/form.phtml index 958cbe2e1de960919bc515c33f5f310b3a28ef20..9d98fdeef3d853bd3606f136c84f8f8b9a15aad4 100644 --- a/app/code/Magento/Review/view/frontend/templates/form.phtml +++ b/app/code/Magento/Review/view/frontend/templates/form.phtml @@ -109,7 +109,7 @@ require([ <?php else: ?> <div class="message info notlogged" id="review-form"> <div> - <?php echo __('Only registered users can write reviews. Please, <a href="%1">log in</a> or <a href="%2">register</a>', $block->getLoginLink(), $block->getRegisterUrl()) ?> + <?php echo __('Only registered users can write reviews. Please, <a href="%1">Sign in</a> or <a href="%2">create an account</a>', $block->getLoginLink(), $block->getRegisterUrl()) ?> </div> </div> <?php endif ?> diff --git a/app/code/Magento/Rule/Model/AbstractModel.php b/app/code/Magento/Rule/Model/AbstractModel.php index 8aedb81590ed17eb55dc379c90a3058160af320a..375c4180106991ac0a47ee2b5c069d84c11dd2b9 100644 --- a/app/code/Magento/Rule/Model/AbstractModel.php +++ b/app/code/Magento/Rule/Model/AbstractModel.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - /** * Abstract Rule entity data model */ @@ -63,16 +61,22 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel abstract public function getActionsInstance(); /** + * Form factory + * * @var \Magento\Framework\Data\FormFactory */ protected $_formFactory; /** + * Timezone instance + * * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface */ protected $_localeDate; /** + * Constructor + * * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\Data\FormFactory $formFactory @@ -107,7 +111,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel // Check if discount amount not negative if ($this->hasDiscountAmount()) { if ((int)$this->getDiscountAmount() < 0) { - throw new \Magento\Framework\Exception\LocalizedException(__('Invalid discount amount.')); + throw new \Magento\Framework\Exception\LocalizedException(__('Please choose a valid discount amount.')); } } @@ -233,7 +237,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel */ protected function _resetConditions($conditions = null) { - if (is_null($conditions)) { + if (null === $conditions) { $conditions = $this->getConditionsInstance(); } $conditions->setRule($this)->setId('1')->setPrefix('conditions'); @@ -250,7 +254,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel */ protected function _resetActions($actions = null) { - if (is_null($actions)) { + if (null === $actions) { $actions = $this->getActionsInstance(); } $actions->setRule($this)->setId('1')->setPrefix('actions'); @@ -373,13 +377,13 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel if ($object->hasWebsiteIds()) { $websiteIds = $object->getWebsiteIds(); if (empty($websiteIds)) { - $result[] = __('Websites must be specified.'); + $result[] = __('Please specify a website.'); } } if ($object->hasCustomerGroupIds()) { $customerGroupIds = $object->getCustomerGroupIds(); if (empty($customerGroupIds)) { - $result[] = __('Customer Groups must be specified.'); + $result[] = __('Please specify Customer Groups.'); } } @@ -390,6 +394,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * Check availability to delete rule * * @return bool + * @codeCoverageIgnore */ public function isDeleteable() { @@ -401,6 +406,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * * @param bool $value * @return $this + * @codeCoverageIgnore */ public function setIsDeleteable($value) { @@ -412,6 +418,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * Check if rule is readonly * * @return bool + * @codeCoverageIgnore */ public function isReadonly() { @@ -423,6 +430,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * * @param bool $value * @return $this + * @codeCoverageIgnore */ public function setIsReadonly($value) { diff --git a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php index 79c0ebe18c8af49cb581e0a354194430cf65d83d..8b2df7adff1f6a830ec0ecf77e90625a4f2a0f31 100644 --- a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php +++ b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php @@ -153,7 +153,7 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon */ protected function _addSpecialAttributes(array &$attributes) { - $attributes['attribute_set_id'] = __('Attribute Set'); + $attributes['attribute_set_id'] = __('Product Template'); $attributes['category_ids'] = __('Category'); } diff --git a/app/code/Magento/Rule/Test/Unit/Model/Condition/Product/AbstractProductTest.php b/app/code/Magento/Rule/Test/Unit/Model/Condition/Product/AbstractProductTest.php index 32d0b012c88418f6e18656975357f3d17a9461f1..7c628927f6c15426dba5042fa02316cb428864bd 100644 --- a/app/code/Magento/Rule/Test/Unit/Model/Condition/Product/AbstractProductTest.php +++ b/app/code/Magento/Rule/Test/Unit/Model/Condition/Product/AbstractProductTest.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Rule\Test\Unit\Model\Condition\Product; use ReflectionMethod; @@ -14,24 +12,30 @@ use ReflectionProperty; class AbstractProductTest extends \PHPUnit_Framework_TestCase { /** - * @var AbstractProduct|\PHPUnit_Framework_MockObject_MockObject + * Tested condition + * + * @var \Magento\Rule\Model\Condition\Product\AbstractProduct|\PHPUnit_Framework_MockObject_MockObject */ protected $_condition; /** + * Framework object + * * @var \Magento\Framework\Object|\PHPUnit_Framework_MockObject_MockObject */ protected $_object; /** + * Reflection for Magento\Rule\Model\Condition\Product\AbstractProduct::$_entityAttributeValues + * * @var \ReflectionProperty - * 'Magento\Rule\Model\Condition\Product\AbstractProduct::_entityAttributeValues' */ protected $_entityAttributeValuesProperty; /** + * Reflection for Magento\Rule\Model\Condition\Product\AbstractProduct::$_config + * * @var \ReflectionProperty - * 'Magento\Rule\Model\Condition\Product\AbstractProduct::_config' */ protected $_configProperty; @@ -159,8 +163,10 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase $this->_condition, $this->getMock('Magento\Eav\Model\Config', [], [], '', false) ); - $this->_entityAttributeValuesProperty->setValue($this->_condition, - $this->getMock('Magento\Eav\Model\Config', [], [], '', false)); + $this->_entityAttributeValuesProperty->setValue( + $this->_condition, + $this->getMock('Magento\Eav\Model\Config', [], [], '', false) + ); $attribute = new \Magento\Framework\Object(); $attribute->setBackendType('datetime'); @@ -306,7 +312,7 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); $attrObjectSourceMock - ->expects(is_null($expectedAttrObjSourceAllOptionsParam) ? $this->never() : $this->once()) + ->expects((null === $expectedAttrObjSourceAllOptionsParam) ? $this->never() : $this->once()) ->method('getAllOptions') ->with($expectedAttrObjSourceAllOptionsParam) ->willReturn($attrObjectSourceAllOptionsValue); @@ -317,7 +323,7 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase ->getMock(); $attributeObjectMock->method('usesSource')->willReturn(true); $attributeObjectMock - ->expects(is_null($attributeObjectFrontendInput) ? $this->never() : $this->once()) + ->expects((null === $attributeObjectFrontendInput) ? $this->never() : $this->once()) ->method('getFrontendInput') ->willReturn($attributeObjectFrontendInput); $attributeObjectMock->method('getSource')->willReturn($attrObjectSourceMock); @@ -345,12 +351,14 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase $attrSetCollectionValueMock->method('setEntityTypeFilter')->will($this->returnSelf()); $attrSetCollectionValueMock->method('load')->will($this->returnSelf()); $attrSetCollectionValueMock - ->expects(is_null($attrSetCollectionOptionsArray) ? $this->never() : $this->once()) + ->expects((null === $attrSetCollectionOptionsArray) ? $this->never() : $this->once()) ->method('toOptionArray') ->willReturn($attrSetCollectionOptionsArray); - $attrSetCollectionProperty = - new ReflectionProperty('Magento\Rule\Model\Condition\Product\AbstractProduct', '_attrSetCollection'); + $attrSetCollectionProperty = new ReflectionProperty( + 'Magento\Rule\Model\Condition\Product\AbstractProduct', + '_attrSetCollection' + ); $attrSetCollectionProperty->setAccessible(true); $attrSetCollectionProperty->setValue($this->_condition, $attrSetCollectionValueMock); @@ -366,6 +374,8 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase } /** + * Data provider for prepare value options + * * @return array * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ diff --git a/app/code/Magento/Rule/view/adminhtml/web/rules.js b/app/code/Magento/Rule/view/adminhtml/web/rules.js index 066ef829a2797abad1a1feb86d71e4fd7f51a1fb..262d155a53cd14cec982876aa37396a31a403b37 100644 --- a/app/code/Magento/Rule/view/adminhtml/web/rules.js +++ b/app/code/Magento/Rule/view/adminhtml/web/rules.js @@ -265,7 +265,7 @@ define([ var new_type = elem.value; var new_elem = document.createElement('LI'); new_elem.className = 'rule-param-wait'; - new_elem.innerHTML = jQuery.mage.__('Please wait, loading...'); + new_elem.innerHTML = jQuery.mage.__('This won\'t take long . . .'); children_ul.insertBefore(new_elem, $(elem).up('li')); new Ajax.Request(this.newChildUrl, { diff --git a/app/code/Magento/Sales/Block/Adminhtml/Items/AbstractItems.php b/app/code/Magento/Sales/Block/Adminhtml/Items/AbstractItems.php index b1b0a7de53bf916bde93fcbde76c208375b660e5..dc79dd5a7de51b758c6e037abd92bf8956cb9a98 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Items/AbstractItems.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Items/AbstractItems.php @@ -10,6 +10,7 @@ use Magento\Sales\Model\Order\Creditmemo\Item; /** * Abstract items renderer + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class AbstractItems extends \Magento\Backend\Block\Template { @@ -227,7 +228,7 @@ class AbstractItems extends \Magento\Backend\Block\Template return $this->getItem()->getOrder(); } - throw new \Magento\Framework\Exception\LocalizedException(__('We cannot get the order instance.')); + throw new \Magento\Framework\Exception\LocalizedException(__('We can\'t get the order instance right now.')); } /** diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/AbstractOrder.php b/app/code/Magento/Sales/Block/Adminhtml/Order/AbstractOrder.php index 20fc1d42baaf68d9af98cc251c31e81d424d0fc7..0539d5cb195dc651095c3c48b629284cf63ac7b2 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Order/AbstractOrder.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Order/AbstractOrder.php @@ -62,7 +62,7 @@ class AbstractOrder extends \Magento\Backend\Block\Widget if ($this->_coreRegistry->registry('order')) { return $this->_coreRegistry->registry('order'); } - throw new \Magento\Framework\Exception\LocalizedException(__('We cannot get the order instance.')); + throw new \Magento\Framework\Exception\LocalizedException(__('We can\'t get the order instance right now.')); } /** diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/Creditmemo/View.php b/app/code/Magento/Sales/Block/Adminhtml/Order/Creditmemo/View.php index b83a8eb2ef0b9b3427f0ec74b868f3d34c7f23aa..57c74c61cb16d769c5245e2f1e4cc6cf9cf56ee6 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Order/Creditmemo/View.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Creditmemo/View.php @@ -72,7 +72,7 @@ class View extends \Magento\Backend\Block\Widget\Form\Container 'label' => __('Send Email'), 'class' => 'send-email', 'onclick' => 'confirmSetLocation(\'' . __( - 'Are you sure you want to send a Credit memo email to customer?' + 'Are you sure you want to send a credit memo email to customer?' ) . '\', \'' . $this->getEmailUrl() . '\')' ] ); @@ -130,9 +130,9 @@ class View extends \Magento\Backend\Block\Widget\Form\Container public function getHeaderText() { if ($this->getCreditmemo()->getEmailSent()) { - $emailSent = __('The credit memo email was sent'); + $emailSent = __('The credit memo email was sent.'); } else { - $emailSent = __('the credit memo email is not sent'); + $emailSent = __('The credit memo email wasn\'t sent.'); } return __( 'Credit Memo #%1 | %3 | %2 (%4)', diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/Invoice/View.php b/app/code/Magento/Sales/Block/Adminhtml/Order/Invoice/View.php index eb1570d96db2dd355d0c29e3f930a659754ae494..c3f359585a804a18286aea87a44a58c0203f0b8f 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Order/Invoice/View.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Invoice/View.php @@ -98,7 +98,7 @@ class View extends \Magento\Backend\Block\Widget\Form\Container 'label' => __('Send Email'), 'class' => 'send-email', 'onclick' => 'confirmSetLocation(\'' . __( - 'Are you sure you want to send an Invoice email to customer?' + 'Are you sure you want to send an invoice email to customer?' ) . '\', \'' . $this->getEmailUrl() . '\')' ] ); @@ -189,9 +189,9 @@ class View extends \Magento\Backend\Block\Widget\Form\Container public function getHeaderText() { if ($this->getInvoice()->getEmailSent()) { - $emailSent = __('the invoice email was sent'); + $emailSent = __('The invoice email was sent.'); } else { - $emailSent = __('the invoice email is not sent'); + $emailSent = __('The invoice email wasn\'t sent.'); } return __( 'Invoice #%1 | %2 | %4 (%3)', diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/Status/Assign/Form.php b/app/code/Magento/Sales/Block/Adminhtml/Order/Status/Assign/Form.php index f99d6e2e6eaa936257690f3d33a8fab084822f3d..b27fa8fdb163cfb29290caecff90471bc088cf5b 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Order/Status/Assign/Form.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Status/Assign/Form.php @@ -107,7 +107,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic $fieldset->addField( 'visible_on_front', 'checkbox', - ['name' => 'visible_on_front', 'label' => __('Visible On Frontend'), 'value' => 1] + ['name' => 'visible_on_front', 'label' => __('Visible On Storefront'), 'value' => 1] ); $form->setAction($this->getUrl('sales/order_status/assignPost')); diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/View/Tabs.php b/app/code/Magento/Sales/Block/Adminhtml/Order/View/Tabs.php index 4f1ce86eafb4f2aa1a0ae96b3cf238f0aa0e350c..b8ecb49e9a4f1f5cd204ed76b44f0f930d37da7b 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Order/View/Tabs.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Order/View/Tabs.php @@ -52,7 +52,7 @@ class Tabs extends \Magento\Backend\Block\Widget\Tabs if ($this->_coreRegistry->registry('order')) { return $this->_coreRegistry->registry('order'); } - throw new \Magento\Framework\Exception\LocalizedException(__('We cannot get the order instance.')); + throw new \Magento\Framework\Exception\LocalizedException(__('We can\'t get the order instance right now.')); } /** diff --git a/app/code/Magento/Sales/Controller/AbstractController/Reorder.php b/app/code/Magento/Sales/Controller/AbstractController/Reorder.php index d2a5e2d42be54c0831b2c47fb201d948cb2d3811..bf86825d8b4739e20c19dd481efd5e03ec0e3ed8 100644 --- a/app/code/Magento/Sales/Controller/AbstractController/Reorder.php +++ b/app/code/Magento/Sales/Controller/AbstractController/Reorder.php @@ -65,7 +65,7 @@ abstract class Reorder extends Action\Action } return $resultRedirect->setPath('*/*/history'); } catch (\Exception $e) { - $this->messageManager->addException($e, __('We can\'t add this item to your cart right now.')); + $this->messageManager->addException($e, __('We can\'t add this item to your shopping cart right now.')); return $resultRedirect->setPath('checkout/cart'); } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php index 34dc5bbb8af0e9882bf3cc447954b74272739f91..98a3b5200f70fdae06bee13288a077e8363c2fd6 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php @@ -38,7 +38,7 @@ class Email extends \Magento\Backend\App\Action $this->_objectManager->create('Magento\Sales\Model\Order\CreditmemoNotifier') ->notify($creditmemo); - $this->messageManager->addSuccess(__('We sent the message.')); + $this->messageManager->addSuccess(__('You sent the message.')); $resultRedirect = $this->resultRedirectFactory->create(); $resultRedirect->setPath('sales/order_creditmemo/view', ['creditmemo_id' => $creditmemoId]); return $resultRedirect; diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php index 99e666227efba778c92577ae1523591edd420b5e..8436c8f1ceb3b036052d60d19891094bd9e8d1cc 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php @@ -59,7 +59,7 @@ abstract class Email extends \Magento\Backend\App\Action $this->_objectManager->create('Magento\Sales\Model\Order\InvoiceNotifier') ->notify($invoice); - $this->messageManager->addSuccess(__('We sent the message.')); + $this->messageManager->addSuccess(__('You sent the message.')); return $this->resultRedirectFactory->create()->setPath( 'sales/invoice/view', ['order_id' => $invoice->getOrder()->getId(), 'invoice_id' => $invoiceId] diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order.php b/app/code/Magento/Sales/Controller/Adminhtml/Order.php index 4685341ddef97abe8fb366fb3eaa6c50dd351d30..0bf5c59a46e1c4b5b5fd50b90fc951e7059960a9 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order.php @@ -124,47 +124,10 @@ class Order extends \Magento\Backend\App\Action } /** - * Acl check for admin - * * @return bool - * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ protected function _isAllowed() { - $action = strtolower($this->getRequest()->getActionName()); - switch ($action) { - case 'hold': - $aclResource = 'Magento_Sales::hold'; - break; - case 'unhold': - $aclResource = 'Magento_Sales::unhold'; - break; - case 'email': - $aclResource = 'Magento_Sales::email'; - break; - case 'cancel': - $aclResource = 'Magento_Sales::cancel'; - break; - case 'view': - $aclResource = 'Magento_Sales::actions_view'; - break; - case 'addcomment': - $aclResource = 'Magento_Sales::comment'; - break; - case 'creditmemos': - $aclResource = 'Magento_Sales::creditmemo'; - break; - case 'reviewpayment': - $aclResource = 'Magento_Sales::review_payment'; - break; - case 'address': - case 'addresssave': - $aclResource = 'Magento_Sales::actions_edit'; - break; - default: - $aclResource = 'Magento_Sales::sales_order'; - break; - } - return $this->_authorization->isAllowed($aclResource); + return $this->_authorization->isAllowed('Magento_Sales::sales_order'); } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php index c88e58bfe004ebb0278ba5883e0479eb953f6cf1..29729f850bb64f28e2975694d24893c6eb428f66 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php @@ -23,7 +23,7 @@ class AddComment extends \Magento\Sales\Controller\Adminhtml\Order try { $data = $this->getRequest()->getPost('history'); if (empty($data['comment']) && $data['status'] == $order->getDataByKey('status')) { - throw new \Magento\Framework\Exception\LocalizedException(__('Comment text cannot be empty.')); + throw new \Magento\Framework\Exception\LocalizedException(__('Please enter a comment.')); } $notify = isset($data['is_customer_notified']) ? $data['is_customer_notified'] : false; @@ -57,4 +57,12 @@ class AddComment extends \Magento\Sales\Controller\Adminhtml\Order } return $this->resultRedirectFactory->create()->setPath('sales/*/'); } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::comment'); + } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Address.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Address.php index 0b5697e7c48df8dde275940d77a5f396f0f223e9..18fdf29cf80249ca881eee3e90267467492e7627 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Address.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Address.php @@ -31,4 +31,12 @@ class Address extends \Magento\Sales\Controller\Adminhtml\Order return $this->resultRedirectFactory->create()->setPath('sales/*/'); } } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::actions_edit'); + } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php index 6e0b2251ced14346b0fdc6be79a76da4f440b21d..e3d15fd93cdd6765c1c3aa3739603db07ac23f95 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php @@ -28,11 +28,19 @@ class AddressSave extends \Magento\Sales\Controller\Adminhtml\Order } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addException($e, __('Something went wrong updating the order address.')); + $this->messageManager->addException($e, __('We can\'t update the order address right now.')); } return $resultRedirect->setPath('sales/*/address', ['address_id' => $address->getId()]); } else { return $resultRedirect->setPath('sales/*/'); } } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::actions_edit'); + } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Cancel.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Cancel.php index 54b3294c89d0d9ee6b67b402a3857874e3d2e3e4..263edb51310c26e05ee7d0284f5e776df89ca6a8 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Cancel.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Cancel.php @@ -31,4 +31,12 @@ class Cancel extends \Magento\Sales\Controller\Adminhtml\Order } return $resultRedirect->setPath('sales/*/'); } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::cancel'); + } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php index 832aed45797e962b32264d1681ca979fee5cfe8c..a3cf6e6a308daa223a30d5eebc42634866858835 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php @@ -79,7 +79,7 @@ class AddComment extends \Magento\Backend\App\Action $data = $this->getRequest()->getPost('comment'); if (empty($data['comment'])) { throw new \Magento\Framework\Exception\LocalizedException( - __('The Comment Text field cannot be empty.') + __('Please enter a comment.') ); } $this->creditmemoLoader->setOrderId($this->getRequest()->getParam('order_id')); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php index dbbd9dd55e33e64ae70286cadd0111f9a54d363b..b9eff656be6728ebb9c4cad5fe1905af2de73556 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php @@ -77,7 +77,7 @@ class Save extends \Magento\Backend\App\Action if ($creditmemo) { if (!$creditmemo->isValidGrandTotal()) { throw new \Magento\Framework\Exception\LocalizedException( - __('Credit memo\'s total must be positive.') + __('The credit memo\'s total must be positive.') ); } @@ -138,7 +138,7 @@ class Save extends \Magento\Backend\App\Action $this->_getSession()->setFormData($data); } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); - $this->messageManager->addError(__('Cannot save the credit memo.')); + $this->messageManager->addError(__('We can\'t save the credit memo right now.')); } $resultRedirect->setPath('sales/*/new', ['_current' => true]); return $resultRedirect; diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/UpdateQty.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/UpdateQty.php index 1757fdfb80248f31624fc10e1207faddee02f27d..38068b10918bbcaf2fcf5fbeb1d9e808b059d7e8 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/UpdateQty.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/UpdateQty.php @@ -76,7 +76,7 @@ class UpdateQty extends \Magento\Backend\App\Action } catch (\Magento\Framework\Exception\LocalizedException $e) { $response = ['error' => true, 'message' => $e->getMessage()]; } catch (\Exception $e) { - $response = ['error' => true, 'message' => __('Cannot update the item\'s quantity.')]; + $response = ['error' => true, 'message' => __('We can\'t update the item\'s quantity right now.')]; } if (is_array($response)) { $resultJson = $this->resultJsonFactory->create(); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/CreditmemoLoader.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/CreditmemoLoader.php index 4468f01f7e68ce0a11579e15313013d6491dac8a..c40b1b99506b0bb9a98c0e356e299b60f9665434 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/CreditmemoLoader.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/CreditmemoLoader.php @@ -144,7 +144,7 @@ class CreditmemoLoader extends Object * Check creditmemo create availability */ if (!$order->canCreditmemo()) { - $this->messageManager->addError(__('Cannot create credit memo for the order.')); + $this->messageManager->addError(__('We can\'t create credit memo for the order.')); return false; } return true; diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemos.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemos.php index 47634d33a81630d3a05cc467e1e8e7eecbd5f89c..46571b222f35c858a46f05b4f39f9abca3524cab 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemos.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemos.php @@ -18,4 +18,12 @@ class Creditmemos extends \Magento\Sales\Controller\Adminhtml\Order $resultLayout = $this->resultLayoutFactory->create(); return $resultLayout; } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::creditmemo'); + } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php index e83f6436f4715e18fb3df663a5709f956ddf23a9..e2dce6e111b8e8f20ae63957db473560fffbfc6e 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php @@ -22,11 +22,19 @@ class Email extends \Magento\Sales\Controller\Adminhtml\Order } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addError(__('We couldn\'t send the email order.')); + $this->messageManager->addError(__('We can\'t send the email order right now.')); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } return $this->resultRedirectFactory->create()->setPath('sales/order/view', ['order_id' => $order->getId()]); } return $this->resultRedirectFactory->create()->setPath('sales/*/'); } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::email'); + } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Hold.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Hold.php index 3f295b391bd4f56ce4b1502114297d80727b7d53..58a54b87f0ed9820b4a98acbaa5ca16692118603 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Hold.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Hold.php @@ -31,4 +31,12 @@ class Hold extends \Magento\Sales\Controller\Adminhtml\Order $resultRedirect->setPath('sales/*/'); return $resultRedirect; } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::hold'); + } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php index 74011a35d81ec6170dfb86c740101e0db0e89736..2be526b212971230a0754cb3008333f23699c2ed 100755 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php @@ -74,7 +74,7 @@ class AddComment extends \Magento\Sales\Controller\Adminhtml\Invoice\AbstractInv $this->getRequest()->setParam('invoice_id', $this->getRequest()->getParam('id')); $data = $this->getRequest()->getPost('comment'); if (empty($data['comment'])) { - throw new LocalizedException(__('The Comment Text field cannot be empty.')); + throw new LocalizedException(__('Please enter a comment.')); } $invoice = $this->getInvoice(); if (!$invoice) { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/NewAction.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/NewAction.php index f7db6d19da3c1cea5dc45817cf69a1972eac2bd6..b0a7f1ed4d2ad0a7f258f8ff483685d9aa1bcfe3 100755 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/NewAction.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/NewAction.php @@ -89,7 +89,7 @@ class NewAction extends \Magento\Backend\App\Action if (!$invoice->getTotalQty()) { throw new \Magento\Framework\Exception\LocalizedException( - __('Cannot create an invoice without products.') + __('You can\'t create an invoice without products.') ); } $this->registry->register('current_invoice', $invoice); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php index 3758ad060f0dcb4c6714cac12fa1ad9d41b7540e..a30fcb59b995ecf63884f5cb9b435aef624000c2 100755 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php @@ -134,12 +134,12 @@ class Save extends \Magento\Backend\App\Action ->prepareInvoice($invoiceItems); if (!$invoice) { - throw new LocalizedException(__('We can\'t save the invoice.')); + throw new LocalizedException(__('We can\'t save the invoice right now.')); } if (!$invoice->getTotalQty()) { throw new \Magento\Framework\Exception\LocalizedException( - __('Cannot create an invoice without products.') + __('You can\'t create an invoice without products.') ); } $this->registry->register('current_invoice', $invoice); @@ -199,7 +199,7 @@ class Save extends \Magento\Backend\App\Action } } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); - $this->messageManager->addError(__('We can\'t send the invoice email.')); + $this->messageManager->addError(__('We can\'t send the invoice email right now.')); } if ($shipment) { try { @@ -208,7 +208,7 @@ class Save extends \Magento\Backend\App\Action } } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); - $this->messageManager->addError(__('We can\'t send the shipment.')); + $this->messageManager->addError(__('We can\'t send the shipment right now.')); } } $this->_objectManager->get('Magento\Backend\Model\Session')->getCommentText(true); @@ -216,7 +216,7 @@ class Save extends \Magento\Backend\App\Action } catch (LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addError(__('We can\'t save the invoice.')); + $this->messageManager->addError(__('We can\'t save the invoice right now.')); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } return $resultRedirect->setPath('sales/*/new', ['order_id' => $orderId]); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/UpdateQty.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/UpdateQty.php index 38d563101cb4f39051ddca879370da9b8e9fe45b..85c51e0934339b4fc35b6921240cea8dd9fe84b2 100755 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/UpdateQty.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/UpdateQty.php @@ -82,7 +82,7 @@ class UpdateQty extends \Magento\Sales\Controller\Adminhtml\Invoice\AbstractInvo if (!$invoice->getTotalQty()) { throw new \Magento\Framework\Exception\LocalizedException( - __('Cannot create an invoice without products.') + __('You can\'t create an invoice without products.') ); } $this->registry->register('current_invoice', $invoice); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php index 83c87cd3c45b44e424168b4fdee2a7a3dc171411..5373f40402736e30b617017e230aad9e391caba0 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php @@ -47,10 +47,18 @@ class ReviewPayment extends \Magento\Sales\Controller\Adminhtml\Order } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addError(__('We couldn\'t update the payment.')); + $this->messageManager->addError(__('We can\'t update the payment right now.')); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } $resultRedirect->setPath('sales/order/view', ['order_id' => $order->getId()]); return $resultRedirect; } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::review_payment'); + } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/AssignPost.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/AssignPost.php index 43cc5fd46cde3c18591b704602143a9c55cf167a..a77c6dc3cc642e6429785b8303ae4da801015f7b 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/AssignPost.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/AssignPost.php @@ -26,14 +26,14 @@ class AssignPost extends \Magento\Sales\Controller\Adminhtml\Order\Status if ($status && $status->getStatus()) { try { $status->assignState($state, $isDefault, $visibleOnFront); - $this->messageManager->addSuccess(__('You have assigned the order status.')); + $this->messageManager->addSuccess(__('You assigned the order status.')); return $resultRedirect->setPath('sales/*/'); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addException( $e, - __('An error occurred while assigning order status. Status has not been assigned.') + __('Something went wrong while assigning the order status.') ); } } else { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Save.php index 65535942a16d6e35ff98957769fc6361589e4169..efd73d7a2b34ee9a655b618aebef0e5928b65e88 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Save.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Save.php @@ -45,14 +45,14 @@ class Save extends \Magento\Sales\Controller\Adminhtml\Order\Status try { $status->save(); - $this->messageManager->addSuccess(__('You have saved the order status.')); + $this->messageManager->addSuccess(__('You saved the order status.')); return $resultRedirect->setPath('sales/*/'); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addException( $e, - __('We couldn\'t add your order status because something went wrong saving.') + __('We can\'t add the order status right now.') ); } $this->_getSession()->setFormData($data); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Unassign.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Unassign.php index 6debca9cf31421407735213157c0d72761719f5e..e44b4f5e48eef040ded0a53c5a8ca9cfb6714d48 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Unassign.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Status/Unassign.php @@ -24,7 +24,7 @@ class Unassign extends \Magento\Sales\Controller\Adminhtml\Order\Status } catch (\Exception $e) { $this->messageManager->addException( $e, - __('Something went wrong while we were unassigning the order.') + __('Something went wrong while unassigning the order.') ); } } else { diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Unhold.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Unhold.php index 6ea9cd78e3bb6d341d785e7238450ccd3a636901..c57f4ca425146c72d93c3bc4741d6bf335cba1de 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Unhold.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Unhold.php @@ -31,4 +31,12 @@ class Unhold extends \Magento\Sales\Controller\Adminhtml\Order $resultRedirect->setPath('sales/*/'); return $resultRedirect; } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::unhold'); + } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/View.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/View.php index 2242f7a6360b94bf22af7faba152f06e86f7d941..e4881766b1b0489afe81dd7329921dbe6b14976c 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/View.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/View.php @@ -34,4 +34,12 @@ class View extends \Magento\Sales\Controller\Adminhtml\Order $resultRedirect->setPath('sales/*/'); return $resultRedirect; } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::actions_view'); + } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/View/Giftmessage/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/View/Giftmessage/Save.php index 7e11a8481050ac95f6b294cca13b8c1d0c13eb3e..554935ed551ad55f72de3086fc220ab0a28f4a31 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/View/Giftmessage/Save.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/View/Giftmessage/Save.php @@ -26,7 +26,7 @@ class Save extends \Magento\Sales\Controller\Adminhtml\Order\View\Giftmessage if ($this->getRequest()->getParam('type') == 'order_item') { $this->getResponse()->setBody($this->_getGiftmessageSaveModel()->getSaved() ? 'YES' : 'NO'); } else { - $this->getResponse()->setBody(__('The gift message has been saved.')); + $this->getResponse()->setBody(__('You saved the gift card message.')); } } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/VoidPayment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/VoidPayment.php index 86b1af24af06abf893292c440ee13c48facaa9a3..f3c2f2cee9d289f2b6392ac250a94dd78b4f6f75 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/VoidPayment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/VoidPayment.php @@ -24,7 +24,7 @@ class VoidPayment extends \Magento\Sales\Controller\Adminhtml\Order } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addError(__('We couldn\'t void the payment.')); + $this->messageManager->addError(__('We can\'t void the payment right now.')); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } $resultRedirect->setPath('sales/*/view', ['order_id' => $order->getId()]); diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Transactions.php b/app/code/Magento/Sales/Controller/Adminhtml/Transactions.php index 49b910be6a862ff0379be9adf7b365ba3babd40f..f3d31df87ac4b83298162ba337a60af65723285a 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Transactions.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Transactions.php @@ -86,13 +86,6 @@ class Transactions extends \Magento\Backend\App\Action */ protected function _isAllowed() { - switch ($this->getRequest()->getActionName()) { - case 'fetch': - return $this->_authorization->isAllowed('Magento_Sales::transactions_fetch'); - break; - default: - return $this->_authorization->isAllowed('Magento_Sales::transactions'); - break; - } + return $this->_authorization->isAllowed('Magento_Sales::transactions'); } } diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Fetch.php b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Fetch.php index 2afac87db489d6ab464ecf2bc1dfe291818d9899..6b2af6cc1dd5f22ccbecc355f71ccff08dde7957 100755 --- a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Fetch.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Fetch.php @@ -38,4 +38,12 @@ class Fetch extends \Magento\Sales\Controller\Adminhtml\Transactions return $resultRedirect->setPath('sales/transactions/view', ['_current' => true]); } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_Sales::transactions_fetch'); + } } diff --git a/app/code/Magento/Sales/Model/AdminOrder/Create.php b/app/code/Magento/Sales/Model/AdminOrder/Create.php index a661297a73aefa24fba9311093533cb2f8671bd0..ff8126c334213faa7f7c680ae86510558e3cddd9 100644 --- a/app/code/Magento/Sales/Model/AdminOrder/Create.php +++ b/app/code/Magento/Sales/Model/AdminOrder/Create.php @@ -819,7 +819,7 @@ class Create extends \Magento\Framework\Object implements \Magento\Checkout\Mode } if (!$wishlist) { throw new \Magento\Framework\Exception\LocalizedException( - __('We couldn\'t find this wish list.') + __('We can\'t find this wish list.') ); } $wishlist->setStore( @@ -1891,7 +1891,7 @@ class Create extends \Magento\Framework\Object implements \Magento\Checkout\Mode $items = $this->getQuote()->getAllItems(); if (count($items) == 0) { - $this->_errors[] = __('You need to specify order items.'); + $this->_errors[] = __('Please specify order items.'); } foreach ($items as $item) { @@ -1903,12 +1903,12 @@ class Create extends \Magento\Framework\Object implements \Magento\Checkout\Mode if (!$this->getQuote()->isVirtual()) { if (!$this->getQuote()->getShippingAddress()->getShippingMethod()) { - $this->_errors[] = __('You need to specify a shipping method.'); + $this->_errors[] = __('Please specify a shipping method.'); } } if (!$this->getQuote()->getPayment()->getMethod()) { - $this->_errors[] = __('A payment method must be specified.'); + $this->_errors[] = __('Please specify a payment method.'); } else { $method = $this->getQuote()->getPayment()->getMethodInstance(); if (!$method->isAvailable($this->getQuote())) { diff --git a/app/code/Magento/Sales/Model/Order/Payment/Transaction.php b/app/code/Magento/Sales/Model/Order/Payment/Transaction.php index 17b73b17d60901aee38a946b98cb744c8ad8e86c..5d7a2efedd93f35bca87d852441edc3c1ac5e07a 100644 --- a/app/code/Magento/Sales/Model/Order/Payment/Transaction.php +++ b/app/code/Magento/Sales/Model/Order/Payment/Transaction.php @@ -892,7 +892,7 @@ class Transaction extends AbstractModel implements TransactionInterface protected function _verifyTxnId($txnId) { if (null !== $txnId && 0 == strlen($txnId)) { - throw new \Magento\Framework\Exception\LocalizedException(__('The Transaction ID field cannot be empty.')); + throw new \Magento\Framework\Exception\LocalizedException(__('Please enter a Transaction ID.')); } } diff --git a/app/code/Magento/Sales/Model/Order/Shipment/Item.php b/app/code/Magento/Sales/Model/Order/Shipment/Item.php index 6197a179feb81a05999a6df5b642f418a00523fd..381f7e5907bb5d4282a6b66ae2b35565bec3072f 100644 --- a/app/code/Magento/Sales/Model/Order/Shipment/Item.php +++ b/app/code/Magento/Sales/Model/Order/Shipment/Item.php @@ -164,7 +164,7 @@ class Item extends AbstractModel implements ShipmentItemInterface $this->setData('qty', $qty); } else { throw new \Magento\Framework\Exception\LocalizedException( - __('We found an invalid qty to ship for item "%1".', $this->getName()) + __('We found an invalid quantity to ship for item "%1".', $this->getName()) ); } return $this; diff --git a/app/code/Magento/Sales/Model/Resource/Order/Address.php b/app/code/Magento/Sales/Model/Resource/Order/Address.php index a8b2b3ca7376dc6599a232b91bae14dd57983ded..878bfdf6a8ad9fd6bbf30f71642c3f6fe8bf64d1 100644 --- a/app/code/Magento/Sales/Model/Resource/Order/Address.php +++ b/app/code/Magento/Sales/Model/Resource/Order/Address.php @@ -117,7 +117,7 @@ class Address extends SalesResource implements OrderAddressResourceInterface $warnings = $this->_validator->validate($object); if (!empty($warnings)) { throw new \Magento\Framework\Exception\LocalizedException( - __("Cannot save address:\n%1", implode("\n", $warnings)) + __("We can't save the address:\n%1", implode("\n", $warnings)) ); } return $this; diff --git a/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Status/Assign/FormTest.php b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Status/Assign/FormTest.php index 9e1a5575328545c320f08775d6aed8c5f09524aa..b2f1555a3fc64da966fa6c8e03ac0d45f8586408 100644 --- a/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Status/Assign/FormTest.php +++ b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Status/Assign/FormTest.php @@ -127,7 +127,7 @@ class FormTest extends \PHPUnit_Framework_TestCase ->with( 'visible_on_front', 'checkbox', - ['name' => 'visible_on_front', 'label' => __('Visible On Frontend'), 'value' => 1] + ['name' => 'visible_on_front', 'label' => __('Visible On Storefront'), 'value' => 1] ); $this->block->toHtml(); diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/EmailTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/EmailTest.php index bd9b80e880eb13d134d4d1ec7922aa1315a2e3ba..09554226bc356d95bf114b60a8b62b86dfe12441 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/EmailTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/EmailTest.php @@ -171,7 +171,7 @@ class EmailTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue(true)); $this->messageManager->expects($this->once()) ->method('addSuccess') - ->with('We sent the message.'); + ->with('You sent the message.'); $this->assertInstanceOf( 'Magento\Backend\Model\View\Result\Redirect', diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Invoice/AbstractInvoice/EmailTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Invoice/AbstractInvoice/EmailTest.php index 8493e58d858c62477f45677564d12397a25d2bf6..994cfca6db43260fcead0700b746a06485ba2bbd 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Invoice/AbstractInvoice/EmailTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Invoice/AbstractInvoice/EmailTest.php @@ -182,7 +182,7 @@ class EmailTest extends \PHPUnit_Framework_TestCase ->willReturn(true); $this->messageManager->expects($this->once()) ->method('addSuccess') - ->with('We sent the message.'); + ->with('You sent the message.'); $this->resultRedirectFactory->expects($this->atLeastOnce()) ->method('create') diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/AddCommentTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/AddCommentTest.php index b7b8759dfc4016b42702cb84f7e7c5b7ed76bbba..b96f2254501abc8b280e52b4626abdd7c29d2478 100755 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/AddCommentTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/AddCommentTest.php @@ -212,7 +212,7 @@ class AddCommentTest extends \PHPUnit_Framework_TestCase */ public function testExecuteNoComment() { - $message = 'The Comment Text field cannot be empty.'; + $message = 'Please enter a comment.'; $response = ['error' => true, 'message' => $message]; $data = []; diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/SaveTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/SaveTest.php index f834d01d208d5b7cfd885a92298e10018537d7aa..5549ee7f193ce5a5515571bff33de979e0afba47 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/SaveTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/SaveTest.php @@ -235,7 +235,7 @@ class SaveTest extends \PHPUnit_Framework_TestCase ->with('sales/*/new', ['_current' => true]) ->willReturnSelf(); - $this->_setSaveActionExpectationForMageCoreException($data, 'Credit memo\'s total must be positive.'); + $this->_setSaveActionExpectationForMageCoreException($data, 'The credit memo\'s total must be positive.'); $this->_controller->execute(); } diff --git a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/UpdateQtyTest.php b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/UpdateQtyTest.php index 7b6c366e5eceaa2e21cdb8ab146ffe1ac547a752..9e02c98b1c374df8f7263bfcf33733073e86d5d4 100644 --- a/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/UpdateQtyTest.php +++ b/app/code/Magento/Sales/Test/Unit/Controller/Adminhtml/Order/Creditmemo/UpdateQtyTest.php @@ -232,7 +232,7 @@ class UpdateQtyTest extends \PHPUnit_Framework_TestCase */ public function testExecuteException() { - $message = 'Cannot update the item\'s quantity.'; + $message = 'We can\'t update the item\'s quantity right now.'; $e = new \Exception($message); $response = ['error' => true, 'message' => $message]; diff --git a/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php b/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php index 37c29c2be223a85d35eb22fa196c757480c062ed..b4f0e627cebf03296c4ce22b62758b0a0e40cd9e 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php @@ -38,20 +38,6 @@ class TemplateTest extends \PHPUnit_Framework_TestCase $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $objectManagerMock = $this->getMock('Magento\Framework\ObjectManagerInterface'); - $objectManagerMock->expects($this->once()) - ->method('get') - ->with('Magento\Email\Model\Resource\Template') - ->will($this->returnValue($objectManagerHelper->getObject('Magento\Email\Model\Resource\Template'))); - - try { - $this->objectManagerBackup = \Magento\Framework\App\ObjectManager::getInstance(); - } catch (\RuntimeException $e) { - $this->objectManagerBackup = \Magento\Framework\App\Bootstrap::createObjectManagerFactory(BP, $_SERVER) - ->create($_SERVER); - } - \Magento\Framework\App\ObjectManager::setInstance($objectManagerMock); - $this->template = $objectManagerHelper->getObject( 'Magento\Sales\Model\Email\Template', [ @@ -60,12 +46,6 @@ class TemplateTest extends \PHPUnit_Framework_TestCase ); } - protected function tearDown() - { - parent::tearDown(); - \Magento\Framework\App\ObjectManager::setInstance($this->objectManagerBackup); - } - public function testIncludeTemplate() { $this->mockViewFilesystem->expects($this->once()) diff --git a/app/code/Magento/Sales/Test/Unit/Model/Resource/Order/AddressTest.php b/app/code/Magento/Sales/Test/Unit/Model/Resource/Order/AddressTest.php index 92b3222098a503419e18d1978c44f998fb18c0e7..85d167520a3bbdff1809a69a82a284f79c76be32 100644 --- a/app/code/Magento/Sales/Test/Unit/Model/Resource/Order/AddressTest.php +++ b/app/code/Magento/Sales/Test/Unit/Model/Resource/Order/AddressTest.php @@ -157,7 +157,7 @@ class AddressTest extends \PHPUnit_Framework_TestCase * test _beforeSaveMethod via save() with failed validation * * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Cannot save address: + * @expectedExceptionMessage We can't save the address: */ public function testSaveValidationFailed() { diff --git a/app/code/Magento/Sales/view/adminhtml/layout/sales_order_grid_block.xml b/app/code/Magento/Sales/view/adminhtml/layout/sales_order_grid_block.xml index 50b483c1a82fd630732a79afb142cdefd02eeb35..2af914b40b22887d228c861397006dbd56db7606 100644 --- a/app/code/Magento/Sales/view/adminhtml/layout/sales_order_grid_block.xml +++ b/app/code/Magento/Sales/view/adminhtml/layout/sales_order_grid_block.xml @@ -111,7 +111,7 @@ </block> <block class="Magento\Backend\Block\Widget\Grid\Column" as="created_at"> <arguments> - <argument name="header" xsi:type="string" translate="true">Purchase Date</argument> + <argument name="header" xsi:type="string" translate="true">Purchased</argument> <argument name="type" xsi:type="string">datetime</argument> <argument name="index" xsi:type="string">created_at</argument> <argument name="id" xsi:type="string">created_at</argument> diff --git a/app/code/Magento/Sales/view/adminhtml/layout/sales_order_status_index.xml b/app/code/Magento/Sales/view/adminhtml/layout/sales_order_status_index.xml index 1403dd3158457039d2973319fd99482aca0140a9..5ea17f70a37f38060af91b969fd31ae1e24045da 100644 --- a/app/code/Magento/Sales/view/adminhtml/layout/sales_order_status_index.xml +++ b/app/code/Magento/Sales/view/adminhtml/layout/sales_order_status_index.xml @@ -64,7 +64,7 @@ </block> <block class="Magento\Backend\Block\Widget\Grid\Column" as="visible_on_front"> <arguments> - <argument name="header" xsi:type="string" translate="true">Visible On Frontend</argument> + <argument name="header" xsi:type="string" translate="true">Visible On Storefront</argument> <argument name="index" xsi:type="string">visible_on_front</argument> <argument name="type" xsi:type="string">options</argument> <argument name="sortable" xsi:type="string">0</argument> diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/comments/view.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/comments/view.phtml index a1e1c4b2ee36a09e902aadd08da68508e04d6c94..1d3eb30bd03bde66ae475b0d70cd8ff99353bf5d 100644 --- a/app/code/Magento/Sales/view/adminhtml/templates/order/comments/view.phtml +++ b/app/code/Magento/Sales/view/adminhtml/templates/order/comments/view.phtml @@ -41,7 +41,7 @@ class="admin__control-checkbox" value="1" /> <label class="admin__field-label" - for="history_visible"> <?php echo __('Visible on Frontend') ?></label> + for="history_visible"> <?php echo __('Visible on Storefront') ?></label> </div> </div> <div class="order-history-comments-actions"> diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/create/giftmessage.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/create/giftmessage.phtml index f06c41f3340a2c7714ccf8fabdd08cf6d59b5b84..bc1ee98518a0db17d968e6786ac1b3e3b2754438 100644 --- a/app/code/Magento/Sales/view/adminhtml/templates/order/create/giftmessage.phtml +++ b/app/code/Magento/Sales/view/adminhtml/templates/order/create/giftmessage.phtml @@ -14,7 +14,7 @@ <legend class="admin__legend"><span><?php echo __('Gift Message for the Entire Order') ?></span></legend> <br> <?php if ($this->helper('Magento\GiftMessage\Helper\Message')->isMessagesAllowed('main', $block->getQuote(), $block->getStoreId())): ?> - <p><?php echo __('If you don\'t want to leave a gift message for the entire order, leave this box blank.') ?></p> + <p><?php echo __('Leave this box blank if you don\'t want to leave a gift message for the entire order.') ?></p> <?php echo $block->getFormHtml($block->getQuote(), 'main') ?> <?php endif; ?> </fieldset> diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/create/items/grid.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/create/items/grid.phtml index 6096ab772d288d0529dd3cd844cb3027a62882b7..35000ce39f11291d6cb9cd86e705c21b053bc0c4 100644 --- a/app/code/Magento/Sales/view/adminhtml/templates/order/create/items/grid.phtml +++ b/app/code/Magento/Sales/view/adminhtml/templates/order/create/items/grid.phtml @@ -41,7 +41,7 @@ <div class="admin__table-wrapper" id="order-items_grid"> <?php if (count($_items)>10): ?> <div class="actions update actions-update"> - <?php echo $block->getButtonHtml(__('Update Items and Qty\'s'), 'order.itemsUpdate()', 'action-secondary'); ?> + <?php echo $block->getButtonHtml(__('Update Items and Quantities'), 'order.itemsUpdate()', 'action-secondary'); ?> </div> <?php endif; ?> <table class="data-table admin__table-primary order-tables"> @@ -199,7 +199,7 @@ </div> <div class="order-discounts"> - <?php echo $block->getButtonHtml(__('Update Items and Qty\'s'), 'order.itemsUpdate()', 'action-secondary'); ?> + <?php echo $block->getButtonHtml(__('Update Items and Quantities'), 'order.itemsUpdate()', 'action-secondary'); ?> <div id="order-coupons" class="order-coupons"><?php echo $block->getChildHtml();?></div> </div> diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/creditmemo/view/form.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/creditmemo/view/form.phtml index ee8ec752df51752961a3b64a2bf415a4a3174ccb..8302837baefff21efc422094fafda910dd3b5c42 100644 --- a/app/code/Magento/Sales/view/adminhtml/templates/order/creditmemo/view/form.phtml +++ b/app/code/Magento/Sales/view/adminhtml/templates/order/creditmemo/view/form.phtml @@ -25,7 +25,7 @@ <span class="title"><?php echo __('Payment Information') ?></span> </div> <div class="admin__page-section-item-content"> - <div><?php echo $block->getChildHtml('order_payment') ?></div> + <div class="order-payment-method-title"><?php echo $block->getChildHtml('order_payment') ?></div> <div class="order-payment-currency"><?php echo __('The order was placed using %1.', $_order->getOrderCurrencyCode()) ?></div> <div class="order-payment-additional"><?php echo $block->getChildHtml('order_payment_additional'); ?></div> </div> diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/invoice/create/form.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/invoice/create/form.phtml index b0319ea9791f7b35afe27d1e647e6e9859448e03..4eb4ec12f19553a9e850206050c7a07a5a311169 100644 --- a/app/code/Magento/Sales/view/adminhtml/templates/order/invoice/create/form.phtml +++ b/app/code/Magento/Sales/view/adminhtml/templates/order/invoice/create/form.phtml @@ -22,7 +22,7 @@ <span class="title"><?php echo __('Payment Information') ?></span> </div> <div class="admin__page-section-item-content"> - <div><?php echo $block->getChildHtml('order_payment') ?></div> + <div class="order-payment-method-title"><?php echo $block->getChildHtml('order_payment') ?></div> <div class="order-payment-currency"><?php echo __('The order was placed using %1.', $_order->getOrderCurrencyCode()) ?></div> <div class="order-payment-additional"><?php echo $block->getChildHtml('order_payment_additional'); ?></div> </div> diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/invoice/view/form.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/invoice/view/form.phtml index cd625596b541da95d9d24de7069c0d33c71117af..e5a1f0617a49caf66492076cb2369e6462fa0cdb 100644 --- a/app/code/Magento/Sales/view/adminhtml/templates/order/invoice/view/form.phtml +++ b/app/code/Magento/Sales/view/adminhtml/templates/order/invoice/view/form.phtml @@ -22,7 +22,7 @@ <span class="title"><?php echo __('Payment Information') ?></span> </div> <div class="admin__page-section-item-content"> - <div><?php echo $block->getChildHtml('order_payment') ?></div> + <div class="order-payment-method-title"><?php echo $block->getChildHtml('order_payment') ?></div> <div class="order-payment-currency"> <?php echo __('The order was placed using %1.', $_order->getOrderCurrencyCode()) ?> </div> diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/view/history.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/view/history.phtml index 0a681e6c628072913217cac9985b7834f011a997..17d163c1f7d842c7fd977ea8b0a36aa23be8cef0 100644 --- a/app/code/Magento/Sales/view/adminhtml/templates/order/view/history.phtml +++ b/app/code/Magento/Sales/view/adminhtml/templates/order/view/history.phtml @@ -57,7 +57,7 @@ class="admin__control-checkbox" value="1" /> <label class="admin__field-label" for="history_visible"> - <?php echo __('Visible on Frontend') ?> + <?php echo __('Visible on Storefront') ?> </label> </div> </div> diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/view/info.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/view/info.phtml index f27dc9bd4345606b0c2f0bb364cc94ffe57d1fba..c7881ea98ced18b9f7c81f82781cb773a442bb21 100644 --- a/app/code/Magento/Sales/view/adminhtml/templates/order/view/info.phtml +++ b/app/code/Magento/Sales/view/adminhtml/templates/order/view/info.phtml @@ -30,9 +30,9 @@ $orderStoreDate = $block->formatDate( <div class="admin__page-section-item order-information"> <?php /* Order Information */?> <?php if ($_order->getEmailSent()): - $_email = __('the order confirmation email was sent'); + $_email = __('The order confirmation email was sent'); else: - $_email = __('the order confirmation email is not sent'); + $_email = __('The order confirmation email is not sent'); endif; ?> <div class="admin__page-section-item-title"> <span class="title"> diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/view/tab/info.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/view/tab/info.phtml index b315a0053976c6dac80fba6dcb579ee1782cea58..3a8b3cf29d08482c4f2568b89b482292ffbdab41 100644 --- a/app/code/Magento/Sales/view/adminhtml/templates/order/view/tab/info.phtml +++ b/app/code/Magento/Sales/view/adminhtml/templates/order/view/tab/info.phtml @@ -28,7 +28,7 @@ <span class="title"><?php echo __('Payment Information') ?></span> </div> <div class="admin__page-section-item-content"> - <div><?php echo $block->getPaymentHtml() ?></div> + <div class="order-payment-method-title"><?php echo $block->getPaymentHtml() ?></div> <div class="order-payment-currency"><?php echo __('The order was placed using %1.', $_order->getOrderCurrencyCode()) ?></div> <div class="order-payment-additional"><?php echo $block->getChildHtml('order_payment_additional'); ?></div> </div> diff --git a/app/code/Magento/Sales/view/frontend/templates/guest/form.phtml b/app/code/Magento/Sales/view/frontend/templates/guest/form.phtml index 89089385f0ebf4c56e8300766039bd96dfc572f3..ca1ec172f8e8e706988e1fbfc5fe08a5cb66aca3 100644 --- a/app/code/Magento/Sales/view/frontend/templates/guest/form.phtml +++ b/app/code/Magento/Sales/view/frontend/templates/guest/form.phtml @@ -30,7 +30,7 @@ </div> </div> <div class="field find required"> - <label class="label" for="quick-search-type-id"><span><?php echo __('Find Order By:') ?></span></label> + <label class="label" for="quick-search-type-id"><span><?php echo __('Find Order By') ?></span></label> <div class="control"> <select name="oar_type" id="quick-search-type-id" class="select"> diff --git a/app/code/Magento/Sales/view/frontend/templates/widget/guest/form.phtml b/app/code/Magento/Sales/view/frontend/templates/widget/guest/form.phtml index 81f64f5f7cc3866871bb2420c4f96a3b4f64e670..113b1ad7495b980010afcc77cafdddf8096b24cb 100644 --- a/app/code/Magento/Sales/view/frontend/templates/widget/guest/form.phtml +++ b/app/code/Magento/Sales/view/frontend/templates/widget/guest/form.phtml @@ -18,7 +18,7 @@ class="form form-orders-search" name="guest_post"> <fieldset class="fieldset"> <div class="field find required"> - <label class="label"><span><?php echo __('Find Order By:') ?></span></label> + <label class="label"><span><?php echo __('Find Order By') ?></span></label> <div class="control"> <select name="oar_type" id="quick-search-type-id" class="select" title=""> diff --git a/app/code/Magento/SalesRule/Block/Adminhtml/Promo/Quote/Edit/Tab/Actions.php b/app/code/Magento/SalesRule/Block/Adminhtml/Promo/Quote/Edit/Tab/Actions.php index af3849077c641af7581b7eff7b89e99b74092605..f1ef4bd6c05f05c0c3ab1ed5456e2541df91c48b 100644 --- a/app/code/Magento/SalesRule/Block/Adminhtml/Promo/Quote/Edit/Tab/Actions.php +++ b/app/code/Magento/SalesRule/Block/Adminhtml/Promo/Quote/Edit/Tab/Actions.php @@ -97,7 +97,7 @@ class Actions extends \Magento\Backend\Block\Widget\Form\Generic implements $fieldset = $form->addFieldset( 'action_fieldset', - ['legend' => __('Update prices using the following information')] + ['legend' => __('Pricing Structure Rules')] ); $fieldset->addField( @@ -154,8 +154,8 @@ class Actions extends \Magento\Backend\Block\Widget\Form\Generic implements 'stop_rules_processing', 'select', [ - 'label' => __('Stop Further Rules Processing'), - 'title' => __('Stop Further Rules Processing'), + 'label' => __('Subsequent rules'), + 'title' => __('Subsequent rules'), 'name' => 'stop_rules_processing', 'options' => ['1' => __('Yes'), '0' => __('No')] ] diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php index 36e384e4a706a08ed7e0a92ee44f97ba8e8f9792..c88dc7494f89512455ea539b75416905965b9f03 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php @@ -21,7 +21,7 @@ class Delete extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote $model = $this->_objectManager->create('Magento\SalesRule\Model\Rule'); $model->load($id); $model->delete(); - $this->messageManager->addSuccess(__('The rule has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the rule.')); $this->_redirect('sales_rule/*/'); return; } catch (\Magento\Framework\Exception\LocalizedException $e) { diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Save.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Save.php index 6a507241d595b4492eeb251c415bc3519a59e60f..055668dc165c6ce2df14ae78057ff674edf8352c 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Save.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Save.php @@ -75,7 +75,7 @@ class Save extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote $session->setPageData($model->getData()); $model->save(); - $this->messageManager->addSuccess(__('The rule has been saved.')); + $this->messageManager->addSuccess(__('You saved the rule.')); $session->setPageData(false); if ($this->getRequest()->getParam('back')) { $this->_redirect('sales_rule/*/edit', ['id' => $model->getId()]); @@ -94,7 +94,7 @@ class Save extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote return; } catch (\Exception $e) { $this->messageManager->addError( - __('An error occurred while saving the rule data. Please review the log and try again.') + __('Something went wrong while saving the rule data. Please review the error log.') ); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); $this->_objectManager->get('Magento\Backend\Model\Session')->setPageData($data); diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/MassDelete.php b/app/code/Magento/Search/Controller/Adminhtml/Term/MassDelete.php index f704e4a7144af1185dd2fffbd3aea7f02a42cb73..97586e38d644edf87d37faccf0a3ba3054f29120 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/MassDelete.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/MassDelete.php @@ -24,7 +24,7 @@ class MassDelete extends TermController $model = $this->_objectManager->create('Magento\Search\Model\Query')->load($searchId); $model->delete(); } - $this->messageManager->addSuccess(__('Total of %1 record(s) were deleted', count($searchIds))); + $this->messageManager->addSuccess(__('Total of %1 record(s) were deleted.', count($searchIds))); } catch (\Exception $e) { $this->messageManager->addError($e->getMessage()); } diff --git a/app/code/Magento/Search/Helper/Data.php b/app/code/Magento/Search/Helper/Data.php index f6016324d5d3fd88241436ed50976a367b5abb91..97438fcd7d140265641f5756fb66fc91785e116d 100644 --- a/app/code/Magento/Search/Helper/Data.php +++ b/app/code/Magento/Search/Helper/Data.php @@ -236,7 +236,7 @@ class Data extends AbstractHelper if ($this->_queryFactory->get()->isQueryTextExceeded()) { $this->addNoteMessage( __( - 'Your search query can\'t be longer than %1, so we had to shorten your query.', + 'Your search query can\'t be longer than %1, so we shortened your query.', $this->getMaxQueryLength() ) ); diff --git a/app/code/Magento/SendFriend/view/frontend/templates/send.phtml b/app/code/Magento/SendFriend/view/frontend/templates/send.phtml index c4810f6c833e6a9d4d01f8d2c6322262d0fc2d14..8f44dc56e2099a6525f1057799fc4a86e66fdc9d 100644 --- a/app/code/Magento/SendFriend/view/frontend/templates/send.phtml +++ b/app/code/Magento/SendFriend/view/frontend/templates/send.phtml @@ -88,7 +88,7 @@ <fieldset class="fieldset recipients"> <?php echo $block->getBlockHtml('formkey')?> - <legend class="legend"><span><?php echo __('Recipient') ?></span></legend> + <legend class="legend"><span><?php echo __('Invitee') ?></span></legend> <br /> <div id="recipients-options"></div> <?php if ($block->getMaxRecipients()): ?> @@ -100,7 +100,7 @@ <div class="secondary"> <?php if (1 < $block->getMaxRecipients()): ?> <button type="button" id="add-recipient-button" class="action add"> - <span><?php echo __('Add Recipient') ?></span></button> + <span><?php echo __('Add Invitee') ?></span></button> <?php endif; ?> </div> </div> diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php index c1fdc5ecd880d668a722046d05c0a3075e2b4540..fb24a2a32580e881bef427175c7c948206ddc323 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php @@ -65,7 +65,7 @@ class AddComment extends \Magento\Backend\App\Action $data = $this->getRequest()->getPost('comment'); if (empty($data['comment'])) { throw new \Magento\Framework\Exception\LocalizedException( - __("The comment text field cannot be empty.") + __('Please enter a comment.') ); } $this->shipmentLoader->setOrderId($this->getRequest()->getParam('order_id')); diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddTrack.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddTrack.php index af29bd59f8ae60de07f5affa07243414d4e6f3cf..ea5ab1d967769b557067550cd147bfe5fd561cd8 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddTrack.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddTrack.php @@ -76,7 +76,7 @@ class AddTrack extends \Magento\Backend\App\Action } else { $response = [ 'error' => true, - 'message' => __('Cannot initialize shipment for adding tracking number.'), + 'message' => __('We can\'t initialize shipment for adding tracking number.'), ]; } } catch (\Magento\Framework\Exception\LocalizedException $e) { diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php index 2e22b97509a9c333142ab3bfbfc7220fe73af1cd..4b85739acc03de48fe10caf60f894ee4621617df 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php @@ -61,14 +61,17 @@ class RemoveTrack extends \Magento\Backend\App\Action } else { $response = [ 'error' => true, - 'message' => __('Cannot initialize shipment for delete tracking number.'), + 'message' => __('We can\'t initialize shipment for delete tracking number.'), ]; } } catch (\Exception $e) { - $response = ['error' => true, 'message' => __('Cannot delete tracking number.')]; + $response = ['error' => true, 'message' => __('We can\'t delete tracking number.')]; } } else { - $response = ['error' => true, 'message' => __('Cannot load track with retrieving identifier.')]; + $response = [ + 'error' => true, + 'message' => __('We can\'t load track with retrieving identifier right now.') + ]; } if (is_array($response)) { $response = $this->_objectManager->get('Magento\Framework\Json\Helper\Data')->jsonEncode($response); diff --git a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/RemoveTrackTest.php b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/RemoveTrackTest.php index 3e05141a08b74a9d8b3981be1239f0fcad9e1b64..bb0b1d21202a46c0a6a326e4c83e6893090460a5 100644 --- a/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/RemoveTrackTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Controller/Adminhtml/Order/Shipment/RemoveTrackTest.php @@ -264,7 +264,7 @@ class RemoveTrackTest extends \PHPUnit_Framework_TestCase public function testExecuteTrackIdFail() { $trackId = null; - $errors = ['error' => true, 'message' => 'Cannot load track with retrieving identifier.']; + $errors = ['error' => true, 'message' => 'We can\'t load track with retrieving identifier right now.']; $this->shipmentTrackMock->expects($this->once()) ->method('load') @@ -285,7 +285,7 @@ class RemoveTrackTest extends \PHPUnit_Framework_TestCase { $errors = [ 'error' => true, - 'message' => 'Cannot initialize shipment for delete tracking number.', + 'message' => 'We can\'t initialize shipment for delete tracking number.', ]; $this->shipmentLoad(); @@ -302,7 +302,7 @@ class RemoveTrackTest extends \PHPUnit_Framework_TestCase */ public function testExecuteDeleteFail() { - $errors = ['error' => true, 'message' => 'Cannot delete tracking number.']; + $errors = ['error' => true, 'message' => 'We can\'t delete tracking number.']; $this->shipmentLoad(); $this->shipmentLoaderMock->expects($this->once()) diff --git a/app/code/Magento/Store/etc/di.xml b/app/code/Magento/Store/etc/di.xml index 320253c316b88638328936cb3b273f3972a2ec22..c47f73ec9012bd91e4218009b662d754d6905645 100644 --- a/app/code/Magento/Store/etc/di.xml +++ b/app/code/Magento/Store/etc/di.xml @@ -9,6 +9,14 @@ <preference for="Magento\Framework\App\Request\PathInfoProcessorInterface" type="Magento\Store\App\Request\PathInfoProcessor" /> <preference for="Magento\Store\Model\StoreManagerInterface" type="Magento\Store\Model\StoreManager" /> <preference for="Magento\Framework\App\Response\RedirectInterface" type="Magento\Store\App\Response\Redirect" /> + <type name="Magento\Framework\App\Response\Http"> + <plugin name="xFrameOptionsHeader" type="Magento\Framework\App\Response\XFrameOptPlugin"/> + </type> + <type name="Magento\Framework\App\Response\XFrameOptPlugin"> + <arguments> + <argument name="xFrameOpt" xsi:type="init_parameter">Magento\Framework\App\Response\XFrameOptPlugin::DEPLOYMENT_CONFIG_X_FRAME_OPT</argument> + </arguments> + </type> <type name="Magento\Framework\App\Config\ScopePool"> <arguments> <argument name="readerPool" xsi:type="object">Magento\Store\Model\Config\Reader\ReaderPool\Proxy</argument> diff --git a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate.php index ba316fd6f734908c6cbd8f1d3cc6c444fa6c6c4c..3a09ea4b4744c31230e5ab2818f8ff0d678f9a28 100644 --- a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate.php +++ b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate.php @@ -32,18 +32,6 @@ class Rate extends \Magento\Backend\App\Action */ protected function _isAllowed() { - switch ($this->getRequest()->getActionName()) { - case 'importExport': - return $this->_authorization->isAllowed('Magento_TaxImportExport::import_export'); - case 'importPost': - case 'exportPost': - return $this->_authorization->isAllowed( - 'Magento_Tax::manage_tax' - ) || $this->_authorization->isAllowed( - 'Magento_TaxImportExport::import_export' - ); - default: - return $this->_authorization->isAllowed('Magento_Tax::manage_tax'); - } + return $this->_authorization->isAllowed('Magento_Tax::manage_tax'); } } diff --git a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php index 1d5685802882b5ed3703222f7318511712493605..92e825650f804d4b0475e193b89b0d44cf66205e 100644 --- a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php +++ b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php @@ -83,4 +83,17 @@ class ExportPost extends \Magento\TaxImportExport\Controller\Adminhtml\Rate } return $this->fileFactory->create('tax_rates.csv', $content, DirectoryList::VAR_DIR); } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed( + 'Magento_Tax::manage_tax' + ) || $this->_authorization->isAllowed( + 'Magento_TaxImportExport::import_export' + ); + + } } diff --git a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExport.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExport.php index 5ba0b3e87da0e7727e89aa3747d34916e2d0123a..b37520a99f870106a31e6e6ee93b7e1ae9f82345 100644 --- a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExport.php +++ b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExport.php @@ -30,4 +30,12 @@ class ImportExport extends \Magento\TaxImportExport\Controller\Adminhtml\Rate $resultPage->getConfig()->getTitle()->prepend(__('Import and Export Tax Rates')); return $resultPage; } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed('Magento_TaxImportExport::import_export'); + } } diff --git a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPost.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPost.php index 663a0183b1e86cba8e888c9a9b194e24e99c9519..eb5efff3d5e9be912e0d5f50129187dec9646ba2 100644 --- a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPost.php +++ b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPost.php @@ -36,4 +36,17 @@ class ImportPost extends \Magento\TaxImportExport\Controller\Adminhtml\Rate $resultRedirect->setUrl($this->_redirect->getRedirectUrl()); return $resultRedirect; } + + /** + * @return bool + */ + protected function _isAllowed() + { + return $this->_authorization->isAllowed( + 'Magento_Tax::manage_tax' + ) || $this->_authorization->isAllowed( + 'Magento_TaxImportExport::import_export' + ); + + } } diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/NewFolder.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/NewFolder.php index 639ca3f383d61c33a038c7de4b9306d362ec3e1b..018e8194f37a204647e967debe5b6d6849372d49 100644 --- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/NewFolder.php +++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files/NewFolder.php @@ -22,7 +22,7 @@ class NewFolder extends \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwy } catch (\Magento\Framework\Exception\LocalizedException $e) { $result = ['error' => true, 'message' => $e->getMessage()]; } catch (\Exception $e) { - $result = ['error' => true, 'message' => __('Sorry, something went wrong.')]; + $result = ['error' => true, 'message' => __('Sorry, something went wrong. That\'s all we know.')]; $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); } $this->getResponse()->representJson( diff --git a/app/code/Magento/Theme/Model/Resource/Design.php b/app/code/Magento/Theme/Model/Resource/Design.php index 85a393429f1da5fb2ac48fac7024985ecc4c6b44..64d52783d4063111caffca4963b2722b70f227b2 100644 --- a/app/code/Magento/Theme/Model/Resource/Design.php +++ b/app/code/Magento/Theme/Model/Resource/Design.php @@ -72,7 +72,7 @@ class Design extends \Magento\Framework\Model\Resource\Db\AbstractDb > (new \DateTime($object->getDateTo()))->getTimestamp() ) { throw new \Magento\Framework\Exception\LocalizedException( - __('Start date cannot be greater than end date.') + __('The start date can\'t follow the end date.') ); } @@ -85,10 +85,7 @@ class Design extends \Magento\Framework\Model\Resource\Db\AbstractDb if ($check) { throw new \Magento\Framework\Exception\LocalizedException( - __( - 'Your design change for the specified store intersects with another one, please specify another' - . ' date range.' - ) + __('The date range for this design change overlaps another design change for the specified store.') ); } diff --git a/app/code/Magento/Theme/view/frontend/templates/html/bugreport.phtml b/app/code/Magento/Theme/view/frontend/templates/html/bugreport.phtml index f81d5ae8386c690c113ed59a1ed5fef74a7ed333..1b984b454f0a535088d61127e9cf02cfc8f74add 100644 --- a/app/code/Magento/Theme/view/frontend/templates/html/bugreport.phtml +++ b/app/code/Magento/Theme/view/frontend/templates/html/bugreport.phtml @@ -10,5 +10,4 @@ target="_blank"> <?php echo __('Report All Bugs') ?> </a> - <strong><?php echo __('(ver. %1)', \Magento\Framework\AppInterface::VERSION) ?></strong> </small> diff --git a/app/code/Magento/Theme/view/frontend/templates/html/footer.phtml b/app/code/Magento/Theme/view/frontend/templates/html/footer.phtml index d5e3ef7851329e5893cbf7ad15fe45fdf7cf8efb..f158afa5e9c95d49f2cd9c044a8af6f4bca4a7fa 100644 --- a/app/code/Magento/Theme/view/frontend/templates/html/footer.phtml +++ b/app/code/Magento/Theme/view/frontend/templates/html/footer.phtml @@ -12,7 +12,7 @@ <?php echo $block->getChildHtml() ?> <p class="bugs"><?php echo __('Help Us Keep Magento Healthy') ?> - <a href="http://www.magentocommerce.com/bug-tracking" - target="_blank"><strong><?php echo __('Report All Bugs') ?></strong></a> <?php echo __('(ver. %1)', \Magento\Framework\AppInterface::VERSION) ?> + target="_blank"><strong><?php echo __('Report All Bugs') ?></strong></a> </p> <address><?php echo $block->getCopyright() ?></address> </div> diff --git a/app/code/Magento/Translation/Model/Js/Config/Source/Strategy.php b/app/code/Magento/Translation/Model/Js/Config/Source/Strategy.php index 767e228a82bedbb224aefb6815fdc1604d9946a8..fbeee6f52b5b8970db50e1e8b554fa184a987d28 100644 --- a/app/code/Magento/Translation/Model/Js/Config/Source/Strategy.php +++ b/app/code/Magento/Translation/Model/Js/Config/Source/Strategy.php @@ -15,8 +15,8 @@ class Strategy implements \Magento\Framework\Option\ArrayInterface public function toOptionArray() { return [ - ['label' => __('Dictionary (Translation on frontend side)'), 'value' => Config::DICTIONARY_STRATEGY], - ['label' => __('Embedded (Translation on backend side)'), 'value' => Config::EMBEDDED_STRATEGY] + ['label' => __('Dictionary (Translation on Storefront side)'), 'value' => Config::DICTIONARY_STRATEGY], + ['label' => __('Embedded (Translation on Admin side)'), 'value' => Config::EMBEDDED_STRATEGY] ]; } } diff --git a/app/code/Magento/Translation/Test/Unit/Model/Js/Config/Source/StrategyTest.php b/app/code/Magento/Translation/Test/Unit/Model/Js/Config/Source/StrategyTest.php index 8fdc964cc9a01c5c37e73536b8dd9899e46542a3..2f41a8df24008c96f40085d09a9ab50c7e1ada0f 100644 --- a/app/code/Magento/Translation/Test/Unit/Model/Js/Config/Source/StrategyTest.php +++ b/app/code/Magento/Translation/Test/Unit/Model/Js/Config/Source/StrategyTest.php @@ -35,8 +35,8 @@ class StrategyTest extends \PHPUnit_Framework_TestCase public function testToOptionArray() { $expected = [ - ['label' => 'Dictionary (Translation on frontend side)', 'value' => Config::DICTIONARY_STRATEGY], - ['label' => 'Embedded (Translation on backend side)', 'value' => Config::EMBEDDED_STRATEGY] + ['label' => 'Dictionary (Translation on Storefront side)', 'value' => Config::DICTIONARY_STRATEGY], + ['label' => 'Embedded (Translation on Admin side)', 'value' => Config::EMBEDDED_STRATEGY] ]; $this->assertEquals($expected, $this->model->toOptionArray()); } diff --git a/app/code/Magento/Ui/Component/Control/ActionPool.php b/app/code/Magento/Ui/Component/Control/ActionPool.php index 74f327fec1531089563d850815d93ad1bdbfc351..6ccb8393648dc0337a7acc66d6f4022acfbce878 100644 --- a/app/code/Magento/Ui/Component/Control/ActionPool.php +++ b/app/code/Magento/Ui/Component/Control/ActionPool.php @@ -128,7 +128,7 @@ class ActionPool implements ActionPoolInterface { $container = $this->context->getPageLayout()->createBlock( 'Magento\Ui\Component\Control\Container', - 'container-' . $key, + 'container-' . $view->getName() . '-' . $key, [ 'data' => [ 'button_item' => $this->items[$key], diff --git a/app/code/Magento/Ui/Test/Unit/Component/Control/ActionPoolTest.php b/app/code/Magento/Ui/Test/Unit/Component/Control/ActionPoolTest.php index eaae007216af0aa226ff98336e22c727190102a0..8d62c797c2f061a82c07d05bfae258a47a1922ef 100644 --- a/app/code/Magento/Ui/Test/Unit/Component/Control/ActionPoolTest.php +++ b/app/code/Magento/Ui/Test/Unit/Component/Control/ActionPoolTest.php @@ -99,6 +99,7 @@ class ActionPoolTest extends \PHPUnit_Framework_TestCase public function testAdd() { $data = ['id' => 'id']; + $this->uiComponentInterfaceMock->expects($this->once())->method('getName')->willReturn('name'); $this->itemFactoryMock->expects($this->any())->method('create')->willReturn($this->items[$this->key]); $this->items[$this->key]->expects($this->any())->method('setData')->with($data)->willReturnSelf(); @@ -114,7 +115,7 @@ class ActionPoolTest extends \PHPUnit_Framework_TestCase ->method('createBlock') ->with( 'Magento\Ui\Component\Control\Container', - 'container-' . $this->key, + 'container-name-' . $this->key, [ 'data' => [ 'button_item' => $this->items[$this->key], diff --git a/app/code/Magento/Ups/Model/Carrier.php b/app/code/Magento/Ups/Model/Carrier.php index 3085a8b35c988766d5d48820d5727fc498c1bf65..fca7588c0ae155c8385f87d3ab9654d9e1d45e97 100644 --- a/app/code/Magento/Ups/Model/Carrier.php +++ b/app/code/Magento/Ups/Model/Carrier.php @@ -991,7 +991,7 @@ XMLAuth; */ protected function _parseXmlTrackingResponse($trackingValue, $xmlResponse) { - $errorTitle = 'Unable to retrieve tracking'; + $errorTitle = 'For some reason we can\'t retrieve tracking info right now.'; $resultArr = []; $packageProgress = []; diff --git a/app/code/Magento/UrlRewrite/Block/Catalog/Edit/Form.php b/app/code/Magento/UrlRewrite/Block/Catalog/Edit/Form.php index 72896f855e57bc407fe0da9461110c61fb8aaba3..8ac824f7749d65d34665681f1488a63454d70da1 100644 --- a/app/code/Magento/UrlRewrite/Block/Catalog/Edit/Form.php +++ b/app/code/Magento/UrlRewrite/Block/Catalog/Edit/Form.php @@ -193,7 +193,7 @@ class Form extends \Magento\UrlRewrite\Block\Edit\Form } elseif ($category->getId()) { $entityStores = (array)$category->getStoreIds(); $message = __( - 'We can\'t set up a URL rewrite because the category you chose is not associated with a website.' + 'Please assign a website to the selected category.' ); if (!$entityStores) { throw new \Magento\Framework\Exception\LocalizedException($message); diff --git a/app/code/Magento/UrlRewrite/Block/Cms/Page/Edit/Form.php b/app/code/Magento/UrlRewrite/Block/Cms/Page/Edit/Form.php index e3e28f33127c8cfe490a42e01c0069cde42b2e3c..5ebbfd8f76ef9743d36c022756ce8d06f43642cd 100644 --- a/app/code/Magento/UrlRewrite/Block/Cms/Page/Edit/Form.php +++ b/app/code/Magento/UrlRewrite/Block/Cms/Page/Edit/Form.php @@ -113,7 +113,7 @@ class Form extends \Magento\UrlRewrite\Block\Edit\Form if (!$entityStores) { throw new \Magento\Framework\Exception\LocalizedException( - __('Chosen cms page does not associated with any website.') + __('Please assign a website to the selected CMS page.') ); } } diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Delete.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Delete.php index bea135dcedc2b3f78a1d388ff70e96973167da69..a0ed60907fd0d715e343032951c9aa12e87169ce 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Delete.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Delete.php @@ -18,7 +18,7 @@ class Delete extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite if ($this->_getUrlRewrite()->getId()) { try { $this->_getUrlRewrite()->delete(); - $this->messageManager->addSuccess(__('The URL Rewrite has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the URL rewrite.')); } catch (\Exception $e) { $this->messageManager->addException($e, __('We can\'t delete URL Rewrite right now.')); $this->_redirect('adminhtml/*/edit/', ['id' => $this->_getUrlRewrite()->getId()]); diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php index 8ca7008efc034ccf5cc5bf17d2fe659105543a4f..951b0885f72fb283fb44ffb0771055d76edd35a4 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php @@ -90,8 +90,8 @@ class Save extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite $rewrite = $this->urlFinder->findOneByData($data); if (!$rewrite) { $message = $model->getEntityType() === self::ENTITY_TYPE_PRODUCT - ? __('Chosen product does not associated with the chosen store or category.') - : __('Chosen category does not associated with the chosen store.'); + ? __('The product you chose is not associated with the selected store or category.') + : __('The category you chose is not associated with the selected store.'); throw new LocalizedException($message); } $targetPath = $rewrite->getRequestPath(); @@ -166,7 +166,7 @@ class Save extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite $this->messageManager->addError($e->getMessage()); $session->setUrlRewriteData($data); } catch (\Exception $e) { - $this->messageManager->addException($e, __('An error occurred while saving URL Rewrite.')); + $this->messageManager->addException($e, __('Something went wrong while saving URL Rewrite.')); $session->setUrlRewriteData($data); } } diff --git a/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php b/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php index 5f43bab59e6b863b06f8ddd1e0b8617ea9095d63..a97e46e7f7a102d9c1dbd1d17eeafb1ade94009c 100644 --- a/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php +++ b/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php @@ -42,12 +42,7 @@ class Forgotpassword extends \Magento\User\Controller\Adminhtml\Auth } } // @codingStandardsIgnoreStart - $this->messageManager->addSuccess( - __( - 'If there is an account associated with %1 you will receive an email with a link to reset your password.', - $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($email) - ) - ); + $this->messageManager->addSuccess(__('We\'ll email you a link to reset your password.')); // @codingStandardsIgnoreEnd $this->getResponse()->setRedirect( $this->_objectManager->get('Magento\Backend\Helper\Data')->getHomePageUrl() diff --git a/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPasswordPost.php b/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPasswordPost.php index 834e5e19b0139bc183c8c872fd0b042b179e3609..bae69c2415f3cb6578f41b558285864b12653840 100644 --- a/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPasswordPost.php +++ b/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPasswordPost.php @@ -41,7 +41,7 @@ class ResetPasswordPost extends \Magento\User\Controller\Adminhtml\Auth $user->setRpTokenCreatedAt(null); try { $user->save(); - $this->messageManager->addSuccess(__('Your password has been updated.')); + $this->messageManager->addSuccess(__('You updated your password.')); $this->getResponse()->setRedirect( $this->_objectManager->get('Magento\Backend\Helper\Data')->getHomePageUrl() ); diff --git a/app/code/Magento/Usps/Model/Carrier.php b/app/code/Magento/Usps/Model/Carrier.php index 2d7845696c840f6695756459fa162e9c1832b5b5..2aa0517e787d4542532f33244d1454aefc40af08 100644 --- a/app/code/Magento/Usps/Model/Carrier.php +++ b/app/code/Magento/Usps/Model/Carrier.php @@ -1038,7 +1038,7 @@ class Carrier extends AbstractCarrierOnline implements \Magento\Shipping\Model\C */ protected function _parseXmlTrackingResponse($trackingvalue, $response) { - $errorTitle = __('Unable to retrieve tracking'); + $errorTitle = __('For some reason we can\'t retrieve tracking info right now.'); $resultArr = []; if (strlen(trim($response)) > 0) { if (strpos(trim($response), '<?xml') === 0) { diff --git a/app/code/Magento/Version/Controller/Index/Index.php b/app/code/Magento/Version/Controller/Index/Index.php index 687e3d3d5163512fb83214e04961b43d359ba1ba..0fe6235bc6ca091e830b184ffa73b3be57875e58 100644 --- a/app/code/Magento/Version/Controller/Index/Index.php +++ b/app/code/Magento/Version/Controller/Index/Index.php @@ -9,6 +9,7 @@ namespace Magento\Version\Controller\Index; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; use Magento\Framework\App\ProductMetadataInterface; +use Magento\Framework\Exception\StateException; /** * Magento Version controller @@ -31,15 +32,21 @@ class Index extends Action } /** - * Sets the response body with ProductName/Version (Edition). E.g.: Magento/0.42.0-beta3 (Community) + * Sets the response body to ProductName/Major.MinorVersion (Edition). E.g.: Magento/0.42 (Community). Omits patch + * version from response * * @return void */ public function execute() { + $versionParts = explode('.', $this->productMetadata->getVersion()); + if (!isset($versionParts[0]) || !isset($versionParts[1])) { + return ; // Major and minor version are not set - return empty response + } + $majorMinorVersion = $versionParts[0] . '.' . $versionParts[1]; $this->getResponse()->setBody( $this->productMetadata->getName() . '/' . - $this->productMetadata->getVersion() . ' (' . + $majorMinorVersion . ' (' . $this->productMetadata->getEdition() . ')' ); } diff --git a/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/row.phtml b/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/row.phtml index 599d7090877d8aa023ecc9f1d9eea19a540d39a1..895d24c39df169211691a74995cb870d14387c8a 100644 --- a/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/row.phtml +++ b/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/row.phtml @@ -55,7 +55,7 @@ $_item = $block->getItem(); <?php endif; ?> <?php if ($block->displayFinalPrice()): ?> - <span class="nobr"><?php echo __('Total incl. tax'); ?>:<br /> + <span class="nobr"><?php echo __('Total Incl. Tax'); ?>:<br /> <?php echo $block->formatPrice($block->getFinalRowDisplayPriceInclTax()); ?> </span> <?php endif; ?> diff --git a/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/total.phtml b/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/total.phtml index c244c34fcd635225bca5de9e01951e13ad4d1b65..fa900ef262afccc8051d3c36235b0e698bae2225 100644 --- a/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/total.phtml +++ b/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/total.phtml @@ -59,7 +59,7 @@ $_item = $block->getItem(); <?php endif; ?> <?php if ($block->displayFinalPrice()): ?> - <span class="nobr"><?php echo __('Total incl. tax'); ?>:<br /> + <span class="nobr"><?php echo __('Total Incl. Tax'); ?>:<br /> <?php echo $block->formatPrice($block->getFinalRowDisplayPriceInclTax() - $_item->getTotalDiscountAmount()); ?> </span> <?php endif; ?> diff --git a/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/unit.phtml b/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/unit.phtml index aa5c38559b77c190c08714914348684dda99eb3d..0e46e952e94f1dd3f091b7290ae494139cfa76b9 100644 --- a/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/unit.phtml +++ b/app/code/Magento/Weee/view/adminhtml/templates/order/create/items/price/unit.phtml @@ -56,7 +56,7 @@ $_item = $block->getItem(); <?php endif; ?> <?php if ($block->displayFinalPrice()): ?> - <span class="nobr"><?php echo __('Total incl. tax'); ?>:<br /> + <span class="nobr"><?php echo __('Total Incl. Tax'); ?>:<br /> <?php echo $block->formatPrice($block->getFinalUnitDisplayPriceInclTax()); ?> </span> <?php endif; ?> diff --git a/app/code/Magento/Weee/view/frontend/templates/checkout/onepage/review/item/price/row_incl_tax.phtml b/app/code/Magento/Weee/view/frontend/templates/checkout/onepage/review/item/price/row_incl_tax.phtml index aa0dc8fc35660080033c83efa2d1f70916338b94..bdb9d5253afcf6e202ccc618535b370053ef905e 100644 --- a/app/code/Magento/Weee/view/frontend/templates/checkout/onepage/review/item/price/row_incl_tax.phtml +++ b/app/code/Magento/Weee/view/frontend/templates/checkout/onepage/review/item/price/row_incl_tax.phtml @@ -32,7 +32,7 @@ $_weeeHelper = $this->helper('Magento\Weee\Helper\Data'); <?php if ($block->displayFinalPrice()): ?> <span class="cart-tax-total" data-mage-init='{"taxToggle": {"itemTaxId" : "#subtotal-item-tax-details<?php echo $_item->getId(); ?>"}}'> - <span class="weee" data-label="<?php echo __('Total incl. tax'); ?>"> + <span class="weee" data-label="<?php echo __('Total Incl. Tax'); ?>"> <?php echo $block->formatPrice($block->getFinalRowDisplayPriceInclTax()); ?> </span> </span> diff --git a/app/code/Magento/Weee/view/frontend/templates/checkout/onepage/review/item/price/unit_incl_tax.phtml b/app/code/Magento/Weee/view/frontend/templates/checkout/onepage/review/item/price/unit_incl_tax.phtml index 86215bdc615bf3170cc5558b8636363df938e7c9..c8292b0458715099baf245afb36fa8b014f0170a 100644 --- a/app/code/Magento/Weee/view/frontend/templates/checkout/onepage/review/item/price/unit_incl_tax.phtml +++ b/app/code/Magento/Weee/view/frontend/templates/checkout/onepage/review/item/price/unit_incl_tax.phtml @@ -33,7 +33,7 @@ $_weeeHelper = $this->helper('Magento\Weee\Helper\Data'); <?php if ($block->displayFinalPrice()): ?> <span class="cart-tax-total" data-mage-init='{"taxToggle": {"itemTaxId" : "#unit-item-tax-details<?php echo $_item->getId(); ?>"}}'> - <span class="weee" data-label="<?php echo __('Total incl. tax'); ?>"> + <span class="weee" data-label="<?php echo __('Total Incl. Tax'); ?>"> <?php echo $block->formatPrice($block->getFinalUnitDisplayPriceInclTax()); ?> </span> </span> diff --git a/app/code/Magento/Weee/view/frontend/templates/email/items/price/row.phtml b/app/code/Magento/Weee/view/frontend/templates/email/items/price/row.phtml index 14fe72fb68fe09e6fa2ae0626ff717841e01261b..f4435da518855528a2bbfb13577e8802eb1d17e7 100644 --- a/app/code/Magento/Weee/view/frontend/templates/email/items/price/row.phtml +++ b/app/code/Magento/Weee/view/frontend/templates/email/items/price/row.phtml @@ -58,7 +58,7 @@ $_order = $_item->getOrder(); <?php endif; ?> <?php if ($block->displayFinalPrice()): ?> - <span class="nobr"><?php echo __('Total incl. tax'); ?>:<br /> <?php echo $_order->formatPrice($block->getFinalRowDisplayPriceInclTax()); ?></span> + <span class="nobr"><?php echo __('Total Incl. Tax'); ?>:<br /> <?php echo $_order->formatPrice($block->getFinalRowDisplayPriceInclTax()); ?></span> <?php endif; ?> <?php endif; ?> <?php endif; ?> diff --git a/app/code/Magento/Weee/view/frontend/templates/item/price/row.phtml b/app/code/Magento/Weee/view/frontend/templates/item/price/row.phtml index 048dd29fe02c936d2de3283d22ea28f2c6cef2f9..0f38316c1bea1c730789b270750968dee8a48ea9 100644 --- a/app/code/Magento/Weee/view/frontend/templates/item/price/row.phtml +++ b/app/code/Magento/Weee/view/frontend/templates/item/price/row.phtml @@ -33,7 +33,7 @@ $item = $block->getItem(); <?php if ($block->displayFinalPrice()): ?> <span class="cart-tax-total" data-mage-init='{"taxToggle": {"itemTaxId" : "#subtotal-item-tax-details<?php echo $item->getId(); ?>"}}'> - <span class="weee" data-label="<?php echo $block->escapeHtml(__('Total incl. tax')); ?>"> + <span class="weee" data-label="<?php echo $block->escapeHtml(__('Total Incl. Tax')); ?>"> <?php echo $block->formatPrice($block->getFinalRowDisplayPriceInclTax()); ?> </span> </span> diff --git a/app/code/Magento/Weee/view/frontend/templates/item/price/unit.phtml b/app/code/Magento/Weee/view/frontend/templates/item/price/unit.phtml index ebe9db5b9119d92e0cc6bb5ef6e0b374d2b23a87..f15ae2b8ae01367a9087064b5b1de9ebbc01f9a7 100644 --- a/app/code/Magento/Weee/view/frontend/templates/item/price/unit.phtml +++ b/app/code/Magento/Weee/view/frontend/templates/item/price/unit.phtml @@ -33,7 +33,7 @@ $item = $block->getItem(); <?php if ($block->displayFinalPrice()): ?> <span class="cart-tax-total" data-mage-init='{"taxToggle": {"itemTaxId" : "#unit-item-tax-details<?php echo $item->getId(); ?>"}}'> - <span class="weee" data-label="<?php echo $block->escapeHtml(__('Total incl. tax')); ?>"> + <span class="weee" data-label="<?php echo $block->escapeHtml(__('Total Incl. Tax')); ?>"> <?php echo $block->formatPrice($block->getFinalUnitDisplayPriceInclTax()); ?> </span> </span> diff --git a/app/code/Magento/Weee/view/frontend/web/template/checkout/review/item/price/row_incl_tax.html b/app/code/Magento/Weee/view/frontend/web/template/checkout/review/item/price/row_incl_tax.html index cfc024de59894ccc0f833f6d66ccfad9fc2e68d6..bfaa8c3f176722b4e50b1c0e7ff9f0bff45410af 100644 --- a/app/code/Magento/Weee/view/frontend/web/template/checkout/review/item/price/row_incl_tax.html +++ b/app/code/Magento/Weee/view/frontend/web/template/checkout/review/item/price/row_incl_tax.html @@ -29,7 +29,7 @@ <!-- ko if: isDisplayFinalPrice(item)--> <span class="cart-tax-total" data-bind="mageInit: {taxToggle: {itemTaxId : '#subtotal-item-tax-details'+item.item_id}}"> - <span class="weee" data-bind="attr: {'data-label':$t('Total incl. tax')}"> + <span class="weee" data-bind="attr: {'data-label':$t('Total Incl. Tax')}"> <span class="price" data-bind="text: getFormattedPrice(getFinalRowDisplayPriceInclTax(item))"></span> </span> </span> diff --git a/app/code/Magento/Weee/view/frontend/web/template/checkout/review/item/price/unit_incl_tax.html b/app/code/Magento/Weee/view/frontend/web/template/checkout/review/item/price/unit_incl_tax.html index 175b2968e1472b3ee3400b7cdd87d7ba2b52b3a3..1a67282073225531a6137bd83361a08d60c2287e 100644 --- a/app/code/Magento/Weee/view/frontend/web/template/checkout/review/item/price/unit_incl_tax.html +++ b/app/code/Magento/Weee/view/frontend/web/template/checkout/review/item/price/unit_incl_tax.html @@ -30,7 +30,7 @@ <!-- ko if: isDisplayFinalPrice(item)--> <span class="cart-tax-total" data-bind="mageInit: {taxToggle: {itemTaxId : '#unit-item-tax-details'+item.item_id}}"> - <span class="weee" data-bind="attr: {'data-label':$t('Total incl. tax')}"> + <span class="weee" data-bind="attr: {'data-label':$t('Total Incl. Tax')}"> <span class="price" data-bind="text: getFormattedPrice(getFinalUnitDisplayPriceInclTax(item))"></span> </span> </span> diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main.php index 23b609a0e5b35e99f59a39a9b90fbb52cebe282e..d281c60358dbe62eb053edcae2a9349999a14fd3 100644 --- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main.php +++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main.php @@ -62,7 +62,7 @@ class Main extends \Magento\Backend\Block\Widget\Form\Generic implements \Magent */ public function getTabLabel() { - return __('Frontend Properties'); + return __('Storefront Properties'); } /** @@ -72,7 +72,7 @@ class Main extends \Magento\Backend\Block\Widget\Form\Generic implements \Magent */ public function getTabTitle() { - return __('Frontend Properties'); + return __('Storefront Properties'); } /** @@ -120,7 +120,7 @@ class Main extends \Magento\Backend\Block\Widget\Form\Generic implements \Magent ['data' => ['id' => 'edit_form', 'action' => $this->getData('action'), 'method' => 'post']] ); - $fieldset = $form->addFieldset('base_fieldset', ['legend' => __('Frontend Properties')]); + $fieldset = $form->addFieldset('base_fieldset', ['legend' => __('Storefront Properties')]); if ($widgetInstance->getId()) { $fieldset->addField('instance_id', 'hidden', ['name' => 'instance_id']); diff --git a/app/code/Magento/Wishlist/Block/Cart/Item/Renderer/Actions/MoveToWishlist.php b/app/code/Magento/Wishlist/Block/Cart/Item/Renderer/Actions/MoveToWishlist.php new file mode 100644 index 0000000000000000000000000000000000000000..790280fe2d76c33de1c57a74a2850728f86ae244 --- /dev/null +++ b/app/code/Magento/Wishlist/Block/Cart/Item/Renderer/Actions/MoveToWishlist.php @@ -0,0 +1,52 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Wishlist\Block\Cart\Item\Renderer\Actions; + +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Framework\View\Element\Template; +use Magento\Wishlist\Helper\Data; + +class MoveToWishlist extends Generic +{ + /** + * @var Data + */ + protected $wishlistHelper; + + /** + * @param Template\Context $context + * @param Data $wishlistHelper + * @param array $data + */ + public function __construct( + Template\Context $context, + Data $wishlistHelper, + array $data = [] + ) { + $this->wishlistHelper = $wishlistHelper; + parent::__construct($context, $data); + } + + /** + * Check whether "add to wishlist" button is allowed in cart + * + * @return bool + */ + public function isAllowInCart() + { + return $this->wishlistHelper->isAllowInCart(); + } + + /** + * Get JSON POST params for moving from cart + * + * @return string + */ + public function getMoveFromCartParams() + { + return $this->wishlistHelper->getMoveFromCartParams($this->getItem()->getId()); + } +} diff --git a/app/code/Magento/Wishlist/Controller/Index/Send.php b/app/code/Magento/Wishlist/Controller/Index/Send.php index 4e5e9fb2ffe7f985845df88428cc59793501c19f..6baaa3772cd54918abf677eb2470100daa1a7af8 100644 --- a/app/code/Magento/Wishlist/Controller/Index/Send.php +++ b/app/code/Magento/Wishlist/Controller/Index/Send.php @@ -155,7 +155,7 @@ class Send extends Action\Action implements IndexInterface foreach ($emails as $index => $email) { $email = trim($email); if (!\Zend_Validate::is($email, 'EmailAddress')) { - $error = __('Please input a valid email address.'); + $error = __('Please enter a valid email address.'); break; } $emails[$index] = $email; diff --git a/app/code/Magento/Wishlist/Model/ItemCarrier.php b/app/code/Magento/Wishlist/Model/ItemCarrier.php index ab9a4d500fdf5ebdc20cb98bf5975929607759da..ccd49bdcb4e84c7c99b25f63a17e6cace5ccf2a2 100644 --- a/app/code/Magento/Wishlist/Model/ItemCarrier.php +++ b/app/code/Magento/Wishlist/Model/ItemCarrier.php @@ -153,7 +153,7 @@ class ItemCarrier } } catch (\Exception $e) { $this->logger->critical($e); - $messages[] = __('We can\'t add this item to your cart right now.'); + $messages[] = __('We can\'t add this item to your shopping cart right now.'); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php b/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e64e5803f094a2210a09b9b5536f5c441b4416f4 --- /dev/null +++ b/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php @@ -0,0 +1,71 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Wishlist\Test\Unit\Block\Cart\Item\Renderer\Actions; + +use Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist; +use Magento\Quote\Model\Quote\Item; +use Magento\Wishlist\Helper\Data; + +class MoveToWishlistTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var MoveToWishlist + */ + protected $model; + + /** @var Data|\PHPUnit_Framework_MockObject_MockObject */ + protected $wishlistHelperMock; + + protected function setUp() + { + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->wishlistHelperMock = $this->getMockBuilder('Magento\Wishlist\Helper\Data') + ->disableOriginalConstructor() + ->getMock(); + + $this->model = $objectManagerHelper->getObject( + 'Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist', + [ + 'wishlistHelper' => $this->wishlistHelperMock, + ] + ); + } + + public function testIsAllowInCart() + { + $this->wishlistHelperMock->expects($this->once()) + ->method('isAllowInCart') + ->willReturn(true); + + $this->assertTrue($this->model->isAllowInCart()); + } + + public function testGetMoveFromCartParams() + { + $itemId = 45; + $json = '{json;}'; + + /** + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') + ->disableOriginalConstructor() + ->getMock(); + + $itemMock->expects($this->once()) + ->method('getId') + ->willReturn($itemId); + + $this->wishlistHelperMock->expects($this->once()) + ->method('getMoveFromCartParams') + ->with($itemId) + ->willReturn($json); + + $this->model->setItem($itemMock); + $this->assertEquals($json, $this->model->getMoveFromCartParams()); + } +} diff --git a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php index 55575d82b276d5b735d18147be9c1861ef068060..dd6dca9871675141bc97ee50dc555636caa98860 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php @@ -386,9 +386,9 @@ class SendTest extends \PHPUnit_Framework_TestCase '', 'This wish list can be shared 1 more times.' ], - ['test text', 100, 'wrongEmailAddress', 1, 0, '', 'Please input a valid email address.'], - ['test text', 100, 'user1@example.com, wrongEmailAddress', 2, 0, '', 'Please input a valid email address.'], - ['test text', 100, 'wrongEmailAddress, user2@example.com', 2, 0, '', 'Please input a valid email address.'], + ['test text', 100, 'wrongEmailAddress', 1, 0, '', 'Please enter a valid email address.'], + ['test text', 100, 'user1@example.com, wrongEmailAddress', 2, 0, '', 'Please enter a valid email address.'], + ['test text', 100, 'wrongEmailAddress, user2@example.com', 2, 0, '', 'Please enter a valid email address.'], ]; } diff --git a/app/code/Magento/Wishlist/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Wishlist/view/frontend/layout/checkout_cart_item_renderers.xml new file mode 100644 index 0000000000000000000000000000000000000000..6318b605dd52b13999b0337d28905768f4162d14 --- /dev/null +++ b/app/code/Magento/Wishlist/view/frontend/layout/checkout_cart_item_renderers.xml @@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> + <body> + <referenceBlock name="checkout.cart.item.renderers.default.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.default.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.default.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.simple.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.simple.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.simple.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.bundle.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.bundle.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.bundle.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.downloadable.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.downloadable.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.downloadable.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.grouped.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.grouped.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.grouped.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.configurable.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.configurable.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.configurable.actions.edit"/> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.virtual.actions"> + <block class="Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist" name="checkout.cart.item.renderers.virtual.actions.move_to_wishlist" template="cart/item/renderer/actions/move_to_wishlist.phtml" before="checkout.cart.item.renderers.virtual.actions.edit"/> + </referenceBlock> + </body> +</page> diff --git a/app/code/Magento/Wishlist/view/frontend/templates/cart/item/renderer/actions/move_to_wishlist.phtml b/app/code/Magento/Wishlist/view/frontend/templates/cart/item/renderer/actions/move_to_wishlist.phtml new file mode 100644 index 0000000000000000000000000000000000000000..196122cf80c6e05975bedfd5ec7dfba3df9b3c2e --- /dev/null +++ b/app/code/Magento/Wishlist/view/frontend/templates/cart/item/renderer/actions/move_to_wishlist.phtml @@ -0,0 +1,17 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +/** @var $block \Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist */ +?> +<?php if ($block->isAllowInCart() && $block->isProductVisibleInSiteVisibility()): ?> + <a href="#" + data-post='<?php echo $block->getMoveFromCartParams(); ?>' + class="use-ajax action action-towishlist"> + <span><?php echo __('Move to Wishlist'); ?></span> + </a> +<?php endif ?> diff --git a/app/code/Magento/Wishlist/view/frontend/templates/options_list.phtml b/app/code/Magento/Wishlist/view/frontend/templates/options_list.phtml index a4c5d416a359e599fd6bd44c09b6cfb7676366c3..11ce019d59d000f5c8d3e8cc5fa015117a27e37a 100644 --- a/app/code/Magento/Wishlist/view/frontend/templates/options_list.phtml +++ b/app/code/Magento/Wishlist/view/frontend/templates/options_list.phtml @@ -12,7 +12,7 @@ <?php $options = $block->getOptionList(); ?> <?php if ($options): ?> <div class="tooltip wrapper product-item-tooltip"> - <span class="action details tooltip toggle"><?php echo __('View Details') ?></span> + <span class="action details tooltip toggle"><?php echo __('See Details') ?></span> <div class="tooltip content"> <strong class="subtitle"><?php echo __('Options Details'); ?></strong> <dl> diff --git a/app/code/Magento/Wishlist/view/frontend/templates/rss/email.phtml b/app/code/Magento/Wishlist/view/frontend/templates/rss/email.phtml index 8655b864bc2fa14eb7e87f6464710acd5430f7df..7043be8d41932d846e1461f7ed5ce9db6f41afdd 100644 --- a/app/code/Magento/Wishlist/view/frontend/templates/rss/email.phtml +++ b/app/code/Magento/Wishlist/view/frontend/templates/rss/email.phtml @@ -10,7 +10,7 @@ ?> <?php if ($block->getLink()): ?> <p style="font-size:12px; line-height:16px; margin:0 0 16px;"> - <?php echo __("RSS link to %1's wishlist", $this->helper('Magento\Wishlist\Helper\Data')->getCustomerName()) ?> + <?php echo __("RSS link to %1's wishlist", $block->escapeHtml($this->helper('Magento\Wishlist\Helper\Data')->getCustomerName())) ?> <br /> <a href="<?php echo $block->getLink(); ?>"><?php echo $block->getLink(); ?></a> </p> diff --git a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/_menu.less b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/_menu.less index 7301a194265965ffa0776e50028458db1651537d..f9f3626a797841f200bd61b84fc36e99525fc61f 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/_menu.less +++ b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/_menu.less @@ -52,7 +52,7 @@ // --------------------------------------------- .menu-wrapper { - float: left; + display: inline-block; position: relative; width: @menu__width; z-index: @menu__z-index; @@ -205,7 +205,7 @@ min-height: ~'calc(@{menu-logo__outer-size} + 2rem + 100%)'; padding: @submenu__padding-vertical 0 0; position: absolute; - top: -@menu-logo__outer-size; + top: 0; transform: translateX(-100%); transition-property: transform, visibility; transition-duration: .3s; diff --git a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/pages/_login.less b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/pages/_login.less index 2e93e6c124f17ce361713723c553d6b078a0a1b1..8291e266f89ffefe394f731b7f062df889740a3c 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/pages/_login.less +++ b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/pages/_login.less @@ -35,6 +35,7 @@ background-color: @login-box__background-color; border: @login-box__border; box-shadow: @login-box__shadow; + display: block; float: none; margin: auto; max-width: @login-box__max-width; diff --git a/app/design/adminhtml/Magento/backend/Magento_Sales/web/css/source/module/order/_items.less b/app/design/adminhtml/Magento/backend/Magento_Sales/web/css/source/module/order/_items.less index 960bbd1e167cd11b89636a8754b5a895d5b96484..0fb9ad74b0c1a4f2ae7c560701d08957f65491cb 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Sales/web/css/source/module/order/_items.less +++ b/app/design/adminhtml/Magento/backend/Magento_Sales/web/css/source/module/order/_items.less @@ -35,6 +35,9 @@ .data-grid { .action-configure { float: right; + &.disabled { + display: none; + } } .col-id, .col-price, diff --git a/app/design/adminhtml/Magento/backend/Magento_Sales/web/css/source/module/order/_payment-shipping.less b/app/design/adminhtml/Magento/backend/Magento_Sales/web/css/source/module/order/_payment-shipping.less index fe3ebac483461cb7bd0f7899d679e2808a5dfb5b..ea24a567ab1b5fd5dbb6e5fc384e53a329c0f2ca 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Sales/web/css/source/module/order/_payment-shipping.less +++ b/app/design/adminhtml/Magento/backend/Magento_Sales/web/css/source/module/order/_payment-shipping.less @@ -10,7 +10,7 @@ .admin__payment-method-wapper { margin: 0; .admin__field { - margin-left: -4rem; + margin-left: 0; &:first-child { margin-top: 1.5rem; } @@ -81,7 +81,6 @@ } } -.order-payment-method-title, .shipping-description-title { font-weight: @font-weight__bold; } @@ -89,3 +88,13 @@ .action-create-label { margin: @indent__s 0; } + +.order-payment-method-title { + + .order-payment-currency { + margin-top: @indent__s; + } + .admin__table-secondary { + margin-top: @indent__s; + &:extend(.abs-admin__table-secondary-edit-order all); + } +} diff --git a/app/design/adminhtml/Magento/backend/web/css/source/_structure.less b/app/design/adminhtml/Magento/backend/web/css/source/_structure.less index c4431841153075f491aa72e6d42e63378bfcbb6c..4223668db061c3d223542a3f3296434f642f450a 100644 --- a/app/design/adminhtml/Magento/backend/web/css/source/_structure.less +++ b/app/design/adminhtml/Magento/backend/web/css/source/_structure.less @@ -38,7 +38,9 @@ body { .page-wrapper { background-color: @page-wrapper__background-color; - float: left; + display: inline-block; + margin-left: -4px; // Clear inline-block gap + vertical-align: top; width: ~'calc(100% - @{menu__width})'; } diff --git a/app/design/adminhtml/Magento/backend/web/css/source/forms/_controls.less b/app/design/adminhtml/Magento/backend/web/css/source/forms/_controls.less index 9eead6e701250c233efaed63dcc47cbe00dcc12c..e041f6890e8238f618b8f170ca0e424cc9841ea5 100644 --- a/app/design/adminhtml/Magento/backend/web/css/source/forms/_controls.less +++ b/app/design/adminhtml/Magento/backend/web/css/source/forms/_controls.less @@ -16,7 +16,7 @@ @field-control__background-color: @color-white; @field-control__border-color: @action__border-color; @field-control__border-radius: 1px; -@field-control__border-width: .1rem; +@field-control__border-width: 1px; @field-control__color: @color-very-dark-gray-black; @field-control__font-size: @action__font-size; @field-control__line-height: @action__line-height; diff --git a/app/design/adminhtml/Magento/backend/web/css/source/variables/_actions.less b/app/design/adminhtml/Magento/backend/web/css/source/variables/_actions.less index 356dc736f9fa37745c66acadf423763dae9113f5..c48a7d358280b7656b1aa06483fa122698533041 100644 --- a/app/design/adminhtml/Magento/backend/web/css/source/variables/_actions.less +++ b/app/design/adminhtml/Magento/backend/web/css/source/variables/_actions.less @@ -10,7 +10,11 @@ @action__border-color: @color-gray68; @action__font-size: @font-size__base; @action__line-height: @line-height__base; -@action__padding-top: round(((@field-control__height - @field-control__font-size * @field-control__line-height - @field-control__border-width * 2) / 2), 1); + +@action__padding-top: round(((@field-control__height - + (@field-control__font-size * @field-control__line-height) - + ((unit(@field-control__border-width) / @font-rem-ratio) * 2)) / 2), 1); + @action__padding-bottom: @field-control__padding-top; @action__height: 3.3rem; diff --git a/app/design/frontend/Magento/blank/Magento_Bundle/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Bundle/web/css/source/_module.less index 623c17ced66ff3742fe75ac2d72e802e1f4e1491..bd3627dbed275d6424b9d4debc2c434752664a91 100644 --- a/app/design/frontend/Magento/blank/Magento_Bundle/web/css/source/_module.less +++ b/app/design/frontend/Magento/blank/Magento_Bundle/web/css/source/_module.less @@ -94,6 +94,16 @@ } } } + .nested { + .field.qty { + .label { + .css(font-weight, @form-field-label__font-weight); + .css(margin, 0 0 @indent__xs); + display: inline-block; + } + .css(margin-top, @form-field__vertical-indent); + } + } p.required { .css(color, @form-field-label-asterisk__color); } @@ -109,7 +119,8 @@ .legend.title { &:extend(.abs-reset-left-margin all); } - .bundle-options-wrapper { + .bundle-options-wrapper, + .product-options-wrapper { float: left; width: 57%; } diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_cart.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_cart.less index 68018d4275960d6c94c3b4cff3307c69a8ac584a..089a66bff442b12dda09f922093d1e215abc9e43 100644 --- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_cart.less +++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module/_cart.less @@ -4,323 +4,326 @@ // */ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { -// -// Shopping cart -//-------------------------------------- -.cart { - // Summary block - &-summary { - &:extend(.abs-add-box-sizing all); - .css(background, @sidebar__background-color); - margin-bottom: @indent__m; - padding: 1px 15px @indent__m; - > .title { - .heading(h3); - display: block; - } - .block { - margin-bottom: 0; + // + // Shopping cart + // --------------------------------------------- + + .cart { + // Summary block + &-summary { + &:extend(.abs-add-box-sizing all); + .css(background, @sidebar__background-color); + margin-bottom: @indent__m; + padding: 1px 15px @indent__m; > .title { - .icon-font( - @_icon-font-content: @icon-down, - @_icon-font-size: 30px, - @_icon-font-position: after - ); - border-top: @border-width__base solid @border-color__base; - cursor: pointer; display: block; - font-weight: @font-weight__semibold; - margin-bottom: 0; - overflow: hidden; - padding: 7px 20px 7px 5px; - position: relative; - &:after { - position: absolute; - right: 0; - top: -5px; - } - strong { - .column.main & { - font-weight: @font-weight__regular; - .font-size(18); - } - } - } - > .content { - display: none; + .heading(h3); } - &.active { + .block { + margin-bottom: 0; > .title { - .icon-font-symbol( - @_icon-font-content: @icon-prev, - @_icon-font-position: after + border-top: @border-width__base solid @border-color__base; + cursor: pointer; + font-weight: @font-weight__semibold; + .icon-font( + @_icon-font-content: @icon-down, + @_icon-font-size: 30px, + @_icon-font-position: after, + @_icon-font-display: block ); + margin-bottom: 0; + overflow: hidden; + padding: 7px @indent__base 7px @indent__xs; + position: relative; + &:after { + position: absolute; + right: 0; + top: -5px; + } + strong { + .column.main & { + .font-size(18); + font-weight: @font-weight__regular; + } + } } > .content { - display: block; + display: none; } - } - .item-options { - margin-left: 0; - } - .fieldset { - margin: 15px 0 25px 5px; - .field { - margin: 0 0 @indent__s; - &.note { - font-size: @font-size__s; + &.active { + > .title { + .icon-font-symbol( + @_icon-font-content: @icon-prev, + @_icon-font-position: after + ); + } + > .content { + display: block; } } - } - .fieldset { - .methods { + .item-options { + margin-left: 0; + } + .fieldset { + margin: 15px 0 @indent__m @indent__xs; .field { - > .label { - display: inline; + margin: 0 0 @indent__s; + &.note { + font-size: @font-size__s; } } } - } - .fieldset.estimate { - > .legend, - > .legend + br { - &:extend(.abs-no-display all); + .fieldset { + .methods { + .field { + > .label { + display: inline; + } + } + } + } + .fieldset.estimate { + > .legend, + > .legend + br { + &:extend(.abs-no-display all); + } } } - } - .actions-toolbar { - > .primary { - button { - &:extend(.abs-revert-secondary-color all); + .actions-toolbar { + > .primary { + button { + &:extend(.abs-revert-secondary-color all); + } } } + &:extend(.abs-adjustment-incl-excl-tax all); } - &:extend(.abs-adjustment-incl-excl-tax all); - } - // Totals block - &-totals { - .table-wrapper { - overflow: inherit; - } - border-top: 1px solid @border-color__base; - padding-top: 10px; - .mark { - font-weight: @font-weight__regular; - padding-left: 4px; - strong { + // Totals block + &-totals { + border-top: 1px solid @border-color__base; + padding-top: 10px; + .table-wrapper { + overflow: inherit; + } + .mark { font-weight: @font-weight__regular; - } - } - .amount { - padding-right: 4px; - text-align: right; - strong { - font-weight: @font-weight__regular; - } - } - .grand:last-child { - .mark, - .amount { - padding-top: @indent__base; + padding-left: 4px; + strong { + font-weight: @font-weight__regular; + } } .amount { padding-right: 4px; text-align: right; strong { - font-weight: @font-weight__bold; + font-weight: @font-weight__regular; } } - } - .msrp { - margin-bottom: @indent__s; - } - .totals-tax { - &-summary { + .grand:last-child { .mark, .amount { - border-top: @border-width__base solid @border-color__base; - border-bottom: @border-width__base solid @border-color__base; - cursor: pointer; + padding-top: @indent__base; } - .amount .price { - position: relative; - padding-right: @indent__m; - .icon-font( - @icon-down, - @_icon-font-size: 30px, - @_icon-font-text-hide: true, - @_icon-font-position: after, - @_icon-font-display: block - ); - &:after { - position: absolute; - right: -5px; - top: -12px; + .amount { + padding-right: 4px; + text-align: right; + strong { + font-weight: @font-weight__bold; } } - &.expanded { + } + .msrp { + margin-bottom: @indent__s; + } + .totals-tax { + &-summary { .mark, .amount { - border-bottom: 0; + border-bottom: @border-width__base solid @border-color__base; + border-top: @border-width__base solid @border-color__base; + cursor: pointer; } .amount .price { - .icon-font-symbol( + .icon-font( + @icon-down, + @_icon-font-size: 30px, + @_icon-font-text-hide: true, + @_icon-font-position: after, + @_icon-font-display: block + ); + padding-right: @indent__m; + position: relative; + &:after { + position: absolute; + right: -5px; + top: -12px; + } + } + &.expanded { + .mark, + .amount { + border-bottom: 0; + } + .amount .price { + .icon-font-symbol( @_icon-font-content: @icon-up, @_icon-font-position: after - ); + ); + } } } - } - &-details { - display: none; - border-bottom: @border-width__base solid @border-color__base; - &.shown { - display: table-row; + &-details { + border-bottom: @border-width__base solid @border-color__base; + display: none; + &.shown { + display: table-row; + } } } + .table-wrapper { + margin-bottom: 0; + } + .table-caption { + &:extend(.abs-no-display all); + } } - .table-wrapper { - margin-bottom: 0; - } - .table-caption { - &:extend(.abs-no-display all); - } - } - // Products table - &.table-wrapper { - .items { - thead + .item { - border-top: @border-width__base solid @border-color__base; + // Products table + &.table-wrapper { + .items { + thead + .item { + border-top: @border-width__base solid @border-color__base; + } + > .item { + border-bottom: @border-width__base solid @border-color__base; + position: relative; + } } - > .item { - border-bottom: @border-width__base solid @border-color__base; - position: relative; + .col { + padding-top: 20px; + &.qty { + .input-text { + margin-top: -5px; + &:extend(.abs-input-qty all); + } + .label { + &:extend(.abs-visually-hidden all); + } + } } - } - .col { - padding-top: 20px; - &.qty { - .input-text { - margin-top: -5px; - &:extend(.abs-input-qty all); + .item { + &-actions td { + padding-bottom: @indent__s; + text-align: center; + white-space: normal; } - .label { - &:extend(.abs-visually-hidden all); + .col { + &.item { + display: block; + min-height: 75px; + padding: @indent__m 0 @indent__s 75px; + position: relative; + } } } - } - .item { - &-actions td { - padding-bottom: 10px; - text-align: center; - white-space: normal; + .actions-toolbar { + &:extend(.abs-add-clearfix all); + > .action { + &:extend(button all); + .link-as-button(); + margin-bottom: @indent__s; + margin-right: @indent__s; + &:last-child { + margin-right: 0; + } + } } - .col { - &.item { + .action { + &.help.map { + &:extend(.abs-action-button-as-link all); + font-weight: @font-weight__regular; + } + } + .product { + &-item-photo { display: block; - padding: 25px 0 10px 75px; - position: relative; - min-height: 75px; + left: 0; + max-width: 60px; + padding: 0; + position: absolute; + top: 15px; + width: 100%; + } + &-item-details { + white-space: normal; + } + &-item-name { + display: inline-block; + font-weight: @font-weight__regular; + margin-top: -6px; } } - } - .actions-toolbar { - > .action { - &:extend(button all); - .link-as-button(); - margin-left: @indent__s; - margin-bottom: @indent__s; - &:first-child { - margin-left: 0; + .gift-registry-name-label { + &:after { + content: ':'; } } - } - .action { - &.help.map { - &:extend(.abs-action-button-as-link all); - font-weight: @font-weight__regular; + // Product options + .item-options { + font-size: @font-size__s; + margin-bottom: @indent__s; + &:extend(.abs-product-options-list all); + &:extend(.abs-add-clearfix all); } - } - .product { - &-item-photo { - display: block; - max-width: 60px; - left: 0; - padding: 0; - position: absolute; - top: 15px; - width: 100%; + + .product-item-name + .item-options { + margin-top: @indent__s; } - &-item-details { - white-space: normal; + + .product-image-wrapper { + &:extend(.abs-reset-image-wrapper all); } - &-item-name { + .action.configure { display: inline-block; - font-weight: @font-weight__regular; - margin-top: -6px; + margin: 0 0 @indent__base; } } - .gift-registry-name-label { - &:after { - content: ":"; + &-container { + .form-cart { + &:extend(.abs-shopping-cart-items all); } - } - // Product options - .item-options { - font-size: @font-size__s; - margin-bottom: @indent__s; - &:extend(.abs-product-options-list all); - &:extend(.abs-add-clearfix all); - } - - .product-item-name + .item-options { - margin-top: @indent__s; - } - - .product-image-wrapper { - &:extend(.abs-reset-image-wrapper all); - } - .action.configure { - display: inline-block; - margin: 0 0 @indent__base; - } - } - &-container { - .form-cart { - &:extend(.abs-shopping-cart-items all); - } - .checkout-methods-items { - &:extend(.abs-reset-list all); - text-align: center; - margin-top: @indent__base; - .action.primary { - &:extend(.abs-button-l all); - margin-bottom: @indent__s; - width: 100%; + .checkout-methods-items { + margin-top: @indent__base; + &:extend(.abs-reset-list all); + text-align: center; + .action.primary { + &:extend(.abs-button-l all); + margin-bottom: @indent__s; + width: 100%; + } } } } -} -// -// Cross sell -//-------------------------------------- -.block.crosssell { - margin-top: 70px; -} + // + // Cross sell + // --------------------------------------------- + .block.crosssell { + margin-top: 70px; + } } // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { .cart { &.table-wrapper { @@ -341,7 +344,7 @@ white-space: nowrap; width: 33%; &:before { - content: attr(data-th) ":"; + content: attr(data-th) ':'; display: block; font-weight: @font-weight__bold; padding-bottom: 10px; @@ -360,12 +363,16 @@ &:extend(.abs-shopping-cart-items-mobile all); } } + &.table-wrapper { + overflow: inherit; + } } } // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .cart { &-container { @@ -378,8 +385,8 @@ } } &-summary { - position: relative; float: right; + position: relative; width: 23%; .actions-toolbar { .column.main & { @@ -413,11 +420,11 @@ .product { &-item-photo { display: table-cell; + max-width: 100%; padding-right: @indent__base; + position: static; vertical-align: top; width: 1%; - position: static; - max-width: 100%; } &-item-details { display: table-cell; diff --git a/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/_module.less index 121a06f86bf824d7b5d34d90caf7dfd36c74bad5..2d0e55d1620636743623cfea6dd99a900743cc73 100644 --- a/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/_module.less +++ b/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/_module.less @@ -4,182 +4,288 @@ // */ // -// Common -//-------------------------------------- +// Variables +// _____________________________________________ -& when (@media-common = true) { +@gift-message-field-label__color: @color-gray40; +@gift-item-block__border-color: @color-gray-light5; +@gift-item-block__border-width: @border-width__base; + +// +// Common +// _____________________________________________ -.gift-message { - margin: 0; - .fieldset& { - > .legend { - &:extend(.abs-methods-shipping-title all); +& when (@media-common = true) { + .gift-message { + .actions-toolbar { + .action-cancel { + &:extend(.abs-action-button-as-link all); + display: none; + } } - } - .opc-wrapper .step-content .fieldset& { - br + .field { - margin: 0; + .field { + .label { + .css(color, @gift-message-field-label__color); + .css(font-weight, @font-weight__regular); + } } } - .field.choice { - font-weight: @font-weight__regular; + + .gift-options { + &:extend(.abs-add-clearfix all); + } + + .gift-options-title { margin: 0 0 @indent__base; - &:before { - display: none; + } + + .gift-options-content { + .fieldset { + margin: 0 0 @indent__base; } } - .activate.message { - display: inline-block; - margin: 0 0 @indent__s; - } - .product-image-wrapper { - &:extend(.abs-reset-image-wrapper all); - } - .options-items { - .css(background, @sidebar__background-color); - display: block; - margin: @indent__base 0 0; - padding: @indent__base; - .order-title:not(:first-child), - .extra-options-container { - font-weight: @font-weight__regular; - margin: @indent__base 0 0; - } - .order-options { - margin: 0 0 @indent__base @indent__base; - } - .block.message { - margin-bottom: @indent__s; - } - .items { - .list-reset-styles(); - .item { - border-bottom: @border-width__base solid @border-color__base; - margin-bottom: @indent__base; - padding-bottom: @indent__s; - .product { - .photo { - margin: @indent__s 0; - } - } - &:last-child { - border-bottom: 0; - padding-bottom: 0; + .gift-summary { + .actions-toolbar { + > .secondary { + float: none; + .action { + margin: @indent__s @indent__base 0 0; } } } - .number { - font-size: @font-size__s; - } - .regular-price, - .price-including-tax, - .price-excluding-tax { - &:before { - content: attr(data-label) ": "; - } - .price { - font-weight: @font-weight__bold; + } + + // + // In-table block + // --------------------------------------------- + + .cart.table-wrapper { + .gift-content { + display: none; + clear: left; + float: left; + margin-right: -100%; + padding: @indent__base 0; + width: 100%; + text-align: left; + &._active { + display: block; } } - .price-including-tax { - .font-size(14); + + .action-gift { + &:extend(.cart.table-wrapper .actions-toolbar > .action all); + .button-icon( + @icon-down, + @_icon-font-size: 32px, + @_icon-font-line-height: 16px, + @_icon-font-position: after + ); + &._active { + .icon-font-symbol( + @icon-up, + @_icon-font-position: after + ); + } } } -} -// -// Account order gift message -//-------------------------------------- -.order-details-items { - .order-gift-message, - .block-order-details-gift-message { - .item-options { - dt { - margin: @indent__s 0; - font-weight: @font-weight__regular; + // + // Collapsible block + // --------------------------------------------- + + .gift-item-block { + margin: 0; + &._active { + .title { + .icon-font-symbol( + @icon-up, + @_icon-font-position: after + ); } } - &:extend(.abs-add-clearfix all); - dt:after { - content: ""; - } - .label { - &:extend(.abs-colon all); + + .title { + border-radius: 3px; + .button( + @_button-margin: 20px 0 0, + @_button-padding: 7px 15px, + @_button-icon-use: true, + @_button-font-content: @icon-down, + @_button-icon-font: @button-icon__font, + @_button-icon-font-size: 32px, + @_button-icon-font-line-height: 16px, + @_button-icon-font-position: after + ); + .css(font-weight, @font-weight__bold); + &:active { + .css(box-shadow, @button__shadow); + } } - .item-message { - clear: left; + + .content { + &:extend(.abs-add-clearfix all); + .css(border-bottom, @gift-item-block__border-width solid @gift-item-block__border-color); + padding: @indent__s @indent__s @indent__base; + position: relative; } } -} -.order-details-items .order-items { - .order-gift-message { - &:not(.expanded-content) { - &:extend(.abs-hidden); - } - .action.close { - &:extend(.abs-no-display all); + // + // Account order gift message + // --------------------------------------------- + + .order-details-items { + .order-gift-message, + .block-order-details-gift-message { + .item-options { + dt { + .css(font-weight, @font-weight__regular); + margin: @indent__s 0; + } + } + &:extend(.abs-add-clearfix all); + dt { + &:after { + content: ''; + } + } + .label { + &:extend(.abs-colon all); + } + .item-message { + clear: left; + } } } - .action.show { - padding-right: @indent__base; - position: relative; - .icon-font( + + .order-details-items .order-items { + .order-gift-message { + &:not(.expanded-content) { + &:extend(.abs-hidden); + } + .action.close { + &:extend(.abs-no-display all); + } + } + .action.show { + .icon-font( @_icon-font-content: @icon-down, @_icon-font-size: 22px, @_icon-font-text-hide: false, @_icon-font-position: after, @_icon-font-display: inline-block - ); - &:after { - position: absolute; - right: 0; - top: -4px; - } - &.expanded { - .icon-font-symbol( + ); + padding-right: @indent__base; + position: relative; + &:after { + position: absolute; + right: 0; + top: -4px; + } + &.expanded { + .icon-font-symbol( @_icon-font-content: @icon-up, @_icon-font-position: after - ); + ); + } } } + + .block-order-details-gift-message { + border-top: @border-width__base solid @border-color__base; + padding-top: @indent__s; + } } -.block-order-details-gift-message { - border-top: @border-width__base solid @border-color__base; - padding-top: @indent__s; +// +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .gift-message { + .actions-toolbar { + .action-update { + .font-size(20); + padding: 15px; + width: 100%; + } + } + } + .gift-item-block { + border-bottom: 0; + .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); + } + .cart.table-wrapper { + .gift-content { + margin-right: -@indent__s; + } + } } +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { + .cart.table-wrapper { + .gift-content { + border-bottom: @border-width__base solid @border-color__base; + margin-bottom: @indent__base; + } + } } // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .gift-message { - .item { - border-bottom: @border-width__base solid @border-color__base; - margin-bottom: @indent__base; - padding-bottom: @indent__s; - &:extend(.abs-add-clearfix-desktop all); - .product { - float: left; - margin-right: @indent__base; - .photo { - margin: @indent__s 0; + .actions-toolbar { + .secondary { + float: right; + .action { + float: right; + margin-left: @indent__base; } - .name { - text-overflow: ellipsis; - overflow: hidden; - max-width: 145px; + .action-cancel { + display: block; + float: left; + margin-top: 6px; } } - .options { - overflow: hidden; - } } - .price-box > .price { - display: block; + .field { + &:extend(.abs-clearfix all); + .form-field-type-revert( + @_type: inline, + @_type-inline-label-align: left + ); + } + } + .gift-options-title { + .css(font-weight, @font-weight__light); + .font-size(18); + } + .gift-summary, + .cart.table-wrapper .gift-summary { + .actions-toolbar { + &:extend(.abs-reset-left-margin-desktop all); + } + } + .cart-container { + .cart-gift-item { + &:extend(.abs-shopping-cart-items-desktop all); + } + } + + // + // In-table block + // --------------------------------------------- + + .cart.table-wrapper { + .action-gift { + float: left; + } + .gift-content { + padding: @indent__base 0; } } } diff --git a/app/design/frontend/Magento/blank/web/css/source/_forms.less b/app/design/frontend/Magento/blank/web/css/source/_forms.less index 2e43d3ee29c0ce1d6a9bb5abb397d2fd58956ab4..4af33708339c7b9cc5e7d855cc5d71863720fa6e 100644 --- a/app/design/frontend/Magento/blank/web/css/source/_forms.less +++ b/app/design/frontend/Magento/blank/web/css/source/_forms.less @@ -143,8 +143,7 @@ select:focus ~ .tooltip .tooltip-content { .legend { &:extend(.abs-margin-for-forms-desktop all); } - > .field, - > .fields > .field { + > .field { .form-field-type-revert(); margin: 0 0 @form-field__vertical-indent__desktop; } diff --git a/app/design/frontend/Magento/luma/Magento_Bundle/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Bundle/web/css/source/_module.less index 688523fb46fe96bbd9b2324806791c7f22e84dd0..ed0d2520f68bba6e690ff5a8d200c6e18e846d35 100644 --- a/app/design/frontend/Magento/luma/Magento_Bundle/web/css/source/_module.less +++ b/app/design/frontend/Magento/luma/Magento_Bundle/web/css/source/_module.less @@ -176,7 +176,8 @@ .legend.title { font-size: @h1__font-size-desktop; } - .bundle-options-wrapper { + .bundle-options-wrapper, + .product-options-wrapper { float: left; width: 57%; } diff --git a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_cart.less b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_cart.less index 3b102ea7e75ff16c628f0e7dfb72dba27f006640..84fe60c7262910782021ee8c38b2d319cc66efc7 100644 --- a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_cart.less +++ b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_cart.less @@ -8,449 +8,483 @@ @cart-item-cell-padding-top: 20px; // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { -// -// Shopping cart -//-------------------------------------- -.checkout-cart-index { - .page-main { - padding-left: 0; - padding-right: 0; - } - .page-title-wrapper { - padding-left: @layout__width-xs-indent; - padding-right: @layout__width-xs-indent; - } -} -.cart { - // Cart container - &-container { - .form-cart { - &:extend(.abs-shopping-cart-items all); + // + // Shopping cart + // --------------------------------------------- + + .checkout-cart-index { + .page-main { + padding-left: 0; + padding-right: 0; + } + .page-title-wrapper { + padding-left: @layout__width-xs-indent; + padding-right: @layout__width-xs-indent; } } - - // Summary block - &-summary { - &:extend(.abs-add-box-sizing all); - .css(background, @sidebar__background-color); - margin-bottom: 25px; - padding: 1px 0 25px; - > .title { - display: none; - .font-size(24); - font-weight: @font-weight__light; - margin: 12px 0; + .cart { + // Cart container + &-container { + .form-cart { + &:extend(.abs-shopping-cart-items all); + } } - .block { - &:extend(.abs-cart-block all); - .item-options { - margin: 0 0 16px; - .field { - .radio { - float: left; - } - .radio + .label { - display: block; - overflow: hidden; - margin: 0; - } - } + // Summary block + &-summary { + &:extend(.abs-add-box-sizing all); + .css(background, @sidebar__background-color); + margin-bottom: 25px; + padding: 1px 0 25px; + > .title { + display: none; + .font-size(24); + font-weight: @font-weight__light; + margin: 12px 0; } - form:not(:last-of-type) { - .fieldset { - margin: 0 0 @indent__m; + .block { + form:not(:last-of-type) { + .fieldset { + margin: 0 0 @indent__m; + } } - } - .price { - font-weight: @font-weight__bold; - } - - .field { - margin: 0 0 16px; - &.note { - display: none; + .price { + font-weight: @font-weight__bold; } - } - .actions-toolbar { - > .primary { - text-align: left; - .action.primary { - &:extend(.abs-revert-to-action-secondary all); - width: auto; + .field { + margin: 0 0 16px; + &.note { + display: none; } } - } - .fieldset.estimate { - > .legend, - > .legend + br { - &:extend(.abs-no-display all); + .actions-toolbar { + > .primary { + text-align: left; + .action.primary { + &:extend(.abs-revert-to-action-secondary all); + width: auto; + } + } } - } - } - .page-main & { - .block { - margin-bottom: 0; + .fieldset.estimate { + > .legend, + > .legend + br { + &:extend(.abs-no-display all); + } + } + &:extend(.abs-cart-block all); + .title { + strong { + .font-size(14); + font-weight: @font-weight__semibold; + } + } + .item-options { + margin: 0 0 16px; + .field { + .radio { + float: left; + } + .radio { + + .label { + display: block; + margin: 0; + overflow: hidden; + } + } + } + } } - } - .checkout-methods-items { - &:extend(.abs-reset-list all); - margin: 20px 0 0; - padding: 0 @mobile-cart-padding; - text-align: center; - .action.primary.checkout { - &:extend(.abs-button-l all); - width: 100%; - } - .item { - margin-bottom: 25px; - &:last-child { + .page-main & { + .block { margin-bottom: 0; } } - } - .message { - padding-left: 20px; - > *:first-child:before { - display: none; + .checkout-methods-items { + &:extend(.abs-reset-list all); + margin: 20px 0 0; + padding: 0 @mobile-cart-padding; + text-align: center; + .action.primary.checkout { + &:extend(.abs-button-l all); + width: 100%; + } + .item { + margin-bottom: 25px; + &:last-child { + margin-bottom: 0; + } + } } - } - &:extend(.abs-adjustment-incl-excl-tax all); - } - // Totals block - &-totals { - border-top: 1px solid @border-color__base; - padding-top: 10px; - tbody, - tfoot { - .mark { - border: 0; - font-weight: @font-weight__regular; - padding: 6px 0; - text-align: left; - } - .amount { - border: 0; - font-weight: @font-weight__regular; - padding: 6px 0 6px 14px; - text-align: right; + .message { + padding-left: 20px; + > *:first-child:before { + display: none; + } } + &:extend(.abs-adjustment-incl-excl-tax all); } - .table-caption { - &:extend(.abs-no-display all); - } - .grand { - th, - td { - padding: 11px 0; - } - .mark { - border-top: 1px solid @border-color__base; - .font-size(16); - padding-right: @indent__s; - strong { - display: inline-block; + + // Totals block + &-totals { + border-top: 1px solid @border-color__base; + padding-top: 10px; + tbody, + tfoot { + .mark { + border: 0; font-weight: @font-weight__regular; - padding: 3px 0 0; + padding: 6px 0; + text-align: left; + } + .amount { + border: 0; + font-weight: @font-weight__regular; + padding: 6px 0 6px 14px; + text-align: right; } } - .amount { - border-top: 1px solid @border-color__base; - .font-size(18); + .table-caption { + &:extend(.abs-no-display all); } - } - .msrp { - margin-bottom: @indent__s; - } - tbody tr:last-child td { - padding-bottom: 19px; - } - .totals-tax { - &-summary { - .mark, + .grand { + th, + td { + padding: 11px 0; + } + .mark { + border-top: 1px solid @border-color__base; + .font-size(16); + padding-right: @indent__s; + strong { + display: inline-block; + font-weight: @font-weight__regular; + padding: 3px 0 0; + } + } .amount { - border-top: @border-width__base solid @border-color__base; - border-bottom: @border-width__base solid @border-color__base; - cursor: pointer; + border-top: 1px solid @border-color__base; + .font-size(18); } - .amount .price { - position: relative; - padding-right: 20px; - .icon-font( + } + .msrp { + margin-bottom: @indent__s; + } + tbody tr:last-child td { + padding-bottom: 19px; + } + .totals-tax { + &-summary { + .mark, + .amount { + border-bottom: @border-width__base solid @border-color__base; + border-top: @border-width__base solid @border-color__base; + cursor: pointer; + } + .amount .price { + .icon-font( @icon-down, @_icon-font-size: 12px, @_icon-font-line-height: 12px, @_icon-font-text-hide: true, @_icon-font-position: after - ); - &:after { - position: absolute; - right: 3px; - top: 3px; - } - } - &.expanded { - .mark, - .amount { - border-bottom: 0; + ); + padding-right: 20px; + position: relative; + &:after { + position: absolute; + right: 3px; + top: 3px; + } } - .amount .price { - .icon-font-symbol( + &.expanded { + .mark, + .amount { + border-bottom: 0; + } + .amount .price { + .icon-font-symbol( @_icon-font-content: @icon-up, @_icon-font-position: after - ); + ); + } } } - } - &-details { - display: none; - border-bottom: @border-width__base solid @border-color__base; - &.shown { - display: table-row; + &-details { + border-bottom: @border-width__base solid @border-color__base; + display: none; + &.shown { + display: table-row; + } } } + .table-wrapper { + margin-bottom: 0; + } } - .table-wrapper { - margin-bottom: 0; - } - } - // Products table - &.table-wrapper { - .cart { - thead { - tr th.col { - border-bottom: @border-width__base solid @border-color__base; - padding-top: 24px; - padding-bottom: 15px; + // Products table + &.table-wrapper { + .cart { + thead { + tr th.col { + border-bottom: @border-width__base solid @border-color__base; + padding-bottom: 15px; + padding-top: 24px; + } } - } - tbody { - td { - border: 0; + tbody { + td { + border: 0; + } + } + > .item { + border-bottom: @border-width__base solid @border-color__base; + position: relative; } } - > .item { - border-bottom: @border-width__base solid @border-color__base; - position: relative; - } - } - .col { - padding-top: 15px; - &.price, - &.subtotal, - &.msrp { - padding: @cart-item-cell-padding-top 11px @indent__s; - text-align: center; - &:extend(.abs-incl-excl-tax all); - } - &.qty { - padding: 20px 11px @indent__s; - text-align: center; - .label { - &:extend(.abs-visually-hidden all); + .col { + padding-top: 15px; + &.price, + &.subtotal, + &.msrp { + padding: @cart-item-cell-padding-top 11px @indent__s; + text-align: center; + &:extend(.abs-incl-excl-tax all); } - .input-text { - height: 36px; - width: 45px; - margin-top: -7px; + &.qty { + padding: 20px 11px @indent__s; text-align: center; + .label { + &:extend(.abs-visually-hidden all); + } + .input-text { + height: 36px; + margin-top: -7px; + text-align: center; + width: 45px; + } + } + > .price { + .css(color, @primary__color__lighter); + .font-size(18); + font-weight: @font-weight__bold; } } - > .price { - .css(color, @primary__color__lighter); - .font-size(18); - font-weight: @font-weight__bold; - } - } - .item { - &-actions td { - padding-bottom: @indent__base; - padding-left: @mobile-cart-padding; - padding-right: @mobile-cart-padding; - white-space: normal; - .actions-toolbar { - &:extend(.abs-add-clearfix all); + .item-actions { + td { + padding-bottom: 0; + padding-left: @mobile-cart-padding; + padding-right: @mobile-cart-padding; + white-space: normal; } } - .col { - &.item { + .item { + .col.item { display: block; + min-height: 75px; padding: 15px @mobile-cart-padding @indent__s 90px; position: relative; - min-height: 75px; } } - } - .action { - margin-right: @indent__m; - &:last-child { - margin-right: 0; - } - &.help.map { - &:extend(.abs-action-button-as-link all); - font-weight: @font-weight__regular; - } - &.edit { - float: left; + + .actions-toolbar { + &:extend(.abs-add-clearfix all); + min-height: 20px; + padding-bottom: 15px; + position: relative; + > .action-edit, + > .action-delete { + position: absolute; + right: 16px; + top: 0; + .icon-font( + @icon-edit, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color + ); + } + > .action-delete { + right: 0; + .icon-font-symbol( + @_icon-font-content: @icon-trash + ); + } } - &.delete { - float: right; - &:extend(.abs-action-button-as-link all); + .action { + margin-right: @indent__m; + &:last-child { + margin-right: 0; + } + &.help.map { + &:extend(.abs-action-button-as-link all); + font-weight: @font-weight__regular; + } } - } - .product { - &-item-photo { - display: block; - max-width: 65px; - left: @mobile-cart-padding; - padding: 0; - position: absolute; - top: 15px; - width: 100%; + + .product { + &-item-photo { + display: block; + left: @mobile-cart-padding; + max-width: 65px; + padding: 0; + position: absolute; + top: 15px; + width: 100%; + } + &-item-name { + display: block; + .font-size(18); + margin: -3px 0 @indent__xs; + } } - &-item-name { - display: block; - .font-size(18); - margin: -3px 0 @indent__xs; + .gift-registry-name-label { + &:after { + content: ':'; + } } - } - .gift-registry-name-label { - &:after { - content: ":"; + + // Product options + .item-options { + margin-bottom: 0; + &:extend(.abs-product-options-list all); + &:extend(.abs-add-clearfix all); } - } - // Product options - .item-options { - margin-bottom: 0; - &:extend(.abs-product-options-list all); - &:extend(.abs-add-clearfix all); - } - .product-item-name + .item-options { - margin-top: @indent__base; - } + .product-item-name + .item-options { + margin-top: @indent__base; + } - .cart-tax-total { - &:extend(.abs-tax-total all); - &-expanded { - &:extend(.abs-tax-total-expanded all); + .cart-tax-total { + &:extend(.abs-tax-total all); + &-expanded { + &:extend(.abs-tax-total-expanded all); + } + } + .product-image-wrapper { + &:extend(.abs-reset-image-wrapper all); + } + .action.configure { + display: inline-block; + margin: @indent__s 0 0; + } + .item .message { + margin-top: @indent__base; } } - .product-image-wrapper { - &:extend(.abs-reset-image-wrapper all); - } - .action.configure { - display: inline-block; - margin: @indent__s 0 0; - } - .item .message { - margin-top: @indent__base; - } - } - // Discount - &-discount { - clear: left; - border-bottom: @border-width__base solid @border-color__base; - .block { - &:extend(.abs-cart-block all); - } - .fieldset > .field > .label { - display: none; - } - .actions-toolbar .primary { - .action { - &.primary, - &.cancel { - &:extend(.abs-revert-to-action-secondary all); - border-top-left-radius: 0; - border-bottom-left-radius: 0; + // Discount + &-discount { + border-bottom: @border-width__base solid @border-color__base; + clear: left; + .block { + &:extend(.abs-cart-block all); + > .title { + strong { + color: @color-blue1; + font-weight: @font-weight__regular; + } } } - } - .action.check { - &:extend(.abs-action-button-as-link all); - font-weight: @font-weight__regular; - } - .fieldset { - display: table; - width: 100%; - } - .field { - display: table-cell; - } - .actions-toolbar { - display: table-cell; - vertical-align: top; - width: 1%; - .action { - &.primary, - &.cancel { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - margin: 0 0 0 -1px; - white-space: nowrap; - width: auto; + .fieldset > .field > .label { + display: none; + } + .actions-toolbar .primary { + .action { + &.primary, + &.cancel { + &:extend(.abs-revert-to-action-secondary all); + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } } } - .secondary { - position: absolute; - bottom: 5px; - left: @mobile-cart-padding; + .action.check { + &:extend(.abs-action-button-as-link all); + font-weight: @font-weight__regular; + } + .fieldset { + display: table; + width: 100%; + } + .field { + display: table-cell; + } + .actions-toolbar { + display: table-cell; + vertical-align: top; + width: 1%; + .action { + &.primary, + &.cancel { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + margin: 0 0 0 -1px; + white-space: nowrap; + width: auto; + } + } + .secondary { + bottom: 5px; + left: @mobile-cart-padding; + position: absolute; + } } } - } - // Empty cart - &-empty { - padding-left: @layout__width-xs-indent; - padding-right: @layout__width-xs-indent; - } + // Empty cart + &-empty { + padding-left: @layout__width-xs-indent; + padding-right: @layout__width-xs-indent; + } - .cart-tax-info + .cart-tax-total { - display: block; + .cart-tax-info + .cart-tax-total { + display: block; + } } } -} - // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { .cart { &-totals { - .table.totals { - th { - &:extend(.abs-col-no-prefix all); - display: table-cell; - } - td { - &:extend(.abs-col-no-prefix all); - display: table-cell; - } - tbody tr:not(:last-child) td { - &:extend(.abs-no-border-bottom-top all); - } - .amount { - text-align: right; - } - } + .table.totals { + th { + &:extend(.abs-col-no-prefix all); + display: table-cell; + } + td { + &:extend(.abs-col-no-prefix all); + display: table-cell; + } + tbody tr:not(:last-child) td { + &:extend(.abs-no-border-bottom-top all); + } + .amount { + text-align: right; + } + } } .table.items { .col.item, @@ -469,7 +503,7 @@ .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { .cart { - // Cart container + // Cart container &-container { .form-cart { .actions.main { @@ -541,27 +575,24 @@ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { - -// -// Cross sell -//-------------------------------------- -.block.crosssell { - padding: 0 @mobile-cart-padding; - margin-top: 70px; - .product-item-info { - width: 200px; + // Cross sell + .block.crosssell { + margin-top: 70px; + .css(padding, 0 @mobile-cart-padding); + .product-item-info { + width: 200px; + } } } -} - // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .checkout-cart-index { .page-main { @@ -573,7 +604,7 @@ } } .cart { - // Cart container + // Cart container &-container { &:extend(.abs-add-clearfix-desktop all); .form-cart { @@ -589,9 +620,9 @@ // Summary block &-summary { + .layout-column(2, 2, @layout-column-checkout__width-left); padding: 1px @indent__base @indent__m; position: relative; - .layout-column(2, 2, @layout-column-checkout__width-left); > .title { display: block; } @@ -630,30 +661,23 @@ } .item { - .col { - &.item { - padding: @cart-item-cell-padding-top 8px 20px 0; - } - } - &-actions td { - padding: 0; - text-align: left; - .actions-toolbar { - margin-top: -40px; - padding-left: 185px; - position: relative; - } + .col.item { + padding: @cart-item-cell-padding-top 8px 20px 0; } } + .item-actions td { + padding: 0; + } + .product { &-item-photo { display: table-cell; + max-width: 100%; padding-right: 20px; + position: static; vertical-align: top; width: 1%; - position: static; - max-width: 100%; } &-item-details { padding-bottom: 35px; @@ -670,9 +694,9 @@ // Discount &-discount { border: 0; + .layout-column(2, 1, @layout-column-checkout__width-main); &:extend(.abs-add-box-sizing-desktop all); padding-right: 4%; - .layout-column(2, 1, @layout-column-checkout__width-main); .block { &:extend(.abs-blocks-2columns all); width: 48%; @@ -694,9 +718,9 @@ } .actions-toolbar { .secondary { - position: absolute; bottom: -30px; left: 0; + position: absolute; } } } diff --git a/app/design/frontend/Magento/luma/Magento_GiftMessage/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_GiftMessage/web/css/source/_module.less index 0d7da96fe37d12776dd0a9759bd975a03ec1541c..0d3b4cd47ec03767fba0a2a1291fccd7235b6d4e 100644 --- a/app/design/frontend/Magento/luma/Magento_GiftMessage/web/css/source/_module.less +++ b/app/design/frontend/Magento/luma/Magento_GiftMessage/web/css/source/_module.less @@ -4,199 +4,365 @@ // */ // -// Common -//-------------------------------------- +// Variables +// _____________________________________________ -& when (@media-common = true) { +@gift-message-field-label__color: @color-gray40; -.gift-message { - margin: 0; - .fieldset& { - > .legend { - &:extend(.abs-methods-shipping-title all); - border-bottom: 0; - padding-bottom: 0; - } - } - .product-image-wrapper { - &:extend(.abs-reset-image-wrapper all); - } - .activate.message { - border-top: @border-width__base solid @border-color__base; - border-bottom: @border-width__base solid @border-color__base; - .css(color, @primary__color); - display: block; - font-weight: @font-weight__semibold; - line-height: 36px; - margin: 0 0 @indent__s; - padding: 0 @indent__m 0 0; - position: relative; - .icon-font( - @_icon-font-content: @icon-down, - @_icon-font-size: 10px, - @_icon-font-position: after, - @_icon-font-display: block - ); - &:after { - position: absolute; - right: 12px; - top: 0; - } - &:hover { - .css(color, @filter-link-hover); +@gift-item-block__border-color: @color-gray-light5; +@gift-item-block__border-width: @border-width__base; + +@gift-item-block-title__color: @color-blue1; +@gift-item-block-title-icon__content: @icon-down; +@gift-item-block-title-icon__active__content: @icon-up; +@gift-item-block-title-icon__color: @color-gray52; +@gift-item-block-title-icon__font-size: 18px; +@gift-item-block-title-icon__line-height: 20px; +@gift-item-block-title-icon__margin: 0 0 0 @indent__s; + +// +// Common +// _____________________________________________ + +& when (@media-common = true) { + .gift-message { + .actions-toolbar { + .action-cancel { + &:extend(.abs-action-button-as-link all); + display: none; + } } - &.active { - border-bottom: 0; - .icon-font-symbol( - @_icon-font-content: @icon-up, - @_icon-font-position: after - ); + .field { + .label { + .css(color, @gift-message-field-label__color); + .css(font-weight, @font-weight__regular); + } } } - .options-items { - margin-top: @indent__xl; - .order-title { - margin: 0 0 15px; - > .field.choice { - .font-size(18); - font-weight: @font-weight__light; - border-bottom: @border-width__base solid @border-color__base; - padding-bottom: @indent__xs; + + .cart.table-wrapper { + .item-gift { + &._active { + .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); + } + .action { + margin-right: 0; } } - .order-options { + } + + .gift-options { + &:extend(.abs-add-clearfix all); + } + + .gift-options-title { + .css(font-weight, @font-weight__semibold); + margin: 0 0 @indent__base; + } + + .gift-options-content { + .fieldset { margin: 0 0 @indent__base; } - .fieldset { - .field.text { - padding-right: 0; - width: 100%; - .input-text { - height: 90px; + } + + .gift-summary { + position: relative; + .actions-toolbar { + > .secondary { + .action { + margin: 0 0 0 @indent__base; + width: auto; } } } - .field.to { - padding-right: 0; + .action-edit, + .action-delete { + &:extend(.abs-action-button-as-link all); + .icon-font( + @icon-edit, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color + ); } - .extra-options-container { - font-weight: @font-weight__regular; - .field.choice { - margin: @indent__base 0 15px; - } + .action-delete { + .icon-font-symbol( + @_icon-font-content: @icon-trash + ); } } - .options-order-container, - .options-items-container { - margin-bottom: @indent__s; + .gift-summary, + .cart.table-wrapper .gift-summary { + .actions-toolbar { + padding: 0; + position: absolute; + right: 0; + top: 0; + } } - .gift-messages-order { - margin-bottom: 25px; + + // + // In-table block + // --------------------------------------------- + + .cart.table-wrapper { + .gift-content { + display: none; + clear: left; + float: left; + margin-right: -100%; + padding: @indent__base 0; + width: 100%; + &._active { + display: block; + } + } } - .items { - .list-reset-styles(); - .item { - border-bottom: @border-width__base solid @border-color__base; - padding: 0 0 @indent__base; + + // + // Collapsible block + // --------------------------------------------- + + .gift-item-block { + .css(border-bottom, @gift-item-block__border-width solid @gift-item-block__border-color); + margin: 0; + &._active { + .title { + &:after { + .css(content, @gift-item-block-title-icon__active__content); + } + } + } + + .title { + .css(color, @gift-item-block-title__color); + cursor: pointer; + .icon-font( + @gift-item-block-title-icon__content, + @_icon-font-size: @gift-item-block-title-icon__font-size, + @_icon-font-line-height: @gift-item-block-title-icon__line-height, + @_icon-font-color: @gift-item-block-title-icon__color, + @_icon-font-color-hover: @primary__color, + @_icon-font-margin: @gift-item-block-title-icon__margin, + @_icon-font-position: after, + @_icon-font-display: block + ); + margin: 0; + padding: @indent__s @indent__xl @indent__s 15px; + position: relative; + } + + .content { &:extend(.abs-add-clearfix all); + padding: @indent__s 0 @indent__base; + position: relative; } - .product { - margin: 0 0 @indent__base; - .number { - .css(color, @primary__color__light); - span { - .css(color, @primary__color); - font-weight: @font-weight__semibold; + } + + // + // Account order gift message + // --------------------------------------------- + + .order-details-items { + .order-gift-message, + .block-order-details-gift-message { + &:extend(.abs-add-clearfix all); + dt { + &:after { + content: ''; } } - .name { - .font-size(16); - font-weight: @font-weight__regular; + .label { + &:extend(.abs-colon all); } - .photo.container { - margin: 15px 0; - img { - display: block; + .item-message { + clear: left; + } + .item-options { + dt { + .css(font-weight, @font-weight__regular); + margin: @indent__s 0; } } } } - .regular-price, - .price-including-tax, - .price-excluding-tax { - &:before { - content: attr(data-label) ": "; - } - .price { - font-weight: @font-weight__bold; + + .order-details-items { + .order-items { + .order-gift-message { + &:not(.expanded-content) { + &:extend(.abs-hidden); + } + .action.close { + &:extend(.abs-no-display all); + } + } } } - .price-including-tax { - .font-size(14); + + .options-order-container, + .options-items-container { + margin-bottom: @indent__s; + } + + .gift-messages-order { + margin-bottom: @indent__m; } } // -// Account order gift message -//-------------------------------------- -.order-details-items { - .order-gift-message, - .block-order-details-gift-message { - .item-options { - dt { - margin: @indent__s 0; - font-weight: @font-weight__regular; +// Mobile +// _____________________________________________ + +.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { + .gift-message { + .actions-toolbar { + .action-update { + .font-size(20); + padding: 15px; + width: 100%; } } - &:extend(.abs-add-clearfix all); - dt:after { - content: ""; - } - .label { - &:extend(.abs-colon all); + } + + .gift-item-block { + border-bottom: 0; + .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); + .title { + &:after { + .font-size(12); + position: absolute; + right: 20px; + top: 10px; + } } - .item-message { - clear: left; + .content { + padding-left: 1.5rem; + padding-right: 1.5rem; } } -} -.order-details-items .order-items .order-gift-message { - &:not(.expanded-content) { - &:extend(.abs-hidden); + .gift-message-summary { + padding-right: 7rem; } - .action.close { - &:extend(.abs-no-display all); - } -} + .cart.table-wrapper { + .action-gift { + .icon-font( + @icon-present, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color, + @_icon-font-position: after + ); + &._active { + border: @border-width__base solid @color-gray-light5; + border-bottom-color: @color-white; + margin: -@indent__xs 14px -1px -15px; + padding: 4px @indent__s 9px 14px; + &:after { + color: @primary__color; + } + } + } + .gift-content { + border-top: @border-width__base solid @color-gray-light5; + margin-left: -@mobile-cart-padding; + margin-right: -@mobile-cart-padding; + padding-left: @mobile-cart-padding; + padding-right: @mobile-cart-padding; + overflow: hidden; + } + } } // -// Mobile -//-------------------------------------- +// Desktop +// _____________________________________________ .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .gift-message { - .items { - .item { - margin: 0 0 @indent__base; - &:extend(.abs-add-clearfix-desktop all); - } - .product { - float: left; - margin: 0 @indent__l 0 0; - width: 145px; - .name { - .font-size(16); - font-weight: @font-weight__regular; - max-width: 145px; - text-overflow: ellipsis; - overflow: hidden; + .actions-toolbar { + padding: 0; + .secondary { + float: right; + .action { + float: right; + margin-left: @indent__base; + margin-right: 0; + } + .action-cancel { + display: block; + float: left; + margin-top: 6px; + } + } + } + .field { + &:extend(.abs-clearfix all); + .form-field-type-revert( + @_type: inline, + @_type-inline-label-align: left + ); + } + } + .gift-options-title { + .css(font-weight, @font-weight__light); + .font-size(18); + } + + .gift-item-block { + .title { + padding: @indent__base 0; + } + } + + .item-gift { + td { + padding-left: 0; + padding-right: 0; + } + } + + // + // In-table block + // --------------------------------------------- + + .cart.table-wrapper { + .action-gift { + float: left; + .icon-font( + @icon-down, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color, + @_icon-font-margin: 0 0 0 @indent__s, + @_icon-font-position: after + ); + &._active { + &:after { + content: @icon-up; } } - .options { - overflow: hidden; + } + } + + .cart-container { + .cart-gift-item { + &:extend(.abs-shopping-cart-items-desktop all); + margin-bottom: @indent__base; + .gift-options, + .gift-summary { + padding-bottom: @indent__base; } } } diff --git a/app/design/frontend/Magento/luma/Magento_LayeredNavigation/templates/layer/state.phtml b/app/design/frontend/Magento/luma/Magento_LayeredNavigation/templates/layer/state.phtml index fc254e6017a59be547ac0df098208ac956730af0..f06820d83708cfea27622b38eb207a0e3156f991 100644 --- a/app/design/frontend/Magento/luma/Magento_LayeredNavigation/templates/layer/state.phtml +++ b/app/design/frontend/Magento/luma/Magento_LayeredNavigation/templates/layer/state.phtml @@ -18,7 +18,7 @@ role="heading" aria-level="2" data-role="title" - data-count="<?php echo count($_filters); ?>"><?php echo __('Currently Shopping by') ?></strong> + data-count="<?php echo count($_filters); ?>"><?php echo __('Now Shopping by') ?></strong> <ol class="items"> <?php foreach ($_filters as $_filter): ?> <li class="item"> diff --git a/app/design/frontend/Magento/luma/Magento_Wishlist/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Wishlist/web/css/source/_module.less index 8b5f2b983d6659f75888cf8de06183ec9f1d34f3..c1388fd10a0f9dfd7f06f7c17c96d0b87ba272c7 100644 --- a/app/design/frontend/Magento/luma/Magento_Wishlist/web/css/source/_module.less +++ b/app/design/frontend/Magento/luma/Magento_Wishlist/web/css/source/_module.less @@ -4,149 +4,148 @@ // */ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { - -.form.wishlist.items { - .actions-toolbar { - &:extend(.abs-reset-left-margin all); + .form.wishlist.items { + .actions-toolbar { + &:extend(.abs-reset-left-margin all); + } } -} -.product-social-links, -.block-bundle-summary, -.product-item, -.table-comparison { - .action.towishlist { - &:extend(.abs-actions-addto all); - .icon-font-symbol( + .product-social-links, + .block-bundle-summary, + .product-item, + .table-comparison { + .action.towishlist { + &:extend(.abs-actions-addto all); + .icon-font-symbol( @_icon-font-content: @icon-wishlist-full, @_icon-font-position: before - ); + ); + } } -} -.account .table-wrapper .data.table.wishlist { - .table-bordered( + .account .table-wrapper .data.table.wishlist { + .table-bordered( @_table_type: horizontal - ); - thead > tr > th { - border-bottom: 0; - } - tbody > tr:last-child > td { - border-bottom: 1px solid @table__border-color; - } - .product.name { - display: inline-block; - margin-bottom: @indent__s; - } - .box-tocart { - margin: @indent__s 0; - .qty { - vertical-align: middle; - &:extend(.abs-input-qty all); + ); + thead > tr > th { + border-bottom: 0; } - } - .col { - &.item { - width: 50%; + tbody > tr:last-child > td { + border-bottom: 1px solid @table__border-color; } - &.photo { - max-width: 150px; + .product.name { + display: inline-block; + margin-bottom: @indent__s; } - &.selector { - max-width: 15px; + .box-tocart { + margin: @indent__s 0; + .qty { + vertical-align: middle; + &:extend(.abs-input-qty all); + } } - } - textarea { - margin: @indent__s 0; - } - .input-text.qty { - margin-bottom: @indent__s; - } - .action.primary { - vertical-align: top; - } - .price { - font-weight: @font-weight__bold; - } -} - -.link.wishlist { - .counter { - .css(color, @text__color__muted); - white-space: nowrap; - &:before { - content: "("; + .col { + &.item { + width: 50%; + } + &.photo { + max-width: 150px; + } + &.selector { + max-width: 15px; + } + } + textarea { + margin: @indent__s 0; + } + .input-text.qty { + margin-bottom: @indent__s; } - &:after { - content: ")"; + .action.primary { + vertical-align: top; + } + .price { + font-weight: @font-weight__bold; } } -} -.block-wishlist { - .block-title { - &:extend(.abs-block-widget-title all); - } - .counter { - &:extend(.abs-block-items-counter all); + .link.wishlist { + .counter { + .css(color, @text__color__muted); + white-space: nowrap; + &:before { + content: '('; + } + &:after { + content: ')'; + } + } } - .product-item-name { - margin-right: @indent__m; + + .block-wishlist { + .block-title { + &:extend(.abs-block-widget-title all); + } + .counter { + &:extend(.abs-block-items-counter all); + } + .product-item-name { + margin-right: @indent__m; + } } -} -.products-grid.wishlist { - .product { - &-item { - &-photo { - margin-bottom: @indent__s; - display: block; - } - &-name { - margin-top: 0; - } - .price-box { - margin: 0; - } - .comment-box { - .label { - &:extend(.abs-visually-hidden all); + .products-grid.wishlist { + .product { + &-item { + &-photo { + display: block; + margin-bottom: @indent__s; } - } - &-comment { - display: block; - margin: @indent__s 0; - height: 42px; - } - &-actions { - > * { - margin-right: 15px; - &:last-child { - margin-right: 0; + &-name { + margin-top: 0; + } + .price-box { + margin: 0; + } + .comment-box { + .label { + &:extend(.abs-visually-hidden all); } } - } - .box-tocart { - input.qty { - &:extend(.abs-input-qty all); + &-comment { + display: block; + height: 42px; + margin: @indent__s 0; } - .tocart { - &:extend(.abs-revert-secondary-size all); + &-actions { + > * { + margin-right: 15px; + &:last-child { + margin-right: 0; + } + } + } + .box-tocart { + input.qty { + &:extend(.abs-input-qty all); + } + .tocart { + &:extend(.abs-revert-secondary-size all); + } } } } } } -} - // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { .products-grid.wishlist { .product-item { @@ -160,15 +159,15 @@ .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { .products-grid.wishlist { - margin-right: -@indent__s; margin-bottom: @indent__l; + margin-right: -@indent__s; .product { &-item { padding: @indent__base @indent__s @indent__base @indent__base; position: relative; &-photo { - margin-right: @indent__base; float: left; + margin-right: @indent__base; } &-name { .font-size(16); @@ -226,6 +225,20 @@ } } } + + .cart.table-wrapper { + .action-towishlist { + .icon-font( + @icon-wishlist-full, + @_icon-font-size: 18px, + @_icon-font-line-height: 20px, + @_icon-font-text-hide: true, + @_icon-font-color: @minicart-icons-color, + @_icon-font-color-hover: @primary__color, + @_icon-font-color-active: @minicart-icons-color + ); + } + } } .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__s) { @@ -243,8 +256,9 @@ } // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .products-grid.wishlist { .product { @@ -263,8 +277,8 @@ margin: @indent__s 0 0; > * { display: inline-block; - margin-top: 7px; margin-bottom: 7px; + margin-top: 7px; } } .fieldset { @@ -292,7 +306,7 @@ } } } - .wishlist-index-index { + .wishlist-index-index { .product-item-info { width: auto; } @@ -302,18 +316,19 @@ .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .wishlist-index-index { .product-item-inner { + @_shadow: 3px 4px 4px 0 rgba(0, 0, 0, .3); + + .css(background, @color-white); + .css(border, @border-width__base solid @color-gray-light2); + border-top: none; + .css(box-shadow, @_shadow); display: none; - position: absolute; left: 0; + margin: 9px 0 0 -1px; + padding: 0 9px 9px; + position: absolute; right: -1px; z-index: 2; - .css(background, @color-white); - padding: 0 9px 9px; - margin: 9px 0 0 -1px; - border: 1px solid @color-gray-light2; - border-top: none; - @_shadow: 3px 4px 4px 0 rgba(0, 0, 0, .3); - .css(box-shadow, @_shadow); .comment-box { margin-top: -18px; } @@ -328,10 +343,10 @@ margin: 0; } .product-item { - width: 24.439%; - margin-left: calc(~"(100% - 4 * 24%) / 3"); margin-bottom: @indent__base; + margin-left: calc(~"(100% - 4 * 24%) / 3"); padding: 0; + width: 24.439%; &:nth-child(4n+1) { margin-left: 0; } diff --git a/app/design/frontend/Magento/luma/web/css/source/_extends.less b/app/design/frontend/Magento/luma/web/css/source/_extends.less index 00d74dcf5d0740f048ab7cd0ce0a9f2eb1b8b8b7..cc4ab06b849cb5eec4233e701e915deedb4285ed 100644 --- a/app/design/frontend/Magento/luma/web/css/source/_extends.less +++ b/app/design/frontend/Magento/luma/web/css/source/_extends.less @@ -753,11 +753,8 @@ margin: 0; > .title { &:extend(.abs-toggling-title all); - .column.main & { - strong { - .font-size(14); - font-weight: @font-weight__semibold; - } + &:after { + color: @color-gray52; } } .content { diff --git a/app/design/frontend/Magento/luma/web/css/source/_variables.less b/app/design/frontend/Magento/luma/web/css/source/_variables.less index a6ad436b94df7ea39e07279d315ea795ea8986ce..dbdbeb65ad660dccec8e724925392cf18b254c96 100644 --- a/app/design/frontend/Magento/luma/web/css/source/_variables.less +++ b/app/design/frontend/Magento/luma/web/css/source/_variables.less @@ -31,6 +31,8 @@ @icon-star-empty: '\e625'; @icon-download: '\e626'; @icon-private: '\e629'; +@icon-present: '\e62a'; +@icon-gift-registry: '\e62b'; @icon-calendar__font-size: 23px; diff --git a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.eot b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.eot index 9c574aed777d1435ebaecb4511cbbd877aa3e229..4a12dddaf3e4556c2fa7abda0181abd7950043e0 100644 Binary files a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.eot and b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.eot differ diff --git a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.svg b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.svg index 171e99f64616714b0c97a1155fc6498b90d4a147..5e68e79f8e3e44488f98f45b6a4d1408f485d2ec 100644 --- a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.svg +++ b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg"><defs><font horiz-adv-x="512"><font-face units-per-em="512" ascent="480" descent="-32"/><glyph horiz-adv-x="256"/><glyph unicode="" d="M436.608 435.568c-65.68 31.424-144.064 2.832-174.976-63.84-2.16-4.64-4.016-10.448-5.664-17.2-1.648 6.752-3.504 12.56-5.632 17.2-30.944 66.672-109.248 95.264-174.944 63.84-65.6-31.424-93.744-110.96-62.832-177.648C43.488 191.248 255.904.08 255.904.08s.016.224.048.576c.048-.352.064-.576.064-.576s212.512 191.168 243.44 257.84c30.896 66.688 2.832 146.224-62.848 177.648z"/><glyph unicode="î˜" d="M362.533 425.05c-49.81-49.79-20.81-20.77-20.81-20.77l96.403-96.385s-31.067-31.05 20.772 20.773-46.61 146.194-96.365 96.384zm-42.386-41.38L92.16 155.686l.33-.293L38.417 8.868 188.25 59.556l.312-.31.786.804v.02l227.2 227.2-96.403 96.402zm-141.11-279.295l-78.812-33.28 37.047 75.044 38.345 38.36 41.764-41.786-38.34-38.346z"/><glyph unicode="" d="M255.952 480L0 32h512L255.952 480zm31.168-126.192v-65.36l-16.688-128.544h-27.088l-18.032 128.544-.992 65.36h62.8zM224.096 64.112v64.112h64.24V64.112h-64.24z"/><glyph unicode="" d="M363.923 112.02C334.118 83.254 295.26 68.516 255.91 68.48c-35.145.037-70.2 11.758-99.347 35.933-37.03 30.83-56.046 74.97-56.1 119.66 0 7.443.55 14.83 1.59 22.18l-60.67-11.373c-.165-3.602-.293-7.186-.293-10.807-.036-61.495 26.46-122.9 77.55-165.285 40.008-33.335 88.886-49.683 137.25-49.683h.13c56.21 0 112.163 22.217 153.745 64.914L449.61 34.24l.31 124.745-131.808.35 45.805-47.326zm29.42 277.21c-40.045 33.335-88.922 49.664-137.27 49.664-55.808 0-111.397-21.833-152.923-63.945L65.463 409.74l-.677-120.722 130.487-.75-46.336 48.494c29.64 28.252 68.188 42.697 107.154 42.733 35.11-.036 70.22-11.72 99.33-35.93 37.03-30.83 56.05-74.937 56.14-119.7 0-6.437-.456-12.89-1.224-19.365l60.436 11.593c.036 2.613.164 5.21.164 7.77-.036 61.55-26.514 122.9-77.587 165.357z"/><glyph unicode="" d="M95.792-32h320.4v320.08h-320.4V-32zm222.544 260.512c0 9.904 8.032 17.904 17.952 17.904 9.904 0 17.936-8 17.936-17.904V39.776c0-9.888-8.032-17.92-17.936-17.92-9.92 0-17.952 8.032-17.952 17.92v188.736zm-80.288 0c0 9.904 8.032 17.904 17.92 17.904s17.92-8 17.92-17.904V39.776c0-9.888-8.032-17.92-17.92-17.92s-17.92 8.032-17.92 17.92v188.736zm-80.448 0c0 9.904 8 17.904 17.92 17.904 9.888 0 17.92-8 17.92-17.904V39.776c0-9.888-8.032-17.92-17.92-17.92-9.92 0-17.92 8.032-17.92 17.92v188.736zm265.616 188.016h-71.232v10.896c0 29.04-19.76 52.576-48.8 52.576h-94.72c-29.008 0-48.48-23.536-48.48-52.576v-10.896H88.752c-13.696 0-24.768-11.088-24.768-24.752v-71.984h384v71.984c0 13.664-11.04 24.752-24.768 24.752zm-103.28 0H191.744v14.704c.032 9.248 7.488 16.736 16.72 16.768h94.72c9.216-.032 16.704-7.52 16.752-16.768v-14.704z"/><glyph unicode="" d="M511.52 278.496c-1.312 4.096-5.152 6.88-9.44 6.88H321.376L265.424 457.12c-1.344 4.096-5.136 6.88-9.44 6.88-4.272 0-8.096-2.784-9.44-6.88l-56.24-171.744H9.92c-4.256 0-8.096-2.784-9.44-6.88-1.312-4.064.128-8.592 3.584-11.088l145.984-106.32-56.256-172.72c-1.328-4.096.128-8.592 3.616-11.12 3.456-2.496 8.208-2.496 11.664 0L255.968 83.872l146.64-106.624c1.792-1.28 3.76-1.936 5.808-1.936 2.096 0 4.144.656 5.856 1.936 3.568 2.528 4.96 7.008 3.6 11.12l-56.24 172.72 146.288 106.32c3.488 2.496 4.928 6.992 3.6 11.088z"/><glyph unicode="" d="M473.015 200.375v49.37l-7.003 2.27-52.882 17.243-14.116 34.103 27.154 57.387-34.908 34.907-6.583-3.31-49.555-25.197-34.103 14.117-21.4 59.755h-49.37l-2.287-6.986-17.262-52.88-34.047-14.1-57.4 27.136-34.924-34.927 3.31-6.564 25.18-49.59-14.08-34.03-59.76-21.414v-49.39l6.95-2.25 52.9-17.28 14.1-34.066L85.813 87.3l34.925-34.925 6.53 3.328 49.59 25.2 34.063-14.115 21.394-59.76h49.37l2.286 6.986 17.28 52.883 34.03 14.116 57.398-27.137 34.95 34.904-3.346 6.546-25.197 49.572 14.116 34.067 59.813 21.413zM256 154.86c-38.2 0-69.156 30.958-69.156 69.14 0 38.217 30.958 69.156 69.156 69.156 38.163 0 69.156-30.94 69.156-69.156 0-38.18-31.012-69.14-69.156-69.14z"/><glyph unicode="" d="M31.008 351.36L256 111.376 481.04 351.36z"/><glyph unicode="" d="M383.415 226.596l-212.57 218.587-37.286-34.98 178.28-183.278L128.566 38.473l36.48-35.657 205.66 211.456-.202.2z"/><glyph unicode="" d="M52.928 345.2h406.144c11.056 0 20 8.976 20 20.016 0 11.072-8.944 20.032-20 20.032H52.928c-11.056 0-20.016-8.96-20.016-20.032 0-11.04 8.96-20.016 20.016-20.016zm406.144-101.184H52.928c-11.056 0-20.016-8.944-20.016-20.016s8.96-20.016 20.016-20.016h406.144c11.056 0 20 8.944 20 20.016s-8.928 20.016-20 20.016zm0-141.216H52.928c-11.056 0-20.016-8.96-20.016-20.032s8.96-20.016 20.016-20.016h406.144c11.056 0 20 8.944 20 20.016s-8.928 20.032-20 20.032z"/><glyph unicode="" d="M256.144 480C167.024 480 94.8 407.76 94.8 318.624 94.8 229.52 256.144-32 256.144-32S417.52 229.52 417.52 318.624C417.52 407.76 345.328 480 256.144 480zm0-210.384c-27.056 0-49.024 21.952-49.024 49.008 0 27.072 21.984 49.024 49.024 49.024 27.104 0 49.088-21.952 49.088-49.024 0-27.056-21.984-49.008-49.088-49.008z"/><glyph unicode="" d="M0 256.144h224.032v223.808H0V256.144zm288.128 223.808v-95.728h224.176v95.728H288.128zM0-32h224.032v223.808H0V-32zm288.128 288.144h224.176v95.728H288.128v-95.728zm0-160.064h224.176v95.728H288.128V96.08zm0-128.08h224.176v95.712H288.128V-32z"/><glyph unicode="" d="M332.764 119.003c-9.216 0-45.495-56.027-65.243-56.027-5.28 0-7.86 4.644-7.86 9.216 0 10.57 7.24 27.044 11.157 36.937l47.396 128.38c23.77 63.89-6.546 81.02-34.87 81.02-38.218 0-72.45-19.09-98.78-44.123-8.576-8.577-37.523-36.207-37.523-48.09 0-3.934 3.93-8.578 8.575-8.578 11.813 0 43.447 57.307 67.803 57.307 5.285 0 11.19-5.923 6.583-17.754l-46.08-115.97c-4.643-11.153-27.043-65.17-27.043-96.785 0-25.014 16.476-36.187 40.192-36.187 66.52.003 143.54 81.65 143.54 100.76-.02 5.925-4.59 9.892-7.846 9.892zm-13.22 320.658c-28.948 0-54.017-23.68-54.017-52.66 0-27.01 17.792-44.8 44.837-44.8 29.55 0 54.62 22.4 54.62 52.7 0 27.01-19.072 44.767-45.44 44.767z"/><glyph unicode="î˜" d="M0 351.552h128.464V480H0V351.552zm191.76 0h128.528V480H191.76V351.552zM383.568 480V351.552h128.496V480H383.568zM0 159.744h128.464v128.464H0V159.744zm191.76 0h128.528v128.464H191.76V159.744zm191.808 0h128.496v128.464H383.568V159.744zM0-32h128.464V96H0V-32zm191.76 0h128.528V96H191.76V-32zm191.808 0h128.496V96H383.568V-32z"/><glyph unicode="" d="M255.296 450.464c-124.688 0-225.76-101.072-225.76-225.76 0-124.672 101.072-225.76 225.76-225.76 124.672 0 225.76 101.088 225.76 225.76 0 124.688-101.072 225.76-225.76 225.76zm-23.36-355.888L106 222.608l32.208 25.936 72.864-57.088c29.76 35.424 96 106.032 187.312 161.984l7.696-17.792c-83.808-77.088-152.48-185.6-174.144-241.072z"/><glyph unicode="î˜" d="M0 241.12h512v-34.064H0v34.064z"/><glyph unicode="î˜" d="M478.263 426.15c-142.555-87.39-245.98-197.633-292.48-252.948L71.99 262.362l-50.266-40.538L218.387 21.85c33.847 86.675 141.056 256.11 271.872 376.486l-12 27.814z"/><glyph unicode="" d="M220.576 83.248c-26.352 0-47.696-21.376-47.696-47.712s21.344-47.664 47.696-47.664c26.336 0 47.696 21.328 47.696 47.664s-21.36 47.712-47.696 47.712zm164.768 0c-26.4 0-47.76-21.376-47.76-47.712s21.344-47.664 47.76-47.664c26.288 0 47.632 21.328 47.632 47.664s-21.344 47.712-47.632 47.712zm74.512 267.072H140s-19.152 52.608-37.392 84.864c-14.128 24.976-43.344 23.968-43.344 23.968-20.096 0-33.024-12.288-33.024-32.4 0-20.096 15.92-36.16 36.032-36.16l8.496-.08 95.2-262.192 266.832-.208S481.584 327.744 479.072 320c8.944 27.68-2.448 30.32-19.216 30.32zm-293.328-92.976c-14 0-25.36 11.36-25.36 25.376s11.36 25.392 25.36 25.392c14.016 0 25.36-11.376 25.36-25.392s-11.344-25.376-25.36-25.376zm54.24-84.704c-14.016 0-25.376 11.376-25.376 25.392 0 13.984 11.36 25.36 25.376 25.36 14 0 25.36-11.376 25.36-25.36.016-14.016-11.36-25.392-25.36-25.392zm27.888 84.704c-14 0-25.376 11.36-25.376 25.376s11.36 25.392 25.376 25.392c14 0 25.36-11.376 25.36-25.392s-11.36-25.376-25.36-25.376zm54.24-84.704c-14 0-25.36 11.376-25.36 25.392 0 13.984 11.36 25.36 25.36 25.36 14.048 0 25.44-11.376 25.44-25.36 0-14.016-11.392-25.392-25.44-25.392zm27.952 84.704c-14 0-25.408 11.36-25.408 25.376s11.408 25.392 25.408 25.392c14 0 25.328-11.376 25.328-25.392s-11.328-25.376-25.328-25.376zm54.192-84.704c-13.984 0-25.328 11.376-25.328 25.392 0 13.984 11.36 25.36 25.328 25.36 14 0 25.408-11.376 25.408-25.36 0-14.016-11.408-25.392-25.408-25.392zm27.92 84.704c-14.016 0-25.36 11.36-25.36 25.376s11.344 25.392 25.36 25.392c14.048 0 25.376-11.376 25.376-25.392s-11.328-25.376-25.376-25.376z"/><glyph unicode="" d="M142.992 332.768c10.352 0 18.8 8.4 18.8 18.8v67.68c0 10.368-8.432 18.784-18.8 18.784-10.384 0-18.8-8.4-18.8-18.784v-67.68c0-10.4 8.416-18.8 18.8-18.8zm251.392 50.576v-.32c7.776-6.944 12.72-17.008 12.72-28.288 0-20.816-16.88-37.712-37.744-37.712s-37.76 16.912-37.76 37.712c0 11.264 4.976 21.344 12.784 28.288v.32H167.968v-.32c7.824-6.944 12.768-17.008 12.768-28.288 0-20.816-16.896-37.712-37.728-37.712-20.864 0-37.744 16.912-37.744 37.712 0 11.264 4.928 21.344 12.752 28.288v.32H32.48V-.256h447.248v383.6h-85.344zM448.72 32.832H65.568v254.72H448.72V32.832zm-79.36 299.936c10.384 0 18.784 8.4 18.784 18.8v67.68c0 10.368-8.4 18.784-18.784 18.784-10.352 0-18.816-8.4-18.816-18.784v-67.68c0-10.4 8.464-18.8 18.816-18.8zm-20.144-148.64H301.28v-47.872h47.952v47.872zm0 71.984H301.28v-47.824h47.952v47.824zm0-142H301.28V66.24h47.952v47.872zm67.44 142h-47.92v-47.824h47.92v47.824zm0-71.984h-47.92v-47.872h47.92v47.872zm-134.96 71.984h-47.872v-47.824h47.872v47.824zM146.8 184.128H98.944v-47.872H146.8v47.872zm67.488-70.016H166.4V66.24h47.872v47.872zm-67.488 0H98.944V66.24H146.8v47.872zm134.896 70.016h-47.872v-47.872h47.872v47.872zm0-70.016h-47.872V66.24h47.872v47.872zm-67.408 70.016H166.4v-47.872h47.872v47.872zm0 71.984H166.4v-47.824h47.872v47.824z"/><glyph unicode="" d="M256 444.727L55.186 201.437H186.24V3.29h139.575v198.144h131.017z"/><glyph unicode="" d="M325.78 246.583v198.144H186.185V246.583h-131L256.02 3.29l200.81 243.294z"/><glyph unicode="" d="M487.232 35.872s-78.176 80.288-109.328 111.312c-13.552 13.552-22.832 22.752-22.832 22.752 10.56 15.088 18.816 31.616 24.704 49.392 5.84 17.76 8.752 36.496 8.752 56.192 0 25.36-4.816 49.2-14.448 71.552-9.664 22.32-22.784 41.824-39.456 58.432-16.64 16.688-36.144 29.824-58.496 39.472-22.336 9.664-46.176 14.496-71.536 14.496-25.344 0-49.184-4.848-71.552-14.496-22.336-9.648-41.712-22.784-58.192-39.472-16.416-16.608-29.52-36.128-39.152-58.448C26.032 324.72 21.2 300.864 21.2 275.504c0-25.376 4.848-49.216 14.496-71.552 9.632-22.304 22.72-41.792 39.152-58.464 16.464-16.608 35.856-29.776 58.176-39.456 22.368-9.664 46.208-14.448 71.552-14.448 19.68 0 38.416 2.88 56.208 8.768 17.776 5.856 34.288 14.144 49.36 24.72 0 0 8.576-8.512 21.2-21.216C365.856 69.216 441.76-9.536 441.76-9.536c11.456-4.992 29.712.336 38.848 8.064 9.04 7.776 14.096 23.984 6.624 37.344zM327.792 223.28c-7.008-16.192-16.576-30.336-28.624-42.336-12.096-12.048-26.192-21.616-42.336-28.608-16.128-7.024-33.392-10.528-51.68-10.528-18.704 0-36.096 3.504-52.256 10.528-16.16 7.008-30.288 16.56-42.336 28.608-12.048 12.016-21.616 26.16-28.608 42.336-7.008 16.112-10.512 33.568-10.512 52.24 0 18.272 3.504 35.632 10.512 51.984 6.992 16.336 16.56 30.56 28.608 42.592 12.048 12.096 26.176 21.664 42.336 28.608 16.16 7.056 33.552 10.512 52.256 10.512 18.288 0 35.552-3.456 51.68-10.512 16.144-6.96 30.24-16.512 42.336-28.608 12.032-12.032 21.616-26.256 28.624-42.592 7.008-16.352 10.48-33.712 10.48-51.984.016-18.672-3.456-36.128-10.48-52.24z"/><glyph unicode="" d="M483.255 415.177l-36.023 35.968-191.25-191.268-191.25 191.268-35.986-35.968 191.268-191.27L28.89 32.767l35.97-35.93L256 187.94 447.12-3.164l35.932 35.932L291.95 223.89z"/><glyph unicode="" d="M200.21 226.89l178.213 183.314-37.248 34.98-212.608-218.587 218.46-223.78 36.388 35.657z"/><glyph unicode="" d="M256 335.168L31.008 95.184H481.04z"/><glyph unicode="" d="M96.624 451.12V-3.12L409.552 224z"/><glyph unicode="" d="M102.992 224L415.904-3.12v454.24z"/><glyph unicode="" d="M0 .464h63.984V480H0V.464zM512.08 480H96.256V192.112H512.08L373.872 334.144 512.08 480z"/><glyph unicode="" d="M512 241.12H273.488V480h-34.016V241.12H0v-34.064h239.472V-32h34.016v239.056H512z"/><glyph unicode="î˜" d="M255.968 228.064l221.488 155.84c-2.656.528-5.344.848-8.128.848H42.672c-2.8 0-5.504-.32-8.144-.848l221.44-155.84zm.96-59.568l-.96 1.408-.944-1.408L.464 347.632c-.176-1.6-.464-3.2-.464-4.816V75.104C0 51.2 19.104 31.792 42.672 31.792h426.656c23.6 0 42.688 19.408 42.688 43.312v267.712c0 1.632-.288 3.216-.496 4.816L256.928 168.496z"/><glyph unicode="" d="M127.584 31.776v127.632H0V31.776h127.584zM319.248 416.24H192.32V31.792h126.928V416.24zm192.336-128.768H384.208V31.792h127.376v255.68z"/><glyph unicode="" d="M255.296 450.464c-124.688 0-225.76-101.072-225.76-225.76 0-124.672 101.072-225.76 225.76-225.76 124.672 0 225.76 101.088 225.76 225.76 0 124.688-101.072 225.76-225.76 225.76zM372.16 144.832l-37.104-37.104-79.088 79.056-79.056-79.04-37.12 37.136 79.024 79.024-79.136 79.12 37.136 37.136 79.12-79.136 79.184 79.184 37.152-37.152-79.2-79.168 79.088-79.056z"/><glyph unicode="î˜ " d="M262.748 418.688c-113.664 2.25-207.214-67.803-208.97-156.435-.584-30.83 9.985-59.813 28.8-84.644l-4.918 4.95c32.384-41.62-31.104-153.31-31.104-153.31l142.28 70.35c22.51-7.094 44.16-11.922 69.725-12.45 113.67-2.232 205.117 78.354 206.85 167.003 1.76 88.63-88.96 162.304-202.66 164.535z"/><glyph unicode="" d="M259.163 285.422L461 89.198l38.546 41.07-240.713 234.02L12.47 123.814l39.26-40.1z"/><glyph unicode="" d="M252.82 162.58L51 358.802l-38.53-41.07 240.68-234.02 246.4 240.476-39.332 40.1z"/><glyph unicode="" d="M256-33.248c-141.408 0-256 114.624-256 256s114.592 256 256 256c141.376 0 256-114.624 256-256s-114.608-256-256-256zm0 481.008c-124.048 0-225.008-100.96-225.008-225.008S131.952-2.272 256-2.272s224.992 100.96 224.992 225.008S380.064 447.76 256 447.76zm64.24-228.608l-15.6-12.128c-8.496-6.624-14.128-14.32-16.912-23.152-1.776-5.6-3.008-12.256-3.168-24h-59.712c.88 24.848 3.504 39.968 7.328 49.472 3.808 9.472 13.632 20.368 29.44 32.72l16.032 12.528c5.28 4 9.536 8.32 12.752 13.024 5.872 8.064 8.784 16.976 8.784 26.656 0 11.152-3.248 21.312-9.776 30.496-6.496 9.184-18.4 13.808-35.712 13.808-17.008 0-29.056-5.68-36.16-17.008s-10.592-21.664-10.592-33.84h-63.68c1.744 41.872 16.32 70.16 43.776 87.632 17.344 11.152 38.656 16.752 63.904 16.752 33.216 0 60.784-7.936 82.752-23.808 21.968-15.84 34.8-48.432 34.8-79.6 0-19.088-6.624-26.096-16.144-39.184-5.584-7.92-16.272-18.048-32.112-30.368zM287.728 64h-63.504v63.68h63.504V64z"/><glyph unicode="" d="M416.656 128v135.696H95.984V128H0v199.344c0 13.76 11.168 24.912 24.944 24.912h462.144c13.744 0 24.912-11.152 24.912-24.912V128h-95.344zm47.648 196.624c-11.024 0-19.92-8.928-19.92-19.936s8.896-19.952 19.92-19.952c10.992 0 19.968 8.96 19.968 19.952 0 11.008-8.992 19.936-19.968 19.936zM127.728 480h256v-96.192h-256V480zm33.248-448.336h191.232V224h31.824V-.08H128.048V224h32.912V31.664z"/><glyph unicode="" d="M502.08 285.376H321.376L265.424 457.12c-1.344 4.096-5.136 6.88-9.44 6.88-4.272 0-8.096-2.784-9.44-6.88l-56.24-171.744H9.92c-4.256 0-8.096-2.784-9.44-6.88-1.312-4.064.128-8.592 3.584-11.088l145.984-106.32-56.256-172.72c-1.328-4.096.128-8.592 3.616-11.12 3.456-2.496 8.208-2.496 11.664 0L255.968 83.872l146.64-106.624c1.792-1.28 3.76-1.936 5.808-1.936 2.096 0 4.144.656 5.856 1.936 3.568 2.528 4.96 7.008 3.6 11.12l-56.24 172.72 146.288 106.32c3.488 2.496 4.928 7.008 3.6 11.088-1.312 4.096-5.168 6.88-9.44 6.88zm-168.656-115.12l48.208-148.064L256 113.552l-125.968-91.44 48.256 148.128L53.12 261.376h154.576l48.256 147.376 48.016-147.376H458.8l-125.376-91.12z"/><glyph unicode="" d="M319.376 223.824v127.76H192.624v-127.76H102.88L256.048 35.216l153.088 188.608zM256.016 480c-141.392 0-256-114.608-256-255.984C.016 82.624 114.624-32 256.016-32c141.376 0 256 114.624 256 256.016 0 141.376-114.624 255.984-256 255.984zm0-480c-123.52 0-224 100.496-224 224.016 0 123.504 100.48 223.984 224 223.984s224-100.48 224-223.984c0-123.52-100.48-224.016-224-224.016z"/><glyph unicode="" d="M255.982 440.594c-119.607 0-216.576-96.97-216.576-216.594S136.376 7.405 255.982 7.405c119.625 0 216.595 96.97 216.595 216.595s-96.95 216.595-216.595 216.595zm0-20.68c108.05 0 195.913-87.882 195.913-195.914 0-45.184-15.507-86.71-41.325-119.9-3.108 1.135-6.217 2.196-9.197 3.457-19.748 8.265-41.71 17.957-61.42 26.094l-16.897 4.61c-6.692 4.59-13.33 19.99-16.914 27.67-3.548.51-7.15 1.005-10.752 1.48.53 11.87 7.88 12.545 10.752 21.54 2.54 7.955.293 18.34 4.28 25.73 2.778 5.12 9.124 5.12 12.232 9.544 2.853 3.95 4.772 10.918 5.668 15.8 1.61 8.905 3.017 21.12-1.207 29.988-2.432 5.066-3.968 5.578-4.644 11.74-.82 7.516 2.218 31.89 2.347 37.175.293 13.68-.055 14.794-3.346 28.124 0 0-4.005 12.087-10.295 15.726l-12.58 2.158-7.77 7.186c-31.306 19.272-64.878 5.76-82.835-1.5-25.91-8.43-42.297-33.79-30.87-87.955 1.96-9.29-5.063-13.42-4.606-18.468 1.042-11.045 1.207-37.614 11.648-44.124.97-.603 8.376-2.47 8.34-1.938 1.006-10.752 2.048-21.522 3.054-32.238 2.616-7.15 8.87-7.954 10.68-18.048l-7.99-1.92c-3.603-7.68-10.186-23.08-16.897-27.668-5.65-1.517-11.284-3.053-16.917-4.59-19.73-8.118-41.654-17.828-61.42-26.093-1.08-.44-2.214-.79-3.29-1.21C74.953 139.154 60.09 179.822 60.09 224c0 108.032 87.88 195.913 195.895 195.913z"/><glyph unicode="" d="M94.8 322.592L1.376 401.056.88 79.088l316.688 56.336-89.216 74.96C410.464 377.904 456.256 202.256 474.624 5.6 540.56 579.664 244.784 450.928 94.8 322.592z"/><glyph unicode="" d="M428.432 224h-20.08v96.176c0 43.36-16.448 83.104-43.632 112.144-27.056 29.056-65.632 47.712-108.16 47.68-42.544.032-81.12-18.624-108.192-47.68-27.184-29.04-43.632-68.784-43.648-112.144V224H83.904c-10.816 0-19.584-8.752-19.584-19.584v-216.8C64.32-23.232 73.088-32 83.904-32h344.528c10.8 0 19.584 8.768 19.584 19.632v216.8c0 10.816-8.784 19.568-19.584 19.568zm-251.616 96.176c0 25.024 9.472 47.168 24.192 62.928 14.848 15.728 34.144 24.784 55.552 24.816 21.376-.032 40.688-9.072 55.536-24.816 14.704-15.744 24.176-37.888 24.176-62.928V224h-159.44v96.176z"/></font></defs></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg"><defs><font id="Luma-Icons" horiz-adv-x="512"><font-face units-per-em="512" ascent="480" descent="-32"/><missing-glyph horiz-adv-x="512"/><glyph unicode=" " d="" horiz-adv-x="256"/><glyph unicode="" d="M436.608 435.568c-65.68 31.424-144.064 2.832-174.976-63.84-2.16-4.64-4.016-10.448-5.664-17.2-1.648 6.752-3.504 12.56-5.632 17.2-30.944 66.672-109.248 95.264-174.944 63.84-65.6-31.424-93.744-110.96-62.832-177.648 30.928-66.672 243.344-257.84 243.344-257.84s0.016 0.224 0.048 0.576c0.048-0.352 0.064-0.576 0.064-0.576s212.512 191.168 243.44 257.84c30.896 66.688 2.832 146.224-62.848 177.648z"/><glyph unicode="" d="M362.533 425.051c-49.81-49.792-20.809-20.772-20.809-20.772l96.402-96.384c0 0-31.067-31.049 20.772 20.773s-46.611 146.194-96.365 96.384zM320.147 383.671l-227.987-227.986 0.329-0.293-54.071-146.524 149.833 50.688 0.311-0.311 0.786 0.805v0.019l227.2 227.2-96.403 96.403zM179.036 104.375l-78.811-33.28 37.047 75.044 38.345 38.363 41.764-41.783-38.345-38.345z"/><glyph unicode="" d="M255.952 480l-255.952-448h512l-256.048 448zM287.12 353.808v-65.36l-16.688-128.544h-27.088l-18.032 128.544-0.992 65.36h62.8zM224.096 64.112v64.112h64.24v-64.112h-64.24z"/><glyph unicode="" d="M363.923 112.019c-29.805-28.764-68.663-43.502-108.013-43.538-35.145 0.036-70.199 11.757-99.347 35.932-37.029 30.829-56.046 74.971-56.1 119.661 0 7.442 0.549 14.829 1.591 22.18l-60.672-11.374c-0.164-3.602-0.292-7.186-0.292-10.807-0.036-61.495 26.459-122.899 77.549-165.285 40.009-33.335 88.887-49.683 137.252-49.683h0.128c56.211 0 112.164 22.217 153.746 64.914l39.844-39.772 0.311 124.745-131.803 0.348 45.805-47.324zM393.344 389.23c-40.046 33.335-88.923 49.664-137.271 49.664-55.808 0-111.397-21.833-152.923-63.945l-37.687 34.798-0.677-120.722 130.487-0.75-46.336 48.493c29.641 28.252 68.188 42.697 107.154 42.733 35.108-0.036 70.217-11.721 99.328-35.932 37.029-30.829 56.046-74.935 56.137-119.698 0-6.437-0.457-12.892-1.225-19.365l60.435 11.593c0.036 2.615 0.164 5.212 0.164 7.772-0.036 61.549-26.514 122.899-77.587 165.357z"/><glyph unicode="" d="M95.792-32h320.4v320.080h-320.4v-320.080zM318.336 228.512c0 9.904 8.032 17.904 17.952 17.904 9.904 0 17.936-8 17.936-17.904v-188.736c0-9.888-8.032-17.92-17.936-17.92-9.92 0-17.952 8.032-17.952 17.92v188.736zM238.048 228.512c0 9.904 8.032 17.904 17.92 17.904s17.92-8 17.92-17.904v-188.736c0-9.888-8.032-17.92-17.92-17.92s-17.92 8.032-17.92 17.92v188.736zM157.6 228.512c0 9.904 8 17.904 17.92 17.904 9.888 0 17.92-8 17.92-17.904v-188.736c0-9.888-8.032-17.92-17.92-17.92-9.92 0-17.92 8.032-17.92 17.92v188.736zM423.216 416.528h-71.232v10.896c0 29.040-19.76 52.576-48.8 52.576h-94.72c-29.008 0-48.48-23.536-48.48-52.576v-10.896h-71.232c-13.696 0-24.768-11.088-24.768-24.752v-71.984h384v71.984c0 13.664-11.040 24.752-24.768 24.752zM319.936 416.528h-128.192v14.704c0.032 9.248 7.488 16.736 16.72 16.768h94.72c9.216-0.032 16.704-7.52 16.752-16.768v-14.704z"/><glyph unicode="" d="M511.52 278.496c-1.312 4.096-5.152 6.88-9.44 6.88h-180.704l-55.952 171.744c-1.344 4.096-5.136 6.88-9.44 6.88-4.272 0-8.096-2.784-9.44-6.88l-56.24-171.744h-180.384c-4.256 0-8.096-2.784-9.44-6.88-1.312-4.064 0.128-8.592 3.584-11.088l145.984-106.32-56.256-172.72c-1.328-4.096 0.128-8.592 3.616-11.12 3.456-2.496 8.208-2.496 11.664 0l146.896 106.624 146.64-106.624c1.792-1.28 3.76-1.936 5.808-1.936 2.096 0 4.144 0.656 5.856 1.936 3.568 2.528 4.96 7.008 3.6 11.12l-56.24 172.72 146.288 106.32c3.488 2.496 4.928 6.992 3.6 11.088z"/><glyph unicode="" d="M473.015 200.375v49.371l-7.003 2.268-52.882 17.244-14.116 34.103 27.154 57.381-34.908 34.907-6.583-3.309-49.555-25.198-34.103 14.117-21.394 59.757h-49.371l-2.286-6.985-17.262-52.882-34.048-14.099-57.399 27.136-34.925-34.926 3.309-6.564 25.18-49.591-14.080-34.029-59.758-21.412v-49.39l6.949-2.249 52.901-17.28 14.099-34.067-27.118-57.38 34.925-34.925 6.528 3.328 49.591 25.197 34.066-14.116 21.394-59.757h49.371l2.286 6.985 17.28 52.882 34.029 14.116 57.399-27.136 34.944 34.908-3.346 6.546-25.197 49.572 14.116 34.067 59.813 21.413zM256 154.861c-38.199 0-69.156 30.957-69.156 69.139 0 38.217 30.958 69.156 69.156 69.156 38.163 0 69.156-30.94 69.156-69.156 0-38.18-31.012-69.139-69.156-69.139z"/><glyph unicode="" d="M31.008 351.36l224.992-239.984 225.040 239.984z"/><glyph unicode="" d="M383.415 226.596l-212.571 218.587-37.285-34.981 178.286-183.277-183.278-188.452 36.48-35.657 205.659 211.456-0.201 0.201z"/><glyph unicode="" d="M52.928 345.2h406.144c11.056 0 20 8.976 20 20.016 0 11.072-8.944 20.032-20 20.032h-406.144c-11.056 0-20.016-8.96-20.016-20.032 0-11.040 8.96-20.016 20.016-20.016zM459.072 244.016h-406.144c-11.056 0-20.016-8.944-20.016-20.016s8.96-20.016 20.016-20.016h406.144c11.056 0 20 8.944 20 20.016s-8.928 20.016-20 20.016zM459.072 102.8h-406.144c-11.056 0-20.016-8.96-20.016-20.032s8.96-20.016 20.016-20.016h406.144c11.056 0 20 8.944 20 20.016s-8.928 20.032-20 20.032z"/><glyph unicode="" d="M256.144 480c-89.12 0-161.344-72.24-161.344-161.376 0-89.104 161.344-350.624 161.344-350.624s161.376 261.52 161.376 350.624c0 89.136-72.192 161.376-161.376 161.376zM256.144 269.616c-27.056 0-49.024 21.952-49.024 49.008 0 27.072 21.984 49.024 49.024 49.024 27.104 0 49.088-21.952 49.088-49.024 0-27.056-21.984-49.008-49.088-49.008z"/><glyph unicode="" d="M0 256.144h224.032v223.808h-224.032v-223.808zM288.128 479.952v-95.728h224.176v95.728h-224.176zM0-32h224.032v223.808h-224.032v-223.808zM288.128 256.144h224.176v95.728h-224.176v-95.728zM288.128 96.080h224.176v95.728h-224.176v-95.728zM288.128-32h224.176v95.712h-224.176v-95.712z"/><glyph unicode="" d="M332.764 119.003c-9.216 0-45.495-56.027-65.243-56.027-5.284 0-7.863 4.644-7.863 9.216 0 10.569 7.241 27.044 11.154 36.937l47.397 128.384c23.772 63.891-6.546 81.024-34.871 81.024-38.217 0-72.448-19.091-98.779-44.124-8.576-8.576-37.523-36.206-37.523-48.091 0-3.932 3.931-8.576 8.576-8.576 11.813 0 43.447 57.308 67.803 57.308 5.285 0 11.191-5.924 6.583-17.755l-46.080-115.968c-4.644-11.154-27.044-65.171-27.044-96.786 0-25.015 16.476-36.188 40.192-36.188 66.523 0 143.543 81.645 143.543 100.755-0.019 5.925-4.589 9.892-7.844 9.892zM319.543 439.661c-28.947 0-54.016-23.68-54.016-52.663 0-27.008 17.792-44.8 44.837-44.8 29.55 0 54.62 22.4 54.62 52.7 0 27.008-19.072 44.764-45.44 44.764z"/><glyph unicode="" d="M0 351.552h128.464v128.448h-128.464v-128.448zM191.76 351.552h128.528v128.448h-128.528v-128.448zM383.568 480v-128.448h128.496v128.448h-128.496zM0 159.744h128.464v128.464h-128.464v-128.464zM191.76 159.744h128.528v128.464h-128.528v-128.464zM383.568 159.744h128.496v128.464h-128.496v-128.464zM0-32h128.464v128h-128.464v-128zM191.76-32h128.528v128h-128.528v-128zM383.568-32h128.496v128h-128.496v-128z"/><glyph unicode="" d="M255.296 450.464c-124.688 0-225.76-101.072-225.76-225.76 0-124.672 101.072-225.76 225.76-225.76 124.672 0 225.76 101.088 225.76 225.76 0 124.688-101.072 225.76-225.76 225.76zM231.936 94.576l-125.936 128.032 32.208 25.936 72.864-57.088c29.76 35.424 96 106.032 187.312 161.984l7.696-17.792c-83.808-77.088-152.48-185.6-174.144-241.072z"/><glyph unicode="" d="M0 241.12h512v-34.064h-512v34.064z"/><glyph unicode="" d="M478.263 426.149c-142.555-87.388-245.98-197.632-292.48-252.947l-113.792 89.161-50.267-40.539 196.663-199.973c33.847 86.674 141.056 256.11 271.872 376.485l-11.995 27.813z"/><glyph unicode="" d="M220.576 83.248c-26.352 0-47.696-21.376-47.696-47.712s21.344-47.664 47.696-47.664c26.336 0 47.696 21.328 47.696 47.664s-21.36 47.712-47.696 47.712zM385.344 83.248c-26.4 0-47.76-21.376-47.76-47.712s21.344-47.664 47.76-47.664c26.288 0 47.632 21.328 47.632 47.664s-21.344 47.712-47.632 47.712zM459.856 350.32c-122.384 0-319.856 0-319.856 0s-19.152 52.608-37.392 84.864c-14.128 24.976-43.344 23.968-43.344 23.968-20.096 0-33.024-12.288-33.024-32.4 0-20.096 15.92-36.16 36.032-36.16l8.496-0.080 95.2-262.192 266.832-0.208c0 0 48.784 199.632 46.272 191.888 8.944 27.68-2.448 30.32-19.216 30.32zM166.528 257.344c-14 0-25.36 11.36-25.36 25.376s11.36 25.392 25.36 25.392c14.016 0 25.36-11.376 25.36-25.392s-11.344-25.376-25.36-25.376zM220.768 172.64c-14.016 0-25.376 11.376-25.376 25.392 0 13.984 11.36 25.36 25.376 25.36 14 0 25.36-11.376 25.36-25.36 0.016-14.016-11.36-25.392-25.36-25.392zM248.656 257.344c-14 0-25.376 11.36-25.376 25.376s11.36 25.392 25.376 25.392c14 0 25.36-11.376 25.36-25.392s-11.36-25.376-25.36-25.376zM302.896 172.64c-14 0-25.36 11.376-25.36 25.392 0 13.984 11.36 25.36 25.36 25.36 14.048 0 25.44-11.376 25.44-25.36 0-14.016-11.392-25.392-25.44-25.392zM330.848 257.344c-14 0-25.408 11.36-25.408 25.376s11.408 25.392 25.408 25.392c14 0 25.328-11.376 25.328-25.392s-11.328-25.376-25.328-25.376zM385.040 172.64c-13.984 0-25.328 11.376-25.328 25.392 0 13.984 11.36 25.36 25.328 25.36 14 0 25.408-11.376 25.408-25.36 0-14.016-11.408-25.392-25.408-25.392zM412.96 257.344c-14.016 0-25.36 11.36-25.36 25.376s11.344 25.392 25.36 25.392c14.048 0 25.376-11.376 25.376-25.392s-11.328-25.376-25.376-25.376z"/><glyph unicode="" d="M142.992 332.768c10.352 0 18.8 8.4 18.8 18.8v67.68c0 10.368-8.432 18.784-18.8 18.784-10.384 0-18.8-8.4-18.8-18.784v-67.68c0-10.4 8.416-18.8 18.8-18.8zM394.384 383.344v-0.32c7.776-6.944 12.72-17.008 12.72-28.288 0-20.816-16.88-37.712-37.744-37.712s-37.76 16.912-37.76 37.712c0 11.264 4.976 21.344 12.784 28.288v0.32h-176.416v-0.32c7.824-6.944 12.768-17.008 12.768-28.288 0-20.816-16.896-37.712-37.728-37.712-20.864 0-37.744 16.912-37.744 37.712 0 11.264 4.928 21.344 12.752 28.288v0.32h-85.536v-383.6h447.248v383.6h-85.344zM448.72 32.832h-383.152v254.72h383.152v-254.72zM369.36 332.768c10.384 0 18.784 8.4 18.784 18.8v67.68c0 10.368-8.4 18.784-18.784 18.784-10.352 0-18.816-8.4-18.816-18.784v-67.68c0-10.4 8.464-18.8 18.816-18.8zM349.216 184.128h-47.936v-47.872h47.952v47.872zM349.216 256.112h-47.936v-47.824h47.952v47.824zM349.216 114.112h-47.936v-47.872h47.952v47.872zM416.656 256.112h-47.92v-47.824h47.92v47.824zM416.656 184.128h-47.92v-47.872h47.92v47.872zM281.696 256.112h-47.872v-47.824h47.872v47.824zM146.8 184.128h-47.856v-47.872h47.856v47.872zM214.288 114.112h-47.888v-47.872h47.872v47.872zM146.8 114.112h-47.856v-47.872h47.856v47.872zM281.696 184.128h-47.872v-47.872h47.872v47.872zM281.696 114.112h-47.872v-47.872h47.872v47.872zM214.288 184.128h-47.888v-47.872h47.872v47.872zM214.288 256.112h-47.888v-47.824h47.872v47.824z"/><glyph unicode="" d="M256 444.727l-200.814-243.291h131.054v-198.144h139.575v198.144h131.017z"/><glyph unicode="" d="M325.779 246.583v198.144h-139.593v-198.144h-130.999l200.832-243.292 200.813 243.292z"/><glyph unicode="" d="M487.232 35.872c0 0-78.176 80.288-109.328 111.312-13.552 13.552-22.832 22.752-22.832 22.752 10.56 15.088 18.816 31.616 24.704 49.392 5.84 17.76 8.752 36.496 8.752 56.192 0 25.36-4.816 49.2-14.448 71.552-9.664 22.32-22.784 41.824-39.456 58.432-16.64 16.688-36.144 29.824-58.496 39.472-22.336 9.664-46.176 14.496-71.536 14.496-25.344 0-49.184-4.848-71.552-14.496-22.336-9.648-41.712-22.784-58.192-39.472-16.416-16.608-29.52-36.128-39.152-58.448-9.664-22.336-14.496-46.192-14.496-71.552 0-25.376 4.848-49.216 14.496-71.552 9.632-22.304 22.72-41.792 39.152-58.464 16.464-16.608 35.856-29.776 58.176-39.456 22.368-9.664 46.208-14.448 71.552-14.448 19.68 0 38.416 2.88 56.208 8.768 17.776 5.856 34.288 14.144 49.36 24.72 0 0 8.576-8.512 21.2-21.216 34.512-34.64 110.416-113.392 110.416-113.392 11.456-4.992 29.712 0.336 38.848 8.064 9.040 7.776 14.096 23.984 6.624 37.344zM327.792 223.28c-7.008-16.192-16.576-30.336-28.624-42.336-12.096-12.048-26.192-21.616-42.336-28.608-16.128-7.024-33.392-10.528-51.68-10.528-18.704 0-36.096 3.504-52.256 10.528-16.16 7.008-30.288 16.56-42.336 28.608-12.048 12.016-21.616 26.16-28.608 42.336-7.008 16.112-10.512 33.568-10.512 52.24 0 18.272 3.504 35.632 10.512 51.984 6.992 16.336 16.56 30.56 28.608 42.592 12.048 12.096 26.176 21.664 42.336 28.608 16.16 7.056 33.552 10.512 52.256 10.512 18.288 0 35.552-3.456 51.68-10.512 16.144-6.96 30.24-16.512 42.336-28.608 12.032-12.032 21.616-26.256 28.624-42.592 7.008-16.352 10.48-33.712 10.48-51.984 0.016-18.672-3.456-36.128-10.48-52.24z"/><glyph unicode="" d="M483.255 415.177l-36.023 35.968-191.25-191.268-191.25 191.268-35.986-35.968 191.268-191.269-191.123-191.14 35.968-35.932 191.14 191.104 191.123-191.104 35.932 35.932-191.104 191.123z"/><glyph unicode="" d="M200.21 226.889l178.213 183.315-37.248 34.981-212.608-218.588 218.459-223.78 36.389 35.657z"/><glyph unicode="" d="M256 335.168l-224.992-239.984h450.032z"/><glyph unicode="" d="M96.624 451.12v-454.24l312.928 227.12z"/><glyph unicode="" d="M102.992 224l312.912-227.12v454.24z"/><glyph unicode="" d="M0 0.464h63.984v479.536h-63.984v-479.536zM512.080 480h-415.824v-287.888h415.824l-138.208 142.032 138.208 145.856z"/><glyph unicode="" d="M512 241.12h-238.512v238.88h-34.016v-238.88h-239.472v-34.064h239.472v-239.056h34.016v239.056h238.512z"/><glyph unicode="" d="M255.968 228.064l221.488 155.84c-2.656 0.528-5.344 0.848-8.128 0.848h-426.656c-2.8 0-5.504-0.32-8.144-0.848l221.44-155.84zM256.928 168.496l-0.96 1.408-0.944-1.408-254.56 179.136c-0.176-1.6-0.464-3.2-0.464-4.816v-267.712c0-23.904 19.104-43.312 42.672-43.312h426.656c23.6 0 42.688 19.408 42.688 43.312v267.712c0 1.632-0.288 3.216-0.496 4.816l-254.592-179.136z"/><glyph unicode="" d="M127.584 31.776v127.632h-127.584v-127.632h127.584zM319.248 416.24h-126.928v-384.448h126.928v384.448zM511.584 287.472h-127.376v-255.68h127.376v255.68z"/><glyph unicode="" d="M255.296 450.464c-124.688 0-225.76-101.072-225.76-225.76 0-124.672 101.072-225.76 225.76-225.76 124.672 0 225.76 101.088 225.76 225.76 0 124.688-101.072 225.76-225.76 225.76zM372.16 144.832l-37.104-37.104-79.088 79.056-79.056-79.040-37.12 37.136 79.024 79.024-79.136 79.12 37.136 37.136 79.12-79.136 79.184 79.184 37.152-37.152-79.2-79.168 79.088-79.056z"/><glyph unicode="" d="M262.748 418.688c-113.664 2.249-207.214-67.803-208.969-156.435-0.585-30.829 9.984-59.813 28.8-84.644l-4.919 4.955c32.384-41.618-31.104-153.308-31.104-153.308l142.281 70.345c22.51-7.095 44.16-11.923 69.724-12.452 113.664-2.231 205.111 78.355 206.848 167.004 1.755 88.631-88.96 162.304-202.661 164.535z"/><glyph unicode="" d="M259.163 285.422l201.837-196.224 38.546 41.070-240.713 234.021-246.363-240.476 39.26-40.101z"/><glyph unicode="" d="M252.819 162.579l-201.82 196.224-38.528-41.070 240.677-234.021 246.4 240.476-39.332 40.101z"/><glyph unicode="" d="M256-33.248c-141.408 0-256 114.624-256 256s114.592 256 256 256c141.376 0 256-114.624 256-256s-114.608-256-256-256zM256 447.76c-124.048 0-225.008-100.96-225.008-225.008s100.96-225.024 225.008-225.024 224.992 100.96 224.992 225.008-100.928 225.024-224.992 225.024zM320.24 219.152l-15.6-12.128c-8.496-6.624-14.128-14.32-16.912-23.152-1.776-5.6-3.008-12.256-3.168-24h-59.712c0.88 24.848 3.504 39.968 7.328 49.472 3.808 9.472 13.632 20.368 29.44 32.72l16.032 12.528c5.28 4 9.536 8.32 12.752 13.024 5.872 8.064 8.784 16.976 8.784 26.656 0 11.152-3.248 21.312-9.776 30.496-6.496 9.184-18.4 13.808-35.712 13.808-17.008 0-29.056-5.68-36.16-17.008s-10.592-21.664-10.592-33.84h-63.68c1.744 41.872 16.32 70.16 43.776 87.632 17.344 11.152 38.656 16.752 63.904 16.752 33.216 0 60.784-7.936 82.752-23.808 21.968-15.84 34.8-48.432 34.8-79.6 0-19.088-6.624-26.096-16.144-39.184-5.584-7.92-16.272-18.048-32.112-30.368zM287.728 64h-63.504v63.68h63.504v-63.68z"/><glyph unicode="" d="M416.656 128v135.696h-320.672v-135.696h-95.984v199.344c0 13.76 11.168 24.912 24.944 24.912h462.144c13.744 0 24.912-11.152 24.912-24.912v-199.344h-95.344zM464.304 324.624c-11.024 0-19.92-8.928-19.92-19.936s8.896-19.952 19.92-19.952c10.992 0 19.968 8.96 19.968 19.952 0 11.008-8.992 19.936-19.968 19.936zM127.728 480h256v-96.192h-256v96.192zM160.976 31.664h191.232v192.336h31.824v-224.080h-255.984v224.080h32.912v-192.336z"/><glyph unicode="" d="M502.080 285.376h-180.704l-55.952 171.744c-1.344 4.096-5.136 6.88-9.44 6.88-4.272 0-8.096-2.784-9.44-6.88l-56.24-171.744h-180.384c-4.256 0-8.096-2.784-9.44-6.88-1.312-4.064 0.128-8.592 3.584-11.088l145.984-106.32-56.256-172.72c-1.328-4.096 0.128-8.592 3.616-11.12 3.456-2.496 8.208-2.496 11.664 0l146.896 106.624 146.64-106.624c1.792-1.28 3.76-1.936 5.808-1.936 2.096 0 4.144 0.656 5.856 1.936 3.568 2.528 4.96 7.008 3.6 11.12l-56.24 172.72 146.288 106.32c3.488 2.496 4.928 7.008 3.6 11.088-1.312 4.096-5.168 6.88-9.44 6.88zM333.424 170.256l48.208-148.064-125.632 91.36-125.968-91.44 48.256 148.128-125.168 91.136h154.576l48.256 147.376 48.016-147.376h154.832l-125.376-91.12z"/><glyph unicode="" d="M319.376 223.824v127.76h-126.752v-127.76h-89.744l153.168-188.608 153.088 188.608zM256.016 480c-141.392 0-256-114.608-256-255.984 0-141.392 114.608-256.016 256-256.016 141.376 0 256 114.624 256 256.016 0 141.376-114.624 255.984-256 255.984zM256.016 0c-123.52 0-224 100.496-224 224.016 0 123.504 100.48 223.984 224 223.984s224-100.48 224-223.984c0-123.52-100.48-224.016-224-224.016z"/><glyph unicode="" d="M255.982 440.594c-119.607 0-216.576-96.969-216.576-216.594s96.969-216.595 216.576-216.595c119.625 0 216.595 96.969 216.595 216.595s-96.951 216.595-216.595 216.595zM255.982 419.913c108.051 0 195.913-87.881 195.913-195.913 0-45.184-15.507-86.711-41.325-119.899-3.108 1.134-6.217 2.195-9.197 3.456-19.748 8.265-41.709 17.957-61.421 26.094-5.632 1.536-11.264 3.072-16.896 4.608-6.692 4.589-13.33 19.986-16.914 27.666-3.548 0.512-7.149 1.005-10.752 1.481 0.531 11.868 7.881 12.544 10.752 21.541 2.541 7.954 0.293 18.341 4.279 25.728 2.779 5.12 9.125 5.12 12.233 9.545 2.853 3.95 4.772 10.917 5.668 15.799 1.609 8.905 3.017 21.12-1.207 29.988-2.432 5.065-3.968 5.577-4.644 11.739-0.823 7.516 2.212 31.891 2.341 37.175 0.293 13.678-0.055 14.793-3.346 28.123 0 0-4.005 12.087-10.295 15.726l-12.58 2.158-7.772 7.186c-31.305 19.273-64.877 5.76-82.834-1.499-25.911-8.43-42.295-33.792-30.867-87.955 1.957-9.289-5.065-13.421-4.608-18.468 1.042-11.045 1.207-37.614 11.648-44.124 0.969-0.603 8.375-2.469 8.339-1.938 1.006-10.752 2.048-21.522 3.054-32.238 2.615-7.149 8.869-7.954 10.679-18.048l-7.991-1.92c-3.602-7.68-10.185-23.077-16.896-27.666-5.65-1.517-11.282-3.053-16.915-4.589-19.731-8.119-41.655-17.829-61.422-26.094-1.079-0.439-2.213-0.786-3.291-1.207-24.759 32.786-39.625 73.454-39.625 117.632 0 108.032 87.881 195.913 195.895 195.913z"/><glyph unicode="" d="M94.8 322.592l-93.424 78.464-0.496-321.968 316.688 56.336-89.216 74.96c182.112 167.52 227.904-8.128 246.272-204.784 65.936 574.064-229.84 445.328-379.824 316.992z"/><glyph unicode="" d="M428.432 224h-20.080v96.176c0 43.36-16.448 83.104-43.632 112.144-27.056 29.056-65.632 47.712-108.16 47.68-42.544 0.032-81.12-18.624-108.192-47.68-27.184-29.040-43.632-68.784-43.648-112.144v-96.176h-20.816c-10.816 0-19.584-8.752-19.584-19.584v-216.8c0-10.848 8.768-19.616 19.584-19.616h344.528c10.8 0 19.584 8.768 19.584 19.632v216.8c0 10.816-8.784 19.568-19.584 19.568zM176.816 320.176c0 25.024 9.472 47.168 24.192 62.928 14.848 15.728 34.144 24.784 55.552 24.816 21.376-0.032 40.688-9.072 55.536-24.816 14.704-15.744 24.176-37.888 24.176-62.928v-96.176h-159.44v96.176z"/><glyph unicode="" d="M150.896 316.944h-112.192c-9.040 0-16.384-7.312-16.384-16.368v-80c0-9.056 7.344-16.368 16.384-16.368h112.192c9.056 0 16.432 7.312 16.432 16.368v80c0 9.056-7.376 16.368-16.432 16.368zM150.896 171.056h-79.376c-9.056 0-16.432-7.312-16.432-16.368v-170.32c-0.016-9.056 7.36-16.368 16.432-16.368h79.376c9.056 0 16.432 7.312 16.432 16.368v170.32c0 9.056-7.376 16.368-16.432 16.368zM473.328 316.944h-244.88c-9.056 0-16.368-7.312-16.368-16.368v-80c0-9.056 7.312-16.368 16.368-16.368h244.88c8.992 0 16.368 7.312 16.368 16.368v80c0 9.056-7.36 16.368-16.368 16.368zM439.52 169.376h-210.56c-9.056 0-16.368-7.344-16.368-16.4v-168.592c0-9.056 7.312-16.368 16.368-16.368h210.56c9.056 0 16.368 7.312 16.368 16.368v168.592c0 9.056-7.312 16.4-16.368 16.4zM251.952 335.68c19.12-3.504 37.568-5.536 54.816-5.536 86.688 0 133.68 46.592 133.936 90.464 0.128 28.256-20.752 58.88-68.368 59.376-63.808 0-103.312-45.056-123.872-78.496-20.944 33.312-60.624 77.472-124.56 77.472-46.256-0.464-67.2-31.088-67.008-59.328 0.176-43.888 47.248-90.512 133.936-90.512v0c18.752 0 38.88 2.128 59.872 6.336l1.248 0.224zM373.264 439.008c8-0.064 26.56-2 26.432-18.192-0.064-20.624-28.992-49.68-92.944-49.68-8.816 0-18 0.56-27.632 1.68 14.576 25.648 45.216 66.192 94.144 66.192zM190.832 370.128v0c-63.936 0-92.88 29.056-92.992 49.68-0.080 16.16 18.496 18.096 27.36 18.192 48.368 0 78.816-40.56 93.184-66.224-9.552-1.088-18.736-1.648-27.552-1.648z"/><glyph unicode="" d="M182.256 403.408c0-9.248-7.504-16.72-16.688-16.72h-9.776c-9.216 0-16.72 7.472-16.72 16.72v59.872c0 9.216 7.504 16.72 16.72 16.72h9.776c9.184 0 16.688-7.504 16.688-16.72v-59.872zM373.072 403.408c0-9.248-7.504-16.72-16.688-16.72h-9.744c-9.248 0-16.688 7.472-16.688 16.72v59.872c0 9.216 7.424 16.72 16.688 16.72h9.744c9.184 0 16.688-7.504 16.688-16.72v-59.872zM398.816 253.152l-33.936 27.664-133.68-163.872-71.312 56.688-25.28-31.728 105.184-83.648zM471.952 434h-62.432v-26.064c0-27.68-22.56-50.192-50.128-50.192h-9.808c-27.68 0-50.128 22.496-50.128 50.192v26.064h-85.504v-26.064c0-27.68-22.496-50.192-50.128-50.192h-9.76c-27.664 0-50.16 22.496-50.16 50.192v26.064h-63.808c-9.216 0-16.72-7.504-16.72-16.688v-432.592c0-9.216 7.504-16.72 16.72-16.72h431.84c9.184 0 16.688 7.504 16.688 16.72v432.592c0.016 9.184-7.488 16.688-16.672 16.688zM438.512 42.592c0-9.248-7.504-16.72-16.752-16.72h-331.504c-9.248 0-16.752 7.472-16.752 16.72v252.096c0 9.248 7.504 16.688 16.752 16.688h331.504c9.248 0 16.752-7.44 16.752-16.688v-252.096z"/></font></defs></svg> \ No newline at end of file diff --git a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.ttf b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.ttf index c096e782506ee3b3b2c4a46dac60529aebd7096e..e2e4864f8b1a9573b3cf18b0bd273bd5b8464f0e 100644 Binary files a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.ttf and b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.ttf differ diff --git a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff index 1b2c57c533e0e13926c58b542c9f17baeb0705b2..881e639aca422fcc6cc5fdf8ff5bd30c433e3c99 100644 Binary files a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff and b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff differ diff --git a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff2 b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff2 index cc91480dac868dc0a36bc6ce3d95bc3bcbf8ed27..66faa61a2d24a488aa52dec055ab8f19a30b9811 100644 Binary files a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff2 and b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.woff2 differ diff --git a/app/design/frontend/Magento/luma/web/fonts/selection.json b/app/design/frontend/Magento/luma/web/fonts/selection.json index 11b601ea6493080698a69a0f3f1a1516c2c4b6c7..2c4a03883a15bb5cceee2a24e6e1a0a9b07ae979 100644 --- a/app/design/frontend/Magento/luma/web/fonts/selection.json +++ b/app/design/frontend/Magento/luma/web/fonts/selection.json @@ -1,16 +1,123 @@ { "IcoMoonType": "selection", "icons": [ + { + "icon": { + "paths": [ + "M856.864 512h-40.16v-192.352c0-86.72-32.896-166.208-87.264-224.288-54.112-58.112-131.264-95.424-216.32-95.36-85.088-0.064-162.24 37.248-216.384 95.36-54.368 58.080-87.264 137.568-87.296 224.288v192.352h-41.632c-21.632 0-39.168 17.504-39.168 39.168v433.6c0 21.696 17.536 39.232 39.168 39.232h689.056c21.6 0 39.168-17.536 39.168-39.264v-433.6c0-21.632-17.568-39.136-39.168-39.136zM353.632 319.648c0-50.048 18.944-94.336 48.384-125.856 29.696-31.456 68.288-49.568 111.104-49.632 42.752 0.064 81.376 18.144 111.072 49.632 29.408 31.488 48.352 75.776 48.352 125.856v192.352h-318.88v-192.352z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "grid": 32, + "tags": [ + "private" + ] + }, + "attrs": [ + {} + ], + "properties": { + "order": 40, + "id": 37, + "prevSize": 16, + "code": 58921, + "name": "private" + }, + "setIdx": 0, + "setId": 1, + "iconIdx": 0 + }, + { + "icon": { + "paths": [ + "M364.512 153.184c0 18.496-15.008 33.44-33.376 33.44h-19.552c-18.432 0-33.44-14.944-33.44-33.44v-119.744c0-18.432 15.008-33.44 33.44-33.44h19.552c18.368 0 33.376 15.008 33.376 33.44v119.744z", + "M746.144 153.184c0 18.496-15.008 33.44-33.376 33.44h-19.488c-18.496 0-33.376-14.944-33.376-33.44v-119.744c0-18.432 14.848-33.44 33.376-33.44h19.488c18.368 0 33.376 15.008 33.376 33.44v119.744z", + "M797.632 453.696l-67.872-55.328-267.36 327.744-142.624-113.376-50.56 63.456 210.368 167.296z", + "M943.904 92h-124.864v52.128c0 55.36-45.12 100.384-100.256 100.384h-19.616c-55.36 0-100.256-44.992-100.256-100.384v-52.128h-171.008v52.128c0 55.36-44.992 100.384-100.256 100.384h-19.52c-55.328 0-100.32-44.992-100.32-100.384v-52.128h-127.616c-18.432 0-33.44 15.008-33.44 33.376v865.184c0 18.432 15.008 33.44 33.44 33.44h863.68c18.368 0 33.376-15.008 33.376-33.44v-865.184c0.032-18.368-14.976-33.376-33.344-33.376zM877.024 874.816c0 18.496-15.008 33.44-33.504 33.44h-663.008c-18.496 0-33.504-14.944-33.504-33.44v-504.192c0-18.496 15.008-33.376 33.504-33.376h663.008c18.496 0 33.504 14.88 33.504 33.376v504.192z" + ], + "attrs": [ + {}, + {}, + {}, + {} + ], + "isMulticolor": false, + "grid": 32, + "tags": [ + "gift-registry" + ] + }, + "attrs": [ + {}, + {}, + {}, + {} + ], + "properties": { + "order": 39, + "id": 36, + "prevSize": 16, + "code": 58923, + "name": "gift-registry" + }, + "setIdx": 0, + "setId": 1, + "iconIdx": 1 + }, + { + "icon": { + "paths": [ + "M301.792 326.112h-224.384c-18.080 0-32.768 14.624-32.768 32.736v160c0 18.112 14.688 32.736 32.768 32.736h224.384c18.112 0 32.864-14.624 32.864-32.736v-160c0-18.112-14.752-32.736-32.864-32.736z", + "M301.792 617.888h-158.752c-18.112 0-32.864 14.624-32.864 32.736v340.64c-0.032 18.112 14.72 32.736 32.864 32.736h158.752c18.112 0 32.864-14.624 32.864-32.736v-340.64c0-18.112-14.752-32.736-32.864-32.736z", + "M946.656 326.112h-489.76c-18.112 0-32.736 14.624-32.736 32.736v160c0 18.112 14.624 32.736 32.736 32.736h489.76c17.984 0 32.736-14.624 32.736-32.736v-160c0-18.112-14.72-32.736-32.736-32.736z", + "M879.040 621.248h-421.12c-18.112 0-32.736 14.688-32.736 32.8v337.184c0 18.112 14.624 32.736 32.736 32.736h421.12c18.112 0 32.736-14.624 32.736-32.736v-337.184c0-18.112-14.624-32.8-32.736-32.8z", + "M503.904 288.64c38.24 7.008 75.136 11.072 109.632 11.072 173.376 0 267.36-93.184 267.872-180.928 0.256-56.512-41.504-117.76-136.736-118.752-127.616 0-206.624 90.112-247.744 156.992-41.888-66.624-121.248-154.944-249.12-154.944-92.512 0.928-134.4 62.176-134.016 118.656 0.352 87.776 94.496 181.024 267.872 181.024v0c37.504 0 77.76-4.256 119.744-12.672l2.496-0.448zM746.528 81.984c16 0.128 53.12 4 52.864 36.384-0.128 41.248-57.984 99.36-185.888 99.36-17.632 0-36-1.12-55.264-3.36 29.152-51.296 90.432-132.384 188.288-132.384zM381.664 219.744v0c-127.872 0-185.76-58.112-185.984-99.36-0.16-32.32 36.992-36.192 54.72-36.384 96.736 0 157.632 81.12 186.368 132.448-19.104 2.176-37.472 3.296-55.104 3.296z" + ], + "attrs": [ + {}, + {}, + {}, + {}, + {} + ], + "isMulticolor": false, + "grid": 32, + "tags": [ + "gift-wrapping" + ] + }, + "attrs": [ + {}, + {}, + {}, + {}, + {} + ], + "properties": { + "order": 38, + "id": 35, + "prevSize": 16, + "code": 58922, + "name": "present" + }, + "setIdx": 0, + "setId": 1, + "iconIdx": 2 + }, { "icon": { "paths": [ "M1004.16 389.248h-361.408l-111.904-343.488c-2.688-8.192-10.272-13.76-18.88-13.76-8.544 0-16.192 5.568-18.88 13.76l-112.48 343.488h-360.768c-8.512 0-16.192 5.568-18.88 13.76-2.624 8.128 0.256 17.184 7.168 22.176l291.968 212.64-112.512 345.44c-2.656 8.192 0.256 17.184 7.232 22.24 6.912 4.992 16.416 4.992 23.328 0l293.792-213.248 293.28 213.248c3.584 2.56 7.52 3.872 11.616 3.872 4.192 0 8.288-1.312 11.712-3.872 7.136-5.056 9.92-14.016 7.2-22.24l-112.48-345.44 292.576-212.64c6.976-4.992 9.856-14.016 7.2-22.176-2.624-8.192-10.336-13.76-18.88-13.76zM666.848 619.488l96.416 296.128-251.264-182.72-251.936 182.88 96.512-296.256-250.336-182.272h309.152l96.512-294.752 96.032 294.752h309.664l-250.752 182.24z" ], - "grid": 0, + "grid": 32, "tags": [ "star-empty" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 3, "id": 2, @@ -20,7 +127,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 0 + "setId": 1, + "iconIdx": 3 }, { "icon": { @@ -28,11 +136,13 @@ "M638.752 512.352v-255.52h-253.504v255.52h-179.488l306.336 377.216 306.176-377.216z", "M512.032 0c-282.784 0-512 229.216-512 511.968 0 282.784 229.216 512.032 512 512.032 282.752 0 512-229.248 512-512.032-0-282.752-229.248-511.968-512-511.968zM512.032 960c-247.040 0-448-200.992-448-448.032-0-247.008 200.96-447.968 448-447.968s448 200.96 448 447.968c0 247.040-200.96 448.032-448 448.032z" ], - "grid": 0, + "grid": 32, "tags": [ "download" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 2, "id": 1, @@ -42,18 +152,21 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 1 + "setId": 1, + "iconIdx": 4 }, { "icon": { "paths": [ "M189.6 314.816l-186.848-156.928-0.992 643.936 633.376-112.672-178.432-149.92c364.224-335.040 455.808 16.256 492.544 409.568 131.872-1148.128-459.68-890.656-759.648-633.984z" ], - "grid": 0, + "grid": 32, "tags": [ "undo" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 1, "id": 0, @@ -63,7 +176,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 2 + "setId": 1, + "iconIdx": 5 }, { "icon": { @@ -73,8 +187,10 @@ "tags": [ "print" ], - "grid": 0 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 2, "id": 0, @@ -83,8 +199,9 @@ "name": "print", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 0 + "setIdx": 0, + "setId": 1, + "iconIdx": 6 }, { "icon": { @@ -94,8 +211,10 @@ "tags": [ "help" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 37, "id": 2, @@ -104,8 +223,9 @@ "name": "help", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 1 + "setIdx": 0, + "setId": 1, + "iconIdx": 7 }, { "icon": { @@ -115,8 +235,10 @@ "tags": [ "success" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 34, "id": 1, @@ -125,8 +247,9 @@ "name": "success", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 2 + "setIdx": 0, + "setId": 1, + "iconIdx": 8 }, { "icon": { @@ -136,8 +259,10 @@ "tags": [ "error" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 35, "id": 0, @@ -146,8 +271,9 @@ "name": "error", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 3 + "setIdx": 0, + "setId": 1, + "iconIdx": 9 }, { "icon": { @@ -157,8 +283,10 @@ "tags": [ "account" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 30, "id": 4, @@ -167,8 +295,9 @@ "name": "account", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 4 + "setIdx": 0, + "setId": 1, + "iconIdx": 10 }, { "icon": { @@ -178,8 +307,10 @@ "tags": [ "edit" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 32, "id": 5, @@ -188,8 +319,9 @@ "name": "edit", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 5 + "setIdx": 0, + "setId": 1, + "iconIdx": 11 }, { "icon": { @@ -199,8 +331,10 @@ "tags": [ "wishlist" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 31, "id": 32, @@ -209,8 +343,9 @@ "name": "wishlist-full", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 6 + "setIdx": 0, + "setId": 1, + "iconIdx": 12 }, { "icon": { @@ -220,8 +355,10 @@ "tags": [ "warning" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 33, "id": 30, @@ -230,8 +367,9 @@ "name": "warning", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 7 + "setIdx": 0, + "setId": 1, + "iconIdx": 13 }, { "icon": { @@ -241,8 +379,10 @@ "tags": [ "update" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 1, "id": 29, @@ -251,8 +391,9 @@ "name": "update", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 8 + "setIdx": 0, + "setId": 1, + "iconIdx": 14 }, { "icon": { @@ -262,8 +403,10 @@ "tags": [ "trash" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 2, "id": 28, @@ -272,8 +415,9 @@ "name": "trash", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 9 + "setIdx": 0, + "setId": 1, + "iconIdx": 15 }, { "icon": { @@ -283,8 +427,10 @@ "tags": [ "star" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 36, "id": 27, @@ -293,8 +439,9 @@ "name": "star", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 10 + "setIdx": 0, + "setId": 1, + "iconIdx": 16 }, { "icon": { @@ -304,8 +451,10 @@ "tags": [ "settings" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 3, "id": 26, @@ -314,8 +463,9 @@ "name": "settings", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 11 + "setIdx": 0, + "setId": 1, + "iconIdx": 17 }, { "icon": { @@ -325,8 +475,10 @@ "tags": [ "pointer down" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 4, "id": 19, @@ -335,8 +487,9 @@ "name": "pointer-down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 12 + "setIdx": 0, + "setId": 1, + "iconIdx": 18 }, { "icon": { @@ -346,8 +499,10 @@ "tags": [ "next" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 5, "id": 18, @@ -356,8 +511,9 @@ "name": "next", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 13 + "setIdx": 0, + "setId": 1, + "iconIdx": 19 }, { "icon": { @@ -367,8 +523,10 @@ "tags": [ "menu" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 6, "id": 17, @@ -377,8 +535,9 @@ "name": "menu", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 14 + "setIdx": 0, + "setId": 1, + "iconIdx": 20 }, { "icon": { @@ -388,8 +547,10 @@ "tags": [ "location" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 7, "id": 16, @@ -398,8 +559,9 @@ "name": "location", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 15 + "setIdx": 0, + "setId": 1, + "iconIdx": 21 }, { "icon": { @@ -409,8 +571,10 @@ "tags": [ "list" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 8, "id": 15, @@ -419,8 +583,9 @@ "name": "list", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 16 + "setIdx": 0, + "setId": 1, + "iconIdx": 22 }, { "icon": { @@ -430,8 +595,10 @@ "tags": [ "info" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 9, "id": 14, @@ -440,8 +607,9 @@ "name": "info", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 17 + "setIdx": 0, + "setId": 1, + "iconIdx": 23 }, { "icon": { @@ -451,8 +619,10 @@ "tags": [ "grid" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 10, "id": 13, @@ -461,8 +631,9 @@ "name": "grid", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 18 + "setIdx": 0, + "setId": 1, + "iconIdx": 24 }, { "icon": { @@ -472,8 +643,10 @@ "tags": [ "minus" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 11, "id": 5, @@ -482,8 +655,9 @@ "name": "minus", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 19 + "setIdx": 0, + "setId": 1, + "iconIdx": 25 }, { "icon": { @@ -493,8 +667,10 @@ "tags": [ "checkmark" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 12, "id": 4, @@ -503,8 +679,9 @@ "name": "checkmark", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 20 + "setIdx": 0, + "setId": 1, + "iconIdx": 26 }, { "icon": { @@ -514,8 +691,10 @@ "tags": [ "cart" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 13, "id": 3, @@ -524,8 +703,9 @@ "name": "cart", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 21 + "setIdx": 0, + "setId": 1, + "iconIdx": 27 }, { "icon": { @@ -535,8 +715,10 @@ "tags": [ "calendar" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 14, "id": 2, @@ -545,8 +727,9 @@ "name": "calendar", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 22 + "setIdx": 0, + "setId": 1, + "iconIdx": 28 }, { "icon": { @@ -556,8 +739,10 @@ "tags": [ "arrow up" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 15, "id": 1, @@ -566,8 +751,9 @@ "name": "arrow-up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 23 + "setIdx": 0, + "setId": 1, + "iconIdx": 29 }, { "icon": { @@ -577,8 +763,10 @@ "tags": [ "arrow down" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 16, "id": 0, @@ -587,8 +775,9 @@ "name": "arrow-down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 24 + "setIdx": 0, + "setId": 1, + "iconIdx": 30 }, { "icon": { @@ -598,8 +787,10 @@ "tags": [ "search" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 17, "id": 25, @@ -608,8 +799,9 @@ "name": "search", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 25 + "setIdx": 0, + "setId": 1, + "iconIdx": 31 }, { "icon": { @@ -619,8 +811,10 @@ "tags": [ "remove" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 18, "id": 24, @@ -629,8 +823,9 @@ "name": "remove", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 26 + "setIdx": 0, + "setId": 1, + "iconIdx": 32 }, { "icon": { @@ -640,8 +835,10 @@ "tags": [ "prev" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 19, "id": 23, @@ -650,8 +847,9 @@ "name": "prev", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 27 + "setIdx": 0, + "setId": 1, + "iconIdx": 33 }, { "icon": { @@ -661,8 +859,10 @@ "tags": [ "pointer up" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 20, "id": 22, @@ -671,8 +871,9 @@ "name": "pointer-up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 28 + "setIdx": 0, + "setId": 1, + "iconIdx": 34 }, { "icon": { @@ -682,8 +883,10 @@ "tags": [ "pointer right" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 21, "id": 21, @@ -692,8 +895,9 @@ "name": "pointer-right", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 29 + "setIdx": 0, + "setId": 1, + "iconIdx": 35 }, { "icon": { @@ -703,8 +907,10 @@ "tags": [ "pointer left" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 22, "id": 20, @@ -713,8 +919,9 @@ "name": "pointer-left", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 30 + "setIdx": 0, + "setId": 1, + "iconIdx": 36 }, { "icon": { @@ -724,8 +931,10 @@ "tags": [ "flag" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 23, "id": 12, @@ -734,8 +943,9 @@ "name": "flag", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 31 + "setIdx": 0, + "setId": 1, + "iconIdx": 37 }, { "icon": { @@ -745,8 +955,10 @@ "tags": [ "expand" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 24, "id": 11, @@ -755,8 +967,9 @@ "name": "expand", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 32 + "setIdx": 0, + "setId": 1, + "iconIdx": 38 }, { "icon": { @@ -767,8 +980,10 @@ "tags": [ "envelope" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 25, "id": 10, @@ -777,8 +992,9 @@ "name": "envelope", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 33 + "setIdx": 0, + "setId": 1, + "iconIdx": 39 }, { "icon": { @@ -788,8 +1004,10 @@ "tags": [ "compare" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 26, "id": 9, @@ -798,8 +1016,9 @@ "name": "compare-full", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 34 + "setIdx": 0, + "setId": 1, + "iconIdx": 40 }, { "icon": { @@ -809,8 +1028,10 @@ "tags": [ "comment" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 27, "id": 7, @@ -819,8 +1040,9 @@ "name": "comment", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 35 + "setIdx": 0, + "setId": 1, + "iconIdx": 41 }, { "icon": { @@ -830,8 +1052,10 @@ "tags": [ "up" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 28, "id": 34, @@ -840,8 +1064,9 @@ "name": "up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 36 + "setIdx": 0, + "setId": 1, + "iconIdx": 42 }, { "icon": { @@ -851,8 +1076,10 @@ "tags": [ "down" ], - "grid": 32 + "grid": 32, + "attrs": [] }, + "attrs": [], "properties": { "order": 29, "id": 33, @@ -861,8 +1088,9 @@ "name": "down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 37 + "setIdx": 0, + "setId": 1, + "iconIdx": 43 } ], "height": 1024, @@ -889,6 +1117,8 @@ "historySize": 100, "showCodes": true, "search": "", - "gridSize": 16 + "gridSize": 16, + "showQuickUse2": true, + "showSVGs": true } } \ No newline at end of file diff --git a/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php b/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php index f8ef77f8e297b3bdf6a41c501c70adb40d31db99..0f49b8bef0ae3f56dfff91db4c9ae8cc25f371c4 100644 --- a/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php +++ b/dev/tests/api-functional/testsuite/Magento/CatalogInventory/Api/StockItemTest.php @@ -29,7 +29,12 @@ class StockItemTest extends WebapiAbstract /** * Resource path */ - const RESOURCE_PATH = '/V1/stockItems'; + const RESOURCE_GET_PATH = '/V1/stockItems'; + + /** + * Resource path + */ + const RESOURCE_PUT_PATH = '/V1/products/:productSku/stockItems/:itemId'; /** @var \Magento\Catalog\Model\Resource\Product\Collection */ protected $productCollection; @@ -73,7 +78,7 @@ class StockItemTest extends WebapiAbstract $productSku = 'simple1'; $serviceInfo = [ 'rest' => [ - 'resourcePath' => self::RESOURCE_PATH . "/$productSku", + 'resourcePath' => self::RESOURCE_GET_PATH . "/$productSku", 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, ], 'soap' => [ @@ -100,9 +105,13 @@ class StockItemTest extends WebapiAbstract { $stockItemOld = $this->getStockItemBySku($fixtureData); $productSku = 'simple1'; + $itemId = $stockItemOld['item_id']; + + $resourcePath = str_replace([':productSku', ':itemId'], [$productSku, $itemId], self::RESOURCE_PUT_PATH); + $serviceInfo = [ 'rest' => [ - 'resourcePath' => self::RESOURCE_PATH . "/$productSku", + 'resourcePath' => $resourcePath, 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT, ], 'soap' => [ diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php index 2779a7f88a11bb648a963962033bb28cd7341f74..25731e25eb92fb18463be4388b47a6678f6d4971 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php @@ -3,9 +3,10 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\GiftMessage\Api; +// @codingStandardsIgnoreFile + use Magento\TestFramework\TestCase\WebapiAbstract; class CartRepositoryTest extends WebapiAbstract @@ -26,6 +27,8 @@ class CartRepositoryTest extends WebapiAbstract /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled */ public function testGet() { @@ -60,6 +63,42 @@ class CartRepositoryTest extends WebapiAbstract $this->assertEquals($expectedMessage, $resultMessage); } + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_customer_and_message.php + */ + public function testGetForMyCart() + { + $this->_markTestAsRestOnly(); + + // get customer ID token + /** @var \Magento\Integration\Api\CustomerTokenServiceInterface $customerTokenService */ + $customerTokenService = $this->objectManager->create( + 'Magento\Integration\Api\CustomerTokenServiceInterface' + ); + $token = $customerTokenService->createCustomerAccessToken('customer@example.com', 'password'); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . 'mine/gift-message', + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + 'token' => $token, + ], + ]; + + $expectedMessage = [ + 'recipient' => 'Mercutio', + 'sender' => 'Romeo', + 'message' => 'I thought all for the best.', + ]; + + $requestData = []; + $resultMessage = $this->_webApiCall($serviceInfo, $requestData); + $this->assertCount(5, $resultMessage); + unset($resultMessage['gift_message_id']); + unset($resultMessage['customer_id']); + $this->assertEquals($expectedMessage, $resultMessage); + } + /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php */ @@ -102,4 +141,50 @@ class CartRepositoryTest extends WebapiAbstract $this->assertEquals('Jane Roe', $message->getSender()); $this->assertEquals('Gift Message Text New', $message->getMessage()); } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + */ + public function testSaveForMyCart() + { + $this->_markTestAsRestOnly(); + + // get customer ID token + /** @var \Magento\Integration\Api\CustomerTokenServiceInterface $customerTokenService */ + $customerTokenService = $this->objectManager->create( + 'Magento\Integration\Api\CustomerTokenServiceInterface' + ); + $token = $customerTokenService->createCustomerAccessToken('customer@example.com', 'password'); + + // sales/gift_options/allow_order must be set to 1 in system configuration + // @todo remove next statement when \Magento\TestFramework\TestCase\WebapiAbstract::_updateAppConfig is fixed + $this->markTestIncomplete('This test relies on system configuration state.'); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . 'mine/gift-message', + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, + 'token' => $token, + ], + ]; + + $requestData = [ + 'giftMessage' => [ + 'recipient' => 'John Doe', + 'sender' => 'Jane Roe', + 'message' => 'Gift Message Text New', + ], + ]; + $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); + + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $quote->getGiftMessageId(); + /** @var \Magento\GiftMessage\Model\Message $message */ + $message = $this->objectManager->create('Magento\GiftMessage\Model\Message')->load($quote->getGiftMessageId()); + $this->assertEquals('John Doe', $message->getRecipient()); + $this->assertEquals('Jane Roe', $message->getSender()); + $this->assertEquals('Gift Message Text New', $message->getMessage()); + } } diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2d2da9d2ff9a6ccc7a139787152be21671897341 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php @@ -0,0 +1,122 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Api; + +// @codingStandardsIgnoreFile + +use Magento\TestFramework\TestCase\WebapiAbstract; + +class GuestCartRepositoryTest extends WebapiAbstract +{ + const SERVICE_VERSION = 'V1'; + const SERVICE_NAME = 'giftMessageGuestCartRepositoryV1'; + const RESOURCE_PATH = '/V1/guest-carts/'; + + /** + * @var \Magento\TestFramework\ObjectManager + */ + protected $objectManager; + + protected function setUp() + { + $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled + */ + public function testGet() + { + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('message_order_21', 'reserved_order_id'); + $cartId = $quote->getId(); + /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ + $quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); + $quoteIdMask->load($cartId, 'quote_id'); + //Use masked cart Id + $cartId = $quoteIdMask->getMaskedId(); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . $cartId . '/gift-message', + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + ], + 'soap' => [ + 'service' => self::SERVICE_NAME, + 'serviceVersion' => self::SERVICE_VERSION, + 'operation' => self::SERVICE_NAME . 'Get', + ], + ]; + + $expectedMessage = [ + 'recipient' => 'Mercutio', + 'sender' => 'Romeo', + 'message' => 'I thought all for the best.', + ]; + + $requestData = ["cartId" => $cartId]; + $resultMessage = $this->_webApiCall($serviceInfo, $requestData); + $this->assertCount(5, $resultMessage); + unset($resultMessage['gift_message_id']); + unset($resultMessage['customer_id']); + $this->assertEquals($expectedMessage, $resultMessage); + } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + */ + public function testSave() + { + // sales/gift_options/allow_order must be set to 1 in system configuration + // @todo remove next statement when \Magento\TestFramework\TestCase\WebapiAbstract::_updateAppConfig is fixed + $this->markTestIncomplete('This test relies on system configuration state.'); + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $cartId = $quote->getId(); + /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ + $quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); + $quoteIdMask->load($cartId, 'quote_id'); + //Use masked cart Id + $cartId = $quoteIdMask->getMaskedId(); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . $cartId . '/gift-message', + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, + ], + 'soap' => [ + 'service' => self::SERVICE_NAME, + 'serviceVersion' => self::SERVICE_VERSION, + 'operation' => self::SERVICE_NAME . 'Save', + ], + ]; + + $requestData = [ + 'cartId' => $cartId, + 'giftMessage' => [ + 'recipient' => 'John Doe', + 'sender' => 'Jane Roe', + 'message' => 'Gift Message Text New', + ], + ]; + $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $quote->getGiftMessageId(); + /** @var \Magento\GiftMessage\Model\Message $message */ + $message = $this->objectManager->create('Magento\GiftMessage\Model\Message')->load($quote->getGiftMessageId()); + $this->assertEquals('John Doe', $message->getRecipient()); + $this->assertEquals('Jane Roe', $message->getSender()); + $this->assertEquals('Gift Message Text New', $message->getMessage()); + } +} diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..c749c3b39eeca5c3858f1b52b7eab71e309067e7 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php @@ -0,0 +1,130 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Api; + +// @codingStandardsIgnoreFile + +use Magento\TestFramework\TestCase\WebapiAbstract; + +class GuestItemRepositoryTest extends WebapiAbstract +{ + const SERVICE_VERSION = 'V1'; + const SERVICE_NAME = 'giftMessageGuestItemRepositoryV1'; + const RESOURCE_PATH = '/V1/guest-carts/'; + + /** + * @var \Magento\TestFramework\ObjectManager + */ + protected $objectManager; + + protected function setUp() + { + $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled + */ + public function testGet() + { + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $product = $this->objectManager->create('Magento\Catalog\Model\Product'); + $product->load($product->getIdBySku('simple_with_message')); + $itemId = $quote->getItemByProduct($product)->getId(); + /** @var \Magento\Catalog\Model\Product $product */ + $cartId = $quote->getId(); + /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ + $quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); + $quoteIdMask->load($cartId, 'quote_id'); + //Use masked cart Id + $cartId = $quoteIdMask->getMaskedId(); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . $cartId . '/gift-message/' . $itemId, + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + ], + 'soap' => [ + 'service' => self::SERVICE_NAME, + 'serviceVersion' => self::SERVICE_VERSION, + 'operation' => self::SERVICE_NAME . 'Get', + ], + ]; + + $expectedMessage = [ + 'recipient' => 'Jane Roe', + 'sender' => 'John Doe', + 'message' => 'Gift Message Text', + ]; + + $requestData = ["cartId" => $cartId, "itemId" => $itemId]; + $resultMessage = $this->_webApiCall($serviceInfo, $requestData); + $this->assertCount(5, $resultMessage); + unset($resultMessage['gift_message_id']); + unset($resultMessage['customer_id']); + $this->assertEquals($expectedMessage, $resultMessage); + } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + */ + public function testSave() + { + // sales/gift_options/allow_items must be set to 1 in system configuration + // @todo remove next statement when \Magento\TestFramework\TestCase\WebapiAbstract::_updateAppConfig is fixed + $this->markTestIncomplete('This test relies on system configuration state.'); + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $product = $this->objectManager->create('Magento\Catalog\Model\Product'); + $product->load($product->getIdBySku('simple_with_message')); + $itemId = $quote->getItemByProduct($product)->getId(); + $cartId = $quote->getId(); + /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ + $quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); + $quoteIdMask->load($cartId, 'quote_id'); + //Use masked cart Id + $cartId = $quoteIdMask->getMaskedId(); + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . $cartId . '/gift-message/' . $itemId, + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, + ], + 'soap' => [ + 'service' => self::SERVICE_NAME, + 'serviceVersion' => self::SERVICE_VERSION, + 'operation' => self::SERVICE_NAME . 'Save', + ], + ]; + + $requestData = [ + 'cartId' => $cartId, + 'itemId' => $itemId, + 'giftMessage' => [ + 'recipient' => 'John Doe', + 'sender' => 'Jane Roe', + 'message' => 'Gift Message Text New', + ], + ]; + $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); +// $quote->load('test_order_item_with_message', 'reserved_order_id'); + $messageId = $quote->getItemByProduct($product)->getGiftMessageId(); + /** @var \Magento\GiftMessage\Model\Message $message */ + $message = $this->objectManager->create('Magento\GiftMessage\Model\Message')->load($messageId); + $this->assertEquals('John Doe', $message->getRecipient()); + $this->assertEquals('Jane Roe', $message->getSender()); + $this->assertEquals('Gift Message Text New', $message->getMessage()); + } +} diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php index 3673cb930e82da642a39cdbfded396f829bc1b4a..2dbc24cb67a17afde0f586df5ddab0f3a382aba3 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php @@ -3,11 +3,10 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ +namespace Magento\GiftMessage\Api; // @codingStandardsIgnoreFile -namespace Magento\GiftMessage\Api; - use Magento\TestFramework\TestCase\WebapiAbstract; class ItemRepositoryTest extends WebapiAbstract @@ -28,6 +27,8 @@ class ItemRepositoryTest extends WebapiAbstract /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled */ public function testGet() { @@ -65,6 +66,49 @@ class ItemRepositoryTest extends WebapiAbstract $this->assertEquals($expectedMessage, $resultMessage); } + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + */ + public function testGetForMyCart() + { + $this->_markTestAsRestOnly(); + + // get customer ID token + /** @var \Magento\Integration\Api\CustomerTokenServiceInterface $customerTokenService */ + $customerTokenService = $this->objectManager->create( + 'Magento\Integration\Api\CustomerTokenServiceInterface' + ); + $token = $customerTokenService->createCustomerAccessToken('customer@example.com', 'password'); + + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $product = $this->objectManager->create('Magento\Catalog\Model\Product'); + $product->load($product->getIdBySku('simple_with_message')); + $itemId = $quote->getItemByProduct($product)->getId(); + /** @var \Magento\Catalog\Model\Product $product */ + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . 'mine/gift-message/' . $itemId, + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + 'token' => $token, + ], + ]; + + $expectedMessage = [ + 'recipient' => 'Jane Roe', + 'sender' => 'John Doe', + 'message' => 'Gift Message Text', + ]; + + $requestData = ["itemId" => $itemId]; + $resultMessage = $this->_webApiCall($serviceInfo, $requestData); + $this->assertCount(5, $resultMessage); + unset($resultMessage['gift_message_id']); + unset($resultMessage['customer_id']); + $this->assertEquals($expectedMessage, $resultMessage); + } + /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php */ @@ -102,6 +146,55 @@ class ItemRepositoryTest extends WebapiAbstract ], ]; $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); +// $quote->load('test_order_item_with_message', 'reserved_order_id'); + $messageId = $quote->getItemByProduct($product)->getGiftMessageId(); + /** @var \Magento\GiftMessage\Model\Message $message */ + $message = $this->objectManager->create('Magento\GiftMessage\Model\Message')->load($messageId); + $this->assertEquals('John Doe', $message->getRecipient()); + $this->assertEquals('Jane Roe', $message->getSender()); + $this->assertEquals('Gift Message Text New', $message->getMessage()); + } + + /** + * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + */ + public function testSaveForMyCart() + { + $this->_markTestAsRestOnly(); + + // get customer ID token + /** @var \Magento\Integration\Api\CustomerTokenServiceInterface $customerTokenService */ + $customerTokenService = $this->objectManager->create( + 'Magento\Integration\Api\CustomerTokenServiceInterface' + ); + $token = $customerTokenService->createCustomerAccessToken('customer@example.com', 'password'); + + // sales/gift_options/allow_items must be set to 1 in system configuration + // @todo remove next statement when \Magento\TestFramework\TestCase\WebapiAbstract::_updateAppConfig is fixed + $this->markTestIncomplete('This test relies on system configuration state.'); + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $this->objectManager->create('Magento\Quote\Model\Quote'); + $quote->load('test_order_item_with_message', 'reserved_order_id'); + $product = $this->objectManager->create('Magento\Catalog\Model\Product'); + $product->load($product->getIdBySku('simple_with_message')); + $itemId = $quote->getItemByProduct($product)->getId(); + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . 'mine/gift-message/' . $itemId, + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, + 'token' => $token, + ], + ]; + + $requestData = [ + 'itemId' => $itemId, + 'giftMessage' => [ + 'recipient' => 'John Doe', + 'sender' => 'Jane Roe', + 'message' => 'Gift Message Text New', + ], + ]; + $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); // $quote->load('test_order_item_with_message', 'reserved_order_id'); $messageId = $quote->getItemByProduct($product)->getGiftMessageId(); /** @var \Magento\GiftMessage\Model\Message $message */ diff --git a/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php b/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php index 5e31104da1607a3d8da4b3e1dd3f497138b58796..993a369782eca345eb717089573788b800f548e2 100644 --- a/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php @@ -13,6 +13,7 @@ use Magento\TestFramework\Helper\Bootstrap; use Magento\TestFramework\TestCase\WebapiAbstract; use Magento\User\Model\User as UserModel; use Magento\Framework\Webapi\Exception as HTTPExceptionCodes; +use Magento\Integration\Model\Resource\Oauth\Token\CollectionFactory; /** * api-functional test for \Magento\Integration\Model\CustomerTokenService. @@ -35,9 +36,9 @@ class CustomerTokenServiceTest extends WebapiAbstract private $customerAccountManagement; /** - * @var TokenModel + * @var CollectionFactory */ - private $tokenModel; + private $tokenCollection; /** * @var UserModel @@ -54,7 +55,10 @@ class CustomerTokenServiceTest extends WebapiAbstract $this->customerAccountManagement = Bootstrap::getObjectManager()->get( 'Magento\Customer\Api\AccountManagementInterface' ); - $this->tokenModel = Bootstrap::getObjectManager()->get('Magento\Integration\Model\Oauth\Token'); + $tokenCollectionFactory = Bootstrap::getObjectManager()->get( + 'Magento\Integration\Model\Resource\Oauth\Token\CollectionFactory' + ); + $this->tokenCollection = $tokenCollectionFactory->create(); $this->userModel = Bootstrap::getObjectManager()->get('Magento\User\Model\User'); } @@ -65,6 +69,7 @@ class CustomerTokenServiceTest extends WebapiAbstract { $customerUserName = 'customer@example.com'; $password = 'password'; + $isTokenCorrect = false; $serviceInfo = [ 'rest' => [ @@ -76,9 +81,17 @@ class CustomerTokenServiceTest extends WebapiAbstract $accessToken = $this->_webApiCall($serviceInfo, $requestData); $customerData = $this->customerAccountManagement->authenticate($customerUserName, $password); - /** @var $token TokenModel */ - $token = $this->tokenModel->loadByCustomerId($customerData->getId())->getToken(); - $this->assertEquals($accessToken, $token); + + /** @var $this->tokenCollection \Magento\Integration\Model\Resource\Oauth\Token\Collection */ + $this->tokenCollection->addFilterByCustomerId($customerData->getId()); + + foreach ($this->tokenCollection->getItems() as $item) { + /** @var $item TokenModel */ + if ($item->getToken() == $accessToken) { + $isTokenCorrect = true; + } + } + $this->assertTrue($isTokenCorrect); } /** diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php index 81e31a383e320ca22678568f04b40357cf73310f..e9c79011e8a6d7bc73b4cf8899561cac1f36f188 100755 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php @@ -113,7 +113,7 @@ class View extends AbstractConfigureBlock protected $clickAddToCompare = '.action.tocompare'; /** - * "Add to Wishlist" button. + * Locator value for "Add to Wish List" button. * * @var string */ @@ -353,7 +353,7 @@ class View extends AbstractConfigureBlock } /** - * Click "Add to Wishlist" button. + * Click "Add to Wish List". * * @return void */ diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSuccessDeleteMessage.php index a18ca9cdd59ee27cd572a3bdda768a93db5cf09e..e41e1b4ab6dd1a5990d28626bb999524a6c87fdc 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductAttributeSuccessDeleteMessage.php @@ -15,10 +15,10 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertProductAttributeSuccessDeleteMessage extends AbstractConstraint { - const SUCCESS_MESSAGE = 'The product attribute has been deleted.'; + const SUCCESS_MESSAGE = 'You deleted the product attribute.'; /** - * Assert that message "The product attribute has been deleted." is present on Attribute page + * Assert that message "You deleted the product attribute." is present on Attribute page * * @param CatalogProductAttributeIndex $attributeIndex * @return void diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateForm.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateForm.php index f457daa89747c78c817e4855f4beb80fe6a3c41a..4a634c7d23dec5d00566c6e59a9254800b0a1eb2 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateForm.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateForm.php @@ -43,7 +43,7 @@ class AssertProductTemplateForm extends AbstractConstraint \PHPUnit_Framework_Assert::assertEquals( $filterAttribute['set_name'], $productSetEdit->getAttributeSetEditBlock()->getAttributeSetName(), - 'Attribute Set not found' + 'Product Template not found' . "\nExpected: " . $filterAttribute['set_name'] . "\nActual: " . $productSetEdit->getAttributeSetEditBlock()->getAttributeSetName() ); diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateInGrid.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateInGrid.php index 5e8a4e080349d65cd94999a63284e3e752f8f30a..281327b9f8c921784306d09d87b935261a42b5d5 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateInGrid.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateInGrid.php @@ -32,7 +32,7 @@ class AssertProductTemplateInGrid extends AbstractConstraint $productSetPage->open(); \PHPUnit_Framework_Assert::assertTrue( $productSetPage->getGrid()->isRowVisible($filterAttributeSet), - 'Attribute Set \'' . $filterAttributeSet['set_name'] . '\' is absent in Product Template grid.' + 'Product Template \'' . $filterAttributeSet['set_name'] . '\' is absent in Product Template grid.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateNotInGrid.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateNotInGrid.php index 6169fe31598de123aae474096bae79fa584ccfab..02d8435fb2585e5c0372f07c1b52f20a5ce8b8ed 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateNotInGrid.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateNotInGrid.php @@ -36,7 +36,7 @@ class AssertProductTemplateNotInGrid extends AbstractConstraint $productSetPage->open(); \PHPUnit_Framework_Assert::assertFalse( $productSetPage->getGrid()->isRowVisible($filterAttributeSet), - 'Attribute Set with name "' . $filterAttributeSet['set_name'] . '" is present in Product Template grid.' + 'An attribute set named "' . $filterAttributeSet['set_name'] . '" is present in Product Template grid.' ); } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateOnProductForm.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateOnProductForm.php index e1aba5f1afee733c99d1e4427be77bb432136f3c..86ef5f1742097b12b5f19e29c41afedef30900ba 100755 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateOnProductForm.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateOnProductForm.php @@ -66,7 +66,7 @@ class AssertProductTemplateOnProductForm extends AbstractConstraint \PHPUnit_Framework_Assert::assertEquals( $attributeSet->getAttributeSetName(), $formAttributeSet, - 'Attribute Set not found on Product form.' + 'Product Template not found on Product form.' . "\nExpected: " . $attributeSet->getAttributeSetName() . "\nActual: " . $formAttributeSet ); @@ -88,6 +88,6 @@ class AssertProductTemplateOnProductForm extends AbstractConstraint */ public function toString() { - return 'Product Attribute and Attribute Set are present on the Product form.'; + return 'Product Attribute and Product Template are present on the Product form.'; } } diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessDeleteMessage.php index a17b7771168651a0ace9141ddfb0e78525d11f25..43cff91896a5373c3641bb780978fddf1ff44407 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessDeleteMessage.php @@ -18,7 +18,7 @@ class AssertProductTemplateSuccessDeleteMessage extends AbstractConstraint /** * Text value to be checked */ - const SUCCESS_DELETE_MESSAGE = 'The attribute set has been removed.'; + const SUCCESS_DELETE_MESSAGE = 'The product template has been removed.'; /** * Assert that after deleting product template success delete message appears diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessSaveMessage.php index b12adf4ec6d55062749a2a121d311162bfc69556..457cac5b7082e897686f71f98b0571d0c070962e 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductTemplateSuccessSaveMessage.php @@ -18,7 +18,7 @@ class AssertProductTemplateSuccessSaveMessage extends AbstractConstraint /** * Text value to be checked */ - const SUCCESS_MESSAGE = 'You saved the attribute set.'; + const SUCCESS_MESSAGE = 'You saved the product template.'; /** * Assert that after save a product template "You saved the attribute set." successful message appears diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AbstractCompareProductsTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AbstractCompareProductsTest.php index 94ab4152c7bc58b8d1eeaf577ea798268ace721f..ed44c17d572bdd9db17cfa213bbd0b1916d2854c 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AbstractCompareProductsTest.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/AbstractCompareProductsTest.php @@ -122,8 +122,8 @@ abstract class AbstractCompareProductsTest extends Injectable */ protected function loginCustomer() { - if (!$this->cmsIndex->getLinksBlock()->isLinkVisible('Log Out')) { - $this->cmsIndex->getLinksBlock()->openLink("Log In"); + if (!$this->cmsIndex->getLinksBlock()->isLinkVisible('Sign Out')) { + $this->cmsIndex->getLinksBlock()->openLink("Sign In"); $this->customerAccountLogin->getLoginBlock()->login($this->customer); } } diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleNoticeMessage.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleNoticeMessage.php index b2bfa44e709845c293d02b4982813881206189cc..8609e5acd331b1c9e4b318ba7ed3a74c13010768 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleNoticeMessage.php +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleNoticeMessage.php @@ -14,11 +14,11 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertCatalogPriceRuleNoticeMessage extends AbstractConstraint { - const NOTICE_MESSAGE_RULES = 'There are rules that have been changed but were not applied.'; + const NOTICE_MESSAGE_RULES = 'We found updated rules that are not applied.'; const NOTICE_MESSAGE_APPLY = ' Please, click Apply Rules in order to see immediate effect in the catalog.'; /** - * Assert that message "There are rules that have been changed but were not applied..." + * Assert that message "We found updated rules that are not applied..." * is present on page after Save (without applying Rule) * or after Edit (without applying Rule) action on the Catalog Price Rules page. * diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessDeleteMessage.php index 58ec4e806350146e146ae018acec5eeec4ccba43..f8531c5540c3ff4acb4dd8bdff33042766153cec 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessDeleteMessage.php @@ -14,10 +14,10 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertCatalogPriceRuleSuccessDeleteMessage extends AbstractConstraint { - const SUCCESS_DELETE_MESSAGE = 'The rule has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the rule.'; /** - * Assert that message "The rule has been deleted." is appeared on Catalog Price Rules page. + * Assert that message "You deleted the rule." is appeared on Catalog Price Rules page. * * @param CatalogRuleIndex $pageCatalogRuleIndex * @return void diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessSaveMessage.php index ef3f54ac988225a9dfdb2a907f8af764cbe1cecb..a1cdb0e31bd9f1ebb4e32b957d011af5dd4224f4 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleSuccessSaveMessage.php @@ -14,7 +14,7 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertCatalogPriceRuleSuccessSaveMessage extends AbstractConstraint { - const SUCCESS_MESSAGE = 'The rule has been saved.'; + const SUCCESS_MESSAGE = 'You saved the rule.'; /** * Assert that success message is displayed after Catalog Price Rule saved diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Fixture/CatalogRule.xml b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Fixture/CatalogRule.xml index 88c2147c46a54c83273e0ebe386af6f4e3bf39a9..f76cebd5e059c921b0f734c37a913239f559fd32 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Fixture/CatalogRule.xml +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Fixture/CatalogRule.xml @@ -17,7 +17,7 @@ <field name="customer_group_ids" xsi:type="array"> <item name="0" xsi:type="string">NOT LOGGED IN</item> </field> - <field name="simple_action" xsi:type="string">By Percentage of the Original Price</field> + <field name="simple_action" xsi:type="string">Apply as percentage of original</field> <field name="discount_amount" xsi:type="string">50</field> </dataset> <field name="name" is_required="1" group="rule_information"> @@ -46,7 +46,7 @@ <default_value xsi:type="null"/> </field> <field name="simple_action" is_required="0" group="actions"> - <default_value xsi:type="string">By Percentage of the Original Price</default_value> + <default_value xsi:type="string">Apply as percentage of original</default_value> </field> <field name="discount_amount" is_required="1" group="actions"> <default_value xsi:type="number">50</default_value> diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Handler/CatalogRule/Curl.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Handler/CatalogRule/Curl.php index 3425b84fc72e4455413eb35f7017f68380540c5c..8ebd1ad9f3a8453799f549ddb2d5d4ad22d54604 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Handler/CatalogRule/Curl.php +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Handler/CatalogRule/Curl.php @@ -43,10 +43,10 @@ class Curl extends Conditions implements CatalogRuleInterface */ protected $mappingData = [ 'simple_action' => [ - 'By Percentage of the Original Price' => 'by_percent', - 'By Fixed Amount' => 'by_fixed', - 'To Percentage of the Original Price' => 'to_percent', - 'To Fixed Amount' => 'to_fixed', + 'Apply as percentage of original' => 'by_percent', + 'Apply as fixed amount' => 'by_fixed', + 'Adjust final price to this percentage' => 'to_percent', + 'Adjust final price to discount value' => 'to_fixed', ], 'is_active' => [ 'Active' => 1, diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Repository/CatalogRule.xml b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Repository/CatalogRule.xml index be8f327ca8f1e9e6c4c3f54ca14776401dda2341..1991317d9d1aa12995023e96e0699c8cc1d1a662 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Repository/CatalogRule.xml +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Repository/CatalogRule.xml @@ -23,7 +23,7 @@ <field name="from_date" xsi:type="string">3/25/14</field> <field name="to_date" xsi:type="string">3/29/14</field> <field name="sort_order" xsi:type="string">1</field> - <field name="simple_action" xsi:type="string">By Percentage of the Original Price</field> + <field name="simple_action" xsi:type="string">Apply as percentage of original</field> <field name="discount_amount" xsi:type="string">50</field> </dataset> @@ -36,7 +36,7 @@ <field name="customer_group_ids" xsi:type="array"> <item name="0" xsi:type="string">NOT LOGGED IN</item> </field> - <field name="simple_action" xsi:type="string">By Percentage of the Original Price</field> + <field name="simple_action" xsi:type="string">Apply as percentage of original</field> <field name="discount_amount" xsi:type="string">50</field> </dataset> @@ -54,7 +54,7 @@ <item name="3" xsi:type="string">Retailer</item> </field> <field name="rule" xsi:type="string">[Category|is|2]</field> - <field name="simple_action" xsi:type="string">By Percentage of the Original Price</field> + <field name="simple_action" xsi:type="string">Apply as percentage of original</field> <field name="discount_amount" xsi:type="string">10</field> </dataset> @@ -69,13 +69,13 @@ <item name="0" xsi:type="string">NOT LOGGED IN</item> </field> <field name="sort_order" xsi:type="string">0</field> - <field name="simple_action" xsi:type="string">By Percentage of the Original Price</field> + <field name="simple_action" xsi:type="string">Apply as percentage of original</field> <field name="discount_amount" xsi:type="string">50</field> </dataset> <dataset name="catalog_price_rule_priority_1_stop_further_rules"> <field name="name" xsi:type="string">catalog_price_rule_priority_1_stop_further_rules</field> - <field name="description" xsi:type="string">Priority 1, -5 By fixed amount</field> + <field name="description" xsi:type="string">Priority 1, -5 Apply as fixed amount</field> <field name="is_active" xsi:type="string">Active</field> <field name="website_ids" xsi:type="array"> <item name="0" xsi:type="string">Main Website</item> @@ -84,14 +84,14 @@ <item name="0" xsi:type="string">NOT LOGGED IN</item> </field> <field name="sort_order" xsi:type="string">1</field> - <field name="simple_action" xsi:type="string">By Fixed Amount</field> + <field name="simple_action" xsi:type="string">Apply as fixed amount</field> <field name="discount_amount" xsi:type="string">5</field> <field name="stop_rules_processing" xsi:type="string">Yes</field> </dataset> <dataset name="catalog_price_rule_priority_2"> <field name="name" xsi:type="string">catalog_price_rule_priority_2</field> - <field name="description" xsi:type="string">Priority 2, -10 By fixed amount</field> + <field name="description" xsi:type="string">Priority 2, -10 Apply as fixed amount</field> <field name="is_active" xsi:type="string">Active</field> <field name="website_ids" xsi:type="array"> <item name="0" xsi:type="string">Main Website</item> @@ -100,7 +100,7 @@ <item name="0" xsi:type="string">NOT LOGGED IN</item> </field> <field name="sort_order" xsi:type="string">2</field> - <field name="simple_action" xsi:type="string">By Fixed Amount</field> + <field name="simple_action" xsi:type="string">Apply as fixed amount</field> <field name="discount_amount" xsi:type="string">10</field> </dataset> @@ -118,7 +118,7 @@ <item name="3" xsi:type="string">Retailer</item> </field> <field name="sort_order" xsi:type="string">0</field> - <field name="simple_action" xsi:type="string">By Percentage of the Original Price</field> + <field name="simple_action" xsi:type="string">Apply as percentage of original</field> <field name="discount_amount" xsi:type="string">50</field> </dataset> </repository> diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogPriceRuleEntityTest.xml b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogPriceRuleEntityTest.xml index 9a55206423b6e658c7a877ce563c9d280224e45a..86f7da0d73c0ad5701f386ece3e2f9ff8b89cc69 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogPriceRuleEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogPriceRuleEntityTest.xml @@ -14,7 +14,7 @@ <data name="catalogPriceRule/data/website_ids/option_0" xsi:type="string">Main Website</data> <data name="catalogPriceRule/data/customer_group_ids/option_0" xsi:type="string">Wholesale</data> <data name="catalogPriceRule/data/condition" xsi:type="string">-</data> - <data name="catalogPriceRule/data/simple_action" xsi:type="string">By Percentage of the Original Price</data> + <data name="catalogPriceRule/data/simple_action" xsi:type="string">Apply as percentage of original</data> <data name="catalogPriceRule/data/discount_amount" xsi:type="string">50</data> <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleSuccessSaveMessage"/> <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleNoticeMessage"/> @@ -28,7 +28,7 @@ <data name="catalogPriceRule/data/website_ids/option_0" xsi:type="string">Main Website</data> <data name="catalogPriceRule/data/customer_group_ids/option_0" xsi:type="string">General</data> <data name="catalogPriceRule/data/condition" xsi:type="string">-</data> - <data name="catalogPriceRule/data/simple_action" xsi:type="string">By Fixed Amount</data> + <data name="catalogPriceRule/data/simple_action" xsi:type="string">Apply as fixed amount</data> <data name="catalogPriceRule/data/discount_amount" xsi:type="string">10</data> <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleSuccessSaveMessage"/> <constraint name="Magento\CatalogRule\Test\Constraint\AssertCatalogPriceRuleNoticeMessage"/> diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.xml b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.xml index 91556d40fba7f2d537452532882bb22c75ca265a..22d58096d2cebe4e89e5c9687d411a6fc79e45d3 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.xml +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/CreateCatalogRuleTest.xml @@ -14,7 +14,7 @@ <data name="catalogPriceRule/data/website_ids" xsi:type="string">Main Website</data> <data name="catalogPriceRule/data/customer_group_ids" xsi:type="string">NOT LOGGED IN</data> <data name="catalogPriceRule/data/conditions" xsi:type="string">[Category|is|%category_1%]</data> - <data name="catalogPriceRule/data/simple_action" xsi:type="string">To Percentage of the Original Price</data> + <data name="catalogPriceRule/data/simple_action" xsi:type="string">Adjust final price to this percentage</data> <data name="catalogPriceRule/data/discount_amount" xsi:type="string">90</data> <data name="cartPrice/sub_total" xsi:type="string">90</data> <data name="cartPrice/grand_total" xsi:type="string">90</data> @@ -35,7 +35,7 @@ <data name="catalogPriceRule/data/is_active" xsi:type="string">Active</data> <data name="catalogPriceRule/data/website_ids" xsi:type="string">Main Website</data> <data name="catalogPriceRule/data/conditions" xsi:type="string">[Category|is|%category_1%]</data> - <data name="catalogPriceRule/data/simple_action" xsi:type="string">By Percentage of the Original Price</data> + <data name="catalogPriceRule/data/simple_action" xsi:type="string">Apply as percentage of original</data> <data name="catalogPriceRule/data/discount_amount" xsi:type="string">50</data> <data name="cartPrice/sub_total" xsi:type="string">5</data> <data name="cartPrice/grand_total" xsi:type="string">5</data> diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/NavigateMenuTest.xml b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/NavigateMenuTest.xml index b3ba80fd8108654f103cdcad5f7d57353754acf3..5f8e83c2386ef6e50bc03453204ed1ac59e19290 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/NavigateMenuTest.xml +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/NavigateMenuTest.xml @@ -8,8 +8,8 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Backend\Test\TestCase\NavigateMenuTest"> <variation name="NavigateMenuTest14"> - <data name="menuItem" xsi:type="string">Marketing > Catalog Price Rules</data> - <data name="pageTitle" xsi:type="string">Catalog Price Rules</data> + <data name="menuItem" xsi:type="string">Marketing > Catalog Price Rule</data> + <data name="pageTitle" xsi:type="string">Catalog Price Rule</data> <constraint name="Magento\Backend\Test\Constraint\AssertBackendPageIsAvailable"/> </variation> </testCase> diff --git a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/UpdateCatalogPriceRuleEntityTest.xml b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/UpdateCatalogPriceRuleEntityTest.xml index 8ca777197b95712bb6cd7253f33d258120556b32..9f1e3a665ff224c329fc203ca9b01a24f9d0c91e 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/UpdateCatalogPriceRuleEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/TestCase/UpdateCatalogPriceRuleEntityTest.xml @@ -24,7 +24,7 @@ <data name="catalogPriceRule/data/description" xsi:type="string">New Catalog Price Rule Description %isolation%</data> <data name="catalogPriceRule/data/is_active" xsi:type="string">Active</data> <data name="catalogPriceRule/data/conditions" xsi:type="string">[Category|is|%category_1%]</data> - <data name="catalogPriceRule/data/simple_action" xsi:type="string">By Fixed Amount</data> + <data name="catalogPriceRule/data/simple_action" xsi:type="string">Apply as fixed amount</data> <data name="catalogPriceRule/data/discount_amount" xsi:type="string">35</data> <data name="saveAction" xsi:type="string">saveAndApply</data> <data name="cartPrice/sub_total" xsi:type="string">65</data> diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAdvancedSearchProductsResult.php b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAdvancedSearchProductsResult.php index fb9e01f128d7f076627a7f42f0c8cbecec02aaed..c0d52d294ef89510a72dd2bc52cd00c379980bd7 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAdvancedSearchProductsResult.php +++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAdvancedSearchProductsResult.php @@ -23,7 +23,7 @@ class AssertAdvancedSearchProductsResult extends AbstractConstraint /** * Text for error messages */ - const ERROR_MESSAGE = 'No items were found using the following search criteria.'; + const ERROR_MESSAGE = 'We can\'t find any items matching these search criteria.'; /** * Search results page diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/AbstractCartItem.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/AbstractCartItem.php index c2c64fd6903d8b877c8cf18dc0fc922e2970c98f..77da7feb3be502c4748b1c004629d470363e51fc 100644 --- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/AbstractCartItem.php +++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/AbstractCartItem.php @@ -40,7 +40,7 @@ class AbstractCartItem extends Block * * @var string */ - protected $qty = './/input[@type="number" and @title="Qty"]'; + protected $qty = './/input[@type="number" and @title="Quantity"]'; /** * Cart item sub-total xpath selector diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/CartItem.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/CartItem.php index 44de73078781de9aefbe259e80523cd9f2d1379c..ed337c38d0c4b8248a3d5a603762de27bb8c8091 100755 --- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/CartItem.php +++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/CartItem.php @@ -36,7 +36,7 @@ class CartItem extends AbstractCartItem protected $bundleOptions = './/dl[contains(@class, "item-options")]/dd[%d]/span[@class="price"][%d]'; /** - * 'Move to Wishlist' button + * Locator value for "Move to Wish List" button. * * @var string */ @@ -249,7 +249,7 @@ class CartItem extends AbstractCartItem } /** - * Click on move to wishlist button + * Click "Move to Wish List". * * @return void */ diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Login.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Login.php index c56571f76038fe764fc1522422e13013519705c1..c1688d50dc64a7445664cf59e1e0b1326a6bf6a4 100644 --- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Login.php +++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Login.php @@ -30,7 +30,7 @@ class Login extends Form protected $continue = '#onepage-guest-register-button'; /** - * 'Checkout as Guest' radio button + * Locator value for "Check Out as Guest" radio button. * * @var string */ diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessDeleteMessage.php index 0fc7096428d7443363872ed47f16beb1f6a6df8a..eb57e0ac4719d8257841954818bc18de7ad62d78 100644 --- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessDeleteMessage.php @@ -18,7 +18,7 @@ class AssertTermSuccessDeleteMessage extends AbstractConstraint /** * Success terms and conditions delete message */ - const SUCCESS_DELETE_MESSAGE = 'The condition has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the condition.'; /** * Assert that after deleting Term successful delete message appears. diff --git a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessSaveMessage.php index d497fc4c8889eba8511af543496429d8128cc11d..ba715ffa968962e59c6d8a4866341dd14fb1226a 100644 --- a/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/CheckoutAgreements/Test/Constraint/AssertTermSuccessSaveMessage.php @@ -18,7 +18,7 @@ class AssertTermSuccessSaveMessage extends AbstractConstraint /** * Success terms and conditions save message */ - const SUCCESS_SAVE_MESSAGE = 'The condition has been saved.'; + const SUCCESS_SAVE_MESSAGE = 'You saved the condition.'; /** * Assert that after save block successful message appears. diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockDeleteMessage.php index 36d25d1c49f55d3c81f424354a9fd9ea31804cfe..965b7fe07cc7b0eabce9f99a47f54cca093bcdd9 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockDeleteMessage.php @@ -14,7 +14,7 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertCmsBlockDeleteMessage extends AbstractConstraint { - const SUCCESS_DELETE_MESSAGE = 'The block has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the block.'; /** * Assert that after delete CMS block successful message appears. diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockSuccessSaveMessage.php index 615c4b06fb44ada65c869600fe41a1136dac543a..1c2696d6ed3c527b3d1cb0addc79095bf025342e 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsBlockSuccessSaveMessage.php @@ -14,7 +14,7 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertCmsBlockSuccessSaveMessage extends AbstractConstraint { - const SUCCESS_SAVE_MESSAGE = 'The block has been saved.'; + const SUCCESS_SAVE_MESSAGE = 'You saved the block.'; /** * Assert that after save block successful message appears. diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageSuccessSaveMessage.php index e047e5de15ac053c5bf948526f1ac2b317c7e729..c57528db3735163ef8a94fdf34e6370ddaf8426b 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageSuccessSaveMessage.php @@ -10,14 +10,14 @@ use Magento\Cms\Test\Page\Adminhtml\CmsPageIndex; use Magento\Mtf\Constraint\AbstractConstraint; /** - * Assert that after save a CMS page "The page has been saved." successful message appears. + * Assert that after save a CMS page "You saved this page." successful message appears. */ class AssertCmsPageSuccessSaveMessage extends AbstractConstraint { - const SUCCESS_SAVE_MESSAGE = 'The page has been saved.'; + const SUCCESS_SAVE_MESSAGE = 'You saved this page.'; /** - * Assert that after save a CMS page "The page has been saved." successful message appears. + * Assert that after save a CMS page "You saved this page." successful message appears. * * @param CmsPageIndex $cmsIndex * @return void diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Constraint/AssertCurrencySymbolSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Constraint/AssertCurrencySymbolSuccessSaveMessage.php index cba4716edd84187d85cadc248b2f13e9971b2c7e..912106f71bb7542d0f0ffb5339e73657b65d23f2 100644 --- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Constraint/AssertCurrencySymbolSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Constraint/AssertCurrencySymbolSuccessSaveMessage.php @@ -15,7 +15,7 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertCurrencySymbolSuccessSaveMessage extends AbstractConstraint { - const SUCCESS_SAVE_MESSAGE = 'The custom currency symbols were applied.'; + const SUCCESS_SAVE_MESSAGE = 'You applied the custom currency symbols.'; /** * Assert that after clicking on 'Save Currency Symbols' button success message appears. diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertAddressDeletedFrontend.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertAddressDeletedFrontend.php index 26fe078ecac2ede1d8cd20031d4a44efb09add9c..8568c75053e424470bef5cfd6dd9fd92f6e31e90 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertAddressDeletedFrontend.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertAddressDeletedFrontend.php @@ -18,7 +18,7 @@ class AssertAddressDeletedFrontend extends AbstractConstraint /** * Expected message */ - const EXPECTED_MESSAGE = 'You have no additional address entries in your address book.'; + const EXPECTED_MESSAGE = 'You have no other address entries in your address book.'; /** * Asserts that Asserts that 'Additional Address Entries' contains expected message diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertChangePasswordFailMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertChangePasswordFailMessage.php index c641ad3799725c363944252fcf8b915efef794f4..48c58b1c316d96ceedc389c57252ce684f91e05a 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertChangePasswordFailMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertChangePasswordFailMessage.php @@ -18,7 +18,7 @@ class AssertChangePasswordFailMessage extends AbstractConstraint /** * Fail message */ - const FAIL_MESSAGE = "Password doesn't match for this account."; + const FAIL_MESSAGE = 'The password doesn\'t match this account.'; /** * Assert that fail message is present diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerAddressSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerAddressSuccessSaveMessage.php index ab7ac43f7956c3ce63a90deb354fda0552e03f4d..9dbf30c353e9d1fde84b182da0a63f35123390b7 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerAddressSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerAddressSuccessSaveMessage.php @@ -18,7 +18,7 @@ class AssertCustomerAddressSuccessSaveMessage extends AbstractConstraint const SEVERITY = 'low'; /* end tags */ - const SUCCESS_MESSAGE = 'The address has been saved.'; + const SUCCESS_MESSAGE = 'You saved the address.'; /** * Asserts that success message equals to expected message diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessDeleteMessage.php index 8e90ae7bcaa894219082bccfd5142419665426fc..81b3fc72b63d9cfdfaf3cbc15b50a6f8e3a40f97 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessDeleteMessage.php @@ -14,7 +14,7 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertCustomerGroupSuccessDeleteMessage extends AbstractConstraint { - const SUCCESS_DELETE_MESSAGE= "The customer group has been deleted."; + const SUCCESS_DELETE_MESSAGE= "You deleted the customer group."; /** * Assert that message "The customer group has been deleted." is displayed on Customer Group page. diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessSaveMessage.php index a7cc0fca78dd1c288ad69fb510cff859ea0a9efc..9069acfce812b0c2bd116eb486d1a0faa36b312f 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupSuccessSaveMessage.php @@ -14,7 +14,7 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertCustomerGroupSuccessSaveMessage extends AbstractConstraint { - const SUCCESS_MESSAGE = 'The customer group has been saved.'; + const SUCCESS_MESSAGE = 'You saved the customer group.'; /** * Assert that success message is displayed after customer group save diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInfoSuccessSavedMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInfoSuccessSavedMessage.php index 6f9d6d9c144ef294d321bbc1e42b06847710e4e6..6396afca4ba5dc0faa10e3f0bd6987d3baed04cd 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInfoSuccessSavedMessage.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerInfoSuccessSavedMessage.php @@ -18,7 +18,7 @@ class AssertCustomerInfoSuccessSavedMessage extends AbstractConstraint const SEVERITY = 'low'; /* end tags */ - const SUCCESS_MESSAGE = 'The account information has been saved.'; + const SUCCESS_MESSAGE = 'You saved the account information.'; /** * Asserts that success message equals to expected message diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php index 010ed24047c38808b955e7645fccfbcccf858f6e..aebcf4f2695ab88ee2d565c5012d4dd9dcbf2766 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php @@ -86,7 +86,7 @@ class CreateExistingCustomerFrontendEntity extends Injectable // Steps $this->cmsIndex->open(); - $this->cmsIndex->getLinksBlock()->openLink('Register'); + $this->cmsIndex->getLinksBlock()->openLink('Create an Account'); $this->customerAccountCreate->getRegisterForm()->registerCustomer($existingCustomer); } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.php index 8e961286ee4849c59035a3b2dbcd745642962f7b..e9eadb198a5903d8ca0d01bb6db13178ea994aed 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.php @@ -16,7 +16,7 @@ use Magento\Customer\Test\Page\CustomerAccountForgotPassword; * * Steps: * 1. Open forgot password page. - * 2. Fill e-mail. + * 2. Fill email. * 3. Click forgot password button. * 4. Check forgot password message. * diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/RegisterCustomerFrontendEntityTest.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/RegisterCustomerFrontendEntityTest.php index c28cfc03061c37e2de64411c804488a5bac7208a..9e327387a2a369610090d36b9882594592e07756 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/RegisterCustomerFrontendEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/RegisterCustomerFrontendEntityTest.php @@ -72,7 +72,7 @@ class RegisterCustomerFrontendEntityTest extends Injectable { //Steps $this->cmsIndex->open(); - $this->cmsIndex->getLinksBlock()->openLink('Register'); + $this->cmsIndex->getLinksBlock()->openLink('Create an Account'); $this->customerAccountCreate->getRegisterForm()->registerCustomer($customer); } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestStep/LoginCustomerOnFrontendStep.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestStep/LoginCustomerOnFrontendStep.php index 3cd67136fbb23d00d5c60996725ea7d70434c119..ff3cdce1e345e25906d9fc66d369b6634754634c 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestStep/LoginCustomerOnFrontendStep.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestStep/LoginCustomerOnFrontendStep.php @@ -71,7 +71,7 @@ class LoginCustomerOnFrontendStep implements TestStepInterface public function run() { $this->logoutCustomerOnFrontend->run(); - $this->cmsIndex->getLinksBlock()->openLink("Log In"); + $this->cmsIndex->getLinksBlock()->openLink('Sign In'); $this->cmsIndex->getCmsPageBlock()->waitPageInit(); $this->customerAccountLogin->getLoginBlock()->login($this->customer); $this->cmsIndex->getCmsPageBlock()->waitPageInit(); diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestStep/LogoutCustomerOnFrontendStep.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestStep/LogoutCustomerOnFrontendStep.php index 5a441a09bccec36068cb2efc51e23a0497296756..5e1cac805f95e1f768746aa73fb2a3a211d5b998 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestStep/LogoutCustomerOnFrontendStep.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestStep/LogoutCustomerOnFrontendStep.php @@ -18,7 +18,7 @@ class LogoutCustomerOnFrontendStep implements TestStepInterface /** * Logout page title. */ - const LOGOUT_PAGE_TITLE = 'You are now logged out'; + const LOGOUT_PAGE_TITLE = 'You are signed out.'; /** * Cms index page. @@ -54,8 +54,8 @@ class LogoutCustomerOnFrontendStep implements TestStepInterface { $this->cmsIndex->open(); $this->cmsIndex->getCmsPageBlock()->waitPageInit(); - if ($this->cmsIndex->getLinksBlock()->isLinkVisible("Log Out")) { - $this->cmsIndex->getLinksBlock()->openLink("Log Out"); + if ($this->cmsIndex->getLinksBlock()->isLinkVisible('Sign Out')) { + $this->cmsIndex->getLinksBlock()->openLink('Sign Out'); $this->cmsIndex->getCmsPageBlock()->waitUntilTextIsVisible('Home Page'); $this->cmsIndex->getCmsPageBlock()->waitPageInit(); } diff --git a/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml index add7f2519646396f0697621f74646ce4986d46bb..846ea00925857a42c33c6fc80933cf69d7760a19 100644 --- a/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml +++ b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml @@ -8,7 +8,7 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Checkout\Test\TestCase\OnePageCheckoutTest"> <variation name="OnePageCheckoutTestVariation22"> - <data name="description" xsi:type="string">Checkout as guest using FedEx with US shipping origin and UK customer</data> + <data name="description" xsi:type="string">Check Out as Guest using FedEx with US shipping origin and UK customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">guest</data> <data name="customer/dataSet" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php b/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php index dec19f621eda153301cce67d640609aa1bc406d2..5b9914c6e35b454a88d2556ee074307e1b4b4447 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php @@ -23,7 +23,7 @@ class AssertSuccessInstall extends AbstractConstraint */ protected $adminFieldsList = [ ['pageData' => 'username', 'fixture' => 'username'], - ['pageData' => 'e-mail', 'fixture' => 'email'], + ['pageData' => 'email', 'fixture' => 'email'], ['pageData' => 'your_store_address', 'fixture' => 'baseUrl'], ['pageData' => 'magento_admin_address', 'fixture' => 'admin'] ]; diff --git a/dev/tests/functional/tests/app/Magento/Multishipping/Test/Block/Checkout/Addresses.php b/dev/tests/functional/tests/app/Magento/Multishipping/Test/Block/Checkout/Addresses.php index 8b8b16cd4f5e49693d905356f208d9144a49e294..e38185913e5d6b93126a2fe76f408689deede241 100644 --- a/dev/tests/functional/tests/app/Magento/Multishipping/Test/Block/Checkout/Addresses.php +++ b/dev/tests/functional/tests/app/Magento/Multishipping/Test/Block/Checkout/Addresses.php @@ -22,7 +22,7 @@ class Addresses extends Block protected $newAddress = '[data-role="add-new-address"]'; /** - * 'Continue to Shipping Information' button. + * Locator value for "Go to Shipping Information" button. * * @var string */ diff --git a/dev/tests/functional/tests/app/Magento/Multishipping/Test/Constraint/AssertMultishippingOrderSuccessPlacedMessage.php b/dev/tests/functional/tests/app/Magento/Multishipping/Test/Constraint/AssertMultishippingOrderSuccessPlacedMessage.php index 4e211b830f1eed64ce016e02a7651c3da49cb96d..91bc3f5225313d5763b4b39f9360df0d6fd9772d 100644 --- a/dev/tests/functional/tests/app/Magento/Multishipping/Test/Constraint/AssertMultishippingOrderSuccessPlacedMessage.php +++ b/dev/tests/functional/tests/app/Magento/Multishipping/Test/Constraint/AssertMultishippingOrderSuccessPlacedMessage.php @@ -21,7 +21,7 @@ class AssertMultishippingOrderSuccessPlacedMessage extends AbstractConstraint /** * Expected success message */ - const SUCCESS_MESSAGE = 'Your order has been received.'; + const SUCCESS_MESSAGE = 'We received your order!'; /** * Assert that success message is correct. diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewCreationSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewCreationSuccessMessage.php index d9c1c718ab55db5b79502ea02e82f74945af88c3..a5b7e25733f420421ffd57e851a0a9fda9ffa063 100755 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewCreationSuccessMessage.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewCreationSuccessMessage.php @@ -17,7 +17,7 @@ class AssertReviewCreationSuccessMessage extends AbstractConstraint /** * Text of success message after review created */ - const SUCCESS_MESSAGE = 'Your review has been accepted for moderation.'; + const SUCCESS_MESSAGE = 'You submitted your review for moderation.'; /** * Assert that success message is displayed after review created diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessAssignMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessAssignMessage.php index 8e7331ff5c9bf18e58de29d75384d7f388d3dc7f..b20839bba30cd73e682177330a2bfb000b4f369e 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessAssignMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessAssignMessage.php @@ -18,7 +18,7 @@ class AssertOrderStatusSuccessAssignMessage extends AbstractConstraint /** * OrderStatus assigning success message */ - const SUCCESS_MESSAGE = 'You have assigned the order status.'; + const SUCCESS_MESSAGE = 'You assigned the order status.'; /** * Assert that success message is displayed after order status assigning diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessCreateMessage.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessCreateMessage.php index 486b801dbed5c02e07b08753d1b2f256003a523e..0e6e63eb9f18507493187c9b7d1311d9455b25d4 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessCreateMessage.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertOrderStatusSuccessCreateMessage.php @@ -19,7 +19,7 @@ class AssertOrderStatusSuccessCreateMessage extends AbstractConstraint const SEVERITY = 'low'; /* end tags */ - const SUCCESS_MESSAGE = 'You have saved the order status.'; + const SUCCESS_MESSAGE = 'You saved the order status.'; /** * Assert that success message is displayed after order status saved. diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CancelCreatedOrderTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CancelCreatedOrderTest.xml index b5c195908cc8140a1b75fd84fc4c8f55549123c0..043c556bc3fc6e5bf3fb1f0c67d54c00201b2752 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CancelCreatedOrderTest.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CancelCreatedOrderTest.xml @@ -8,7 +8,7 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Sales\Test\TestCase\CancelCreatedOrderTest"> <variation name="CancelCreatedOrderTestVariation1"> - <data name="description" xsi:type="string">cancel order and check status on the frontend</data> + <data name="description" xsi:type="string">cancel order and check status on storefront</data> <data name="order/dataSet" xsi:type="string">default</data> <data name="order/data/entity_id/products" xsi:type="string">catalogProductSimple::default,catalogProductSimple::default</data> <data name="status" xsi:type="string">Canceled</data> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/HoldCreatedOrderTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/HoldCreatedOrderTest.xml index 962f0262f34f2714a8bc06325a8926069115d57e..b860583704c39bff1907b1227684516d15be04c1 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/HoldCreatedOrderTest.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/HoldCreatedOrderTest.xml @@ -8,7 +8,7 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Sales\Test\TestCase\HoldCreatedOrderTest"> <variation name="HoldCreatedOrderTestVariation1"> - <data name="description" xsi:type="string">hold order and check status on the front in my account</data> + <data name="description" xsi:type="string">hold order and check status in my account on storefront</data> <data name="order/dataSet" xsi:type="string">default</data> <data name="order/data/entity_id/products" xsi:type="string">catalogProductSimple::default,catalogProductSimple::default</data> <data name="orderButtonsUnavailable" xsi:type="string">Invoice,Cancel,Reorder,Ship,Edit</data> diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessDeleteMessage.php index 4c507b9605f409dbf1132308e66021b54ee994e3..2cf4cfb37d7591c67c41fb0a4db26eec88ec3860 100644 --- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessDeleteMessage.php @@ -18,7 +18,7 @@ class AssertCartPriceRuleSuccessDeleteMessage extends AbstractConstraint const SEVERITY = 'low'; /* end tags */ - const SUCCESS_DELETE_MESSAGE = 'The rule has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the rule.'; /** * Assert that success message is displayed after sales rule delete. diff --git a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessSaveMessage.php index 409498a592682a5890945a2a9d979c631502f762..6c0484f965e26af8788efebd59abcd6a6527af5b 100644 --- a/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessSaveMessage.php @@ -14,7 +14,7 @@ use Magento\Mtf\Constraint\AbstractConstraint; */ class AssertCartPriceRuleSuccessSaveMessage extends AbstractConstraint { - const SUCCESS_MESSAGE = 'The rule has been saved.'; + const SUCCESS_MESSAGE = 'You saved the rule.'; /** * Assert that success message is displayed after sales rule save. diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteAndBackupMessages.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteAndBackupMessages.php index 4a3c4915771646a796b1fbd59087545442681dbf..7d101ed70c65706ec98868d63ba2984afbbe8335 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteAndBackupMessages.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteAndBackupMessages.php @@ -23,7 +23,7 @@ class AssertStoreGroupSuccessDeleteAndBackupMessages extends AbstractConstraint /** * Success store group delete message */ - const SUCCESS_DELETE_MESSAGE = 'The store has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the store.'; /** * Assert that success messages is displayed after deleting store group diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteMessage.php index 91309d808a15a2e40c74382d7f1e0d6cea607ede..ea9be6f761b102f359cc1edd0a5ee16564c077f2 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessDeleteMessage.php @@ -18,7 +18,7 @@ class AssertStoreGroupSuccessDeleteMessage extends AbstractConstraint /** * Success store group delete message */ - const SUCCESS_DELETE_MESSAGE = 'The store has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the store.'; /** * Assert that success message is displayed after deleting store group diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessSaveMessage.php index 6c20ef821330875a40e1be8179cc542b1fdb11c0..5be639d9d9279bca28978d4af48012a9ab2722a8 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreGroupSuccessSaveMessage.php @@ -18,7 +18,7 @@ class AssertStoreGroupSuccessSaveMessage extends AbstractConstraint /** * Success store create message */ - const SUCCESS_MESSAGE = 'The store has been saved.'; + const SUCCESS_MESSAGE = 'You saved the store.'; /** * Assert that success message is displayed after Store Group has been created diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteAndBackupMessages.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteAndBackupMessages.php index 83af2e7c0c83220380ef74cd8b99b89fb7c7339d..30993d6f2fcc757c483580706eb06e96449b3848 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteAndBackupMessages.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteAndBackupMessages.php @@ -23,7 +23,7 @@ class AssertStoreSuccessDeleteAndBackupMessages extends AbstractConstraint /** * Success store delete message */ - const SUCCESS_DELETE_MESSAGE = 'The store view has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the store view.'; /** * Assert that store success delete and backup messages are present diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteMessage.php index 16787f9051bc3d0fb68a2a0b66e9659435117489..82dd5459f8ba49c1d9e98ce71cd79d002438b07f 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessDeleteMessage.php @@ -18,7 +18,7 @@ class AssertStoreSuccessDeleteMessage extends AbstractConstraint /** * Success store delete message */ - const SUCCESS_DELETE_MESSAGE = 'The store view has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the store view.'; /** * Assert that after store delete successful message appears diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessSaveMessage.php index 1adf2c2eb6e2a72cd80989f41bd614b104137993..cf467e88cb587ebfe66c9c9049448a8eb1208b67 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertStoreSuccessSaveMessage.php @@ -18,7 +18,7 @@ class AssertStoreSuccessSaveMessage extends AbstractConstraint /** * Success store view create message */ - const SUCCESS_MESSAGE = 'The store view has been saved'; + const SUCCESS_MESSAGE = 'You saved the store view.'; /** * Assert that success message is displayed after Store View has been created diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteAndBackupMessages.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteAndBackupMessages.php index 451dd0cc5dd95b704406c7978f34c28cca98cfe4..c5c6a7d2d48068dcc34aec86af9b103ac53522c4 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteAndBackupMessages.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteAndBackupMessages.php @@ -23,7 +23,7 @@ class AssertWebsiteSuccessDeleteAndBackupMessages extends AbstractConstraint /** * Success website delete message */ - const SUCCESS_DELETE_MESSAGE = 'The website has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the website.'; /** * Assert that success messages is displayed after deleting website diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteMessage.php index 0ba9aa0762ebdf4443107b9b2cf808c952bcec48..11d54478e8df7fbb28c202d1b62fffb54a59e162 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessDeleteMessage.php @@ -18,7 +18,7 @@ class AssertWebsiteSuccessDeleteMessage extends AbstractConstraint /** * Success website delete message */ - const SUCCESS_DELETE_MESSAGE = 'The website has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the website.'; /** * Assert that success message is displayed after deleting website diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessSaveMessage.php index 177029571c7892c031ae6ddb7f8bc6ac8b4e5cf8..2078e611262bc4022a42a8f0d37fc09d8534dbaf 100644 --- a/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessSaveMessage.php +++ b/dev/tests/functional/tests/app/Magento/Store/Test/Constraint/AssertWebsiteSuccessSaveMessage.php @@ -18,7 +18,7 @@ class AssertWebsiteSuccessSaveMessage extends AbstractConstraint /** * Success website create message */ - const SUCCESS_MESSAGE = 'The website has been saved.'; + const SUCCESS_MESSAGE = 'You saved the website.'; /** * Assert that success message is displayed after Website has been created diff --git a/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml index fcb92ddb6be2a91c3c689bd686687517c4c6ef16..6fc10ed38d6c56eaad94467b0d8a1a82b7f242cc 100644 --- a/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml +++ b/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml @@ -24,7 +24,7 @@ <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty"/> </variation> <variation name="OnePageCheckoutTestVariation25"> - <data name="description" xsi:type="string">Checkout as guest using UPS with US shipping origin and UK customer</data> + <data name="description" xsi:type="string">Check Out as Guest using UPS with US shipping origin and UK customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">guest</data> <data name="customer/dataSet" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteDeletedMessage.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteDeletedMessage.php index 8542c0fa9b0fab1dfccfdeea673cac05fb7e62c3..ac453e2ebdc40642ed3d948c5663aaec5bd9d9a7 100644 --- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteDeletedMessage.php +++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Constraint/AssertUrlRewriteDeletedMessage.php @@ -18,7 +18,7 @@ class AssertUrlRewriteDeletedMessage extends AbstractConstraint /** * Message that displayed after delete url rewrite */ - const SUCCESS_DELETE_MESSAGE = 'The URL Rewrite has been deleted.'; + const SUCCESS_DELETE_MESSAGE = 'You deleted the URL rewrite.'; /** * Assert that delete message is displayed diff --git a/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml index 25c488a697e577f4589ef24fd679ae5e52ed3f89..b930b0fb8abc7e9d60dbde9e80605ae26a629f1a 100644 --- a/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml +++ b/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml @@ -24,7 +24,7 @@ <constraint name="Magento\Checkout\Test\Constraint\AssertCartIsEmpty"/> </variation> <variation name="OnePageCheckoutTestVariation27"> - <data name="description" xsi:type="string">Checkout as guest using USPS with US shipping origin and UK customer</data> + <data name="description" xsi:type="string">Check Out as Guest using USPS with US shipping origin and UK customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">guest</data> <data name="customer/dataSet" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Customer/Wishlist/Items/Product.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Customer/Wishlist/Items/Product.php index 5f427ca5531f3dabfa6297513defebd191875959..49897e480fa59495aaba2bc16d5a49198ce42c33 100644 --- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Customer/Wishlist/Items/Product.php +++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Block/Customer/Wishlist/Items/Product.php @@ -30,7 +30,7 @@ class Product extends Form protected $remove = '[data-role="remove"]'; /** - * Selector for 'View Details' element + * Locator value for "See Details" tooltip. * * @var string */ diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AbstractAssertWishlistProductDetails.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AbstractAssertWishlistProductDetails.php index 9119a7273c8c8640a6e64cc6e70cba2d2dbc61b5..758fb0cee41cef861b9dc8d3d3858e848923e7d5 100644 --- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AbstractAssertWishlistProductDetails.php +++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AbstractAssertWishlistProductDetails.php @@ -12,7 +12,7 @@ use Magento\Wishlist\Test\Page\WishlistIndex; use Magento\Mtf\Constraint\AbstractAssertForm; /** - * Assert that the correct option details are displayed on the "View Details" tool tip. + * Assert that the correct option details are displayed on the "See Details" tooltip. */ abstract class AbstractAssertWishlistProductDetails extends AbstractAssertForm { diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertProductDetailsInWishlist.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertProductDetailsInWishlist.php index 0748d08846e9c7729c6887129e42a2a97a628afb..635f1c684103ea05fde117de61bf57595780c0c3 100644 --- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertProductDetailsInWishlist.php +++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Constraint/AssertProductDetailsInWishlist.php @@ -12,12 +12,12 @@ use Magento\Mtf\Fixture\FixtureFactory; use Magento\Mtf\Fixture\InjectableFixture; /** - * Assert that the correct option details are displayed on the "View Details" tool tip. + * Assert that the correct option details are displayed on the "See Details" tooltip. */ class AssertProductDetailsInWishlist extends AbstractAssertWishlistProductDetails { /** - * Assert that the correct option details are displayed on the "View Details" tool tip. + * Assert that the correct option details are displayed on the "See Details" tooltip. * * @param CmsIndex $cmsIndex * @param WishlistIndex $wishlistIndex diff --git a/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php b/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php similarity index 63% rename from dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php rename to dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php index 1100934f8dc0362d7f12fa44c5e677975f819e0d..8ae817b42cee2324f68f264a50fa17ae9e5b265b 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php +++ b/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php @@ -3,14 +3,14 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Backend\Utility; +namespace Magento\TestFramework\TestCase; /** * A parent class for backend controllers - contains directives for admin user creation and authentication * @SuppressWarnings(PHPMD.NumberOfChildren) * @SuppressWarnings(PHPMD.numberOfChildren) */ -class Controller extends \Magento\TestFramework\TestCase\AbstractController +abstract class AbstractBackendController extends \Magento\TestFramework\TestCase\AbstractController { /** * @var \Magento\Backend\Model\Auth\Session @@ -22,6 +22,20 @@ class Controller extends \Magento\TestFramework\TestCase\AbstractController */ protected $_auth; + /** + * The resource used to authorize action + * + * @var string + */ + protected $resource = null; + + /** + * The uri at which to access the controller + * + * @var string + */ + protected $uri = null; + protected function setUp() { parent::setUp(); @@ -70,4 +84,27 @@ class Controller extends \Magento\TestFramework\TestCase\AbstractController ) { parent::assertSessionMessages($constraint, $messageType, $messageManagerClass); } + + + public function testAclHasAccess() + { + if ($this->uri === null) { + $this->markTestIncomplete('AclHasAccess test is not complete'); + } + $this->dispatch($this->uri); + $this->assertNotSame(403, $this->getResponse()->getHttpResponseCode()); + $this->assertNotSame(404, $this->getResponse()->getHttpResponseCode()); + } + + public function testAclNoAccess() + { + if ($this->resource === null) { + $this->markTestIncomplete('Acl test is not complete'); + } + $this->_objectManager->get('Magento\Framework\Acl\Builder') + ->getAcl() + ->deny(null, $this->resource); + $this->dispatch($this->uri); + $this->assertSame(403, $this->getResponse()->getHttpResponseCode()); + } } diff --git a/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsReadTest.php b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsReadTest.php new file mode 100644 index 0000000000000000000000000000000000000000..06b47f04772a56f81a2c1cfbc1e633233ada3c35 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsReadTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\AdminNotification\Controller\Adminhtml\Notification; + +class MarkAsReadTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_AdminNotification::mark_as_read'; + $this->uri = 'backend/admin/notification/markasread'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsReadTest.php b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsReadTest.php new file mode 100644 index 0000000000000000000000000000000000000000..18f3604e29d1b0aee4043a4ae100e9164ebe2b97 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsReadTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\AdminNotification\Controller\Adminhtml\Notification; + +class MassMarkAsReadTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_AdminNotification::mark_as_read'; + $this->uri = 'backend/admin/notification/massmarkasread'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemoveTest.php b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemoveTest.php new file mode 100644 index 0000000000000000000000000000000000000000..780e716c5ab7627a83e62ed91db2d9f3fac52475 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemoveTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\AdminNotification\Controller\Adminhtml\Notification; + +class MassRemoveTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_AdminNotification::adminnotification_remove'; + $this->uri = 'backend/admin/notification/massremove'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/RemoveTest.php b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/RemoveTest.php new file mode 100644 index 0000000000000000000000000000000000000000..240b91ea122e4f19576ee1a719cfe35f7c2c051f --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/RemoveTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\AdminNotification\Controller\Adminhtml\Notification; + +class RemoveTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_AdminNotification::adminnotification_remove'; + $this->uri = 'backend/admin/notification/remove'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Backend/App/AbstractActionTest.php b/dev/tests/integration/testsuite/Magento/Backend/App/AbstractActionTest.php index 4578a476df3ae6d78e9c813050a9be3f7fd9024b..e5362e3496e73a2be9cee990f518d4fa408c5c84 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/App/AbstractActionTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/App/AbstractActionTest.php @@ -9,7 +9,7 @@ namespace Magento\Backend\App; * Test class for \Magento\Backend\Controller\AbstractAction. * @magentoAppArea adminhtml */ -class AbstractActionTest extends \Magento\Backend\Utility\Controller +class AbstractActionTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Check redirection to startup page for logged user diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php index 0c6d65b52543fa3dac3c9d6de3434a940184cfbb..e122d906f21866c9b532841472bfc792675ef033 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Cache/MassActionTest.php @@ -11,7 +11,7 @@ use Magento\TestFramework\Helper\Bootstrap; use Magento\Framework\Config\File\ConfigFilePool; use Magento\Framework\App\Filesystem\DirectoryList; -class MassActionTest extends \Magento\Backend\Utility\Controller +class MassActionTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Configuration of cache types diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/CacheTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/CacheTest.php index 071967d1e5fcc6598c1bcbfbfe08ee169e403e1e..7229d95e579e929d7fd758deacbba47a61caadfe 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/CacheTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/CacheTest.php @@ -8,7 +8,7 @@ namespace Magento\Backend\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class CacheTest extends \Magento\Backend\Utility\Controller +class CacheTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @magentoDataFixture Magento/Backend/controllers/_files/cache/application_cache.php diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Dashboard/ProductsViewedTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Dashboard/ProductsViewedTest.php index 72f68982f89d60c0b4bebe7ffd383d4d4722e601..c9749a5aab2ba7812ec5482ccc01898fc82c930b 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Dashboard/ProductsViewedTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/Dashboard/ProductsViewedTest.php @@ -6,7 +6,7 @@ */ namespace Magento\Backend\Controller\Adminhtml\Dashboard; -class ProductsViewedTest extends \Magento\Backend\Utility\Controller +class ProductsViewedTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @magentoDataFixture Magento/Reports/_files/viewed_products.php diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/DashboardTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/DashboardTest.php index f83c3bb77a83b50daa1a74ae35544e4b1fd531d4..20b193ee77d292d9d46cd0e2a12f32e55b3c8658 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/DashboardTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/DashboardTest.php @@ -8,7 +8,7 @@ namespace Magento\Backend\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class DashboardTest extends \Magento\Backend\Utility\Controller +class DashboardTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testAjaxBlockAction() { diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/IndexTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/IndexTest.php index 795c1f2b9271705e6318f404ae2aa098058d6b18..6575448913a4f7344c1d018423f20c9acd733bf3 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/IndexTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/IndexTest.php @@ -8,7 +8,7 @@ namespace Magento\Backend\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class IndexTest extends \Magento\Backend\Utility\Controller +class IndexTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Check not logged state diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/AccountTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/AccountTest.php index a4edd2510d3d8f6fed9ef24683bc78f2fb703e34..983e3dae2d465f35cf20407e86b5ef36374da9f3 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/AccountTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/AccountTest.php @@ -10,7 +10,7 @@ use Magento\TestFramework\Bootstrap; /** * @magentoAppArea adminhtml */ -class AccountTest extends \Magento\Backend\Utility\Controller +class AccountTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @dataProvider saveDataProvider diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/DesignTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/DesignTest.php index be0bd223c23ed48b27afed77d97b21f522bc17ec..5c6a9c49ef209f654995cafe4d6039f6a122e288 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/DesignTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/DesignTest.php @@ -8,7 +8,7 @@ namespace Magento\Backend\Controller\Adminhtml\System; /** * @magentoAppArea adminhtml */ -class DesignTest extends \Magento\Backend\Utility\Controller +class DesignTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @covers \Magento\Backend\App\Action::_addLeft diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/StoreTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/StoreTest.php index b84193fcd61625c1a2fce585b09b1a49a1ff3a03..7ce98d848e5eae77afe711e243fe813fd6178f6e 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/StoreTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/System/StoreTest.php @@ -8,7 +8,7 @@ namespace Magento\Backend\Controller\Adminhtml\System; /** * @magentoAppArea adminhtml */ -class StoreTest extends \Magento\Backend\Utility\Controller +class StoreTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testIndexAction() { diff --git a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/UrlRewriteTest.php b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/UrlRewriteTest.php index 51db66afe941fde1c1614c0eb7d1f1f6b807c4db..23e50b082be7cb56b6603e4057d109c46aa9983e 100644 --- a/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/UrlRewriteTest.php +++ b/dev/tests/integration/testsuite/Magento/Backend/Controller/Adminhtml/UrlRewriteTest.php @@ -8,7 +8,7 @@ namespace Magento\Backend\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class UrlRewriteTest extends \Magento\Backend\Utility\Controller +class UrlRewriteTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Check save cms page rewrite diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php index 6f775b962bf01ca1aa5bf28f0915b48461decaf6..5965cc529be88816377e712e097bb3bf180706cc 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php @@ -8,7 +8,7 @@ namespace Magento\Catalog\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class CategoryTest extends \Magento\Backend\Utility\Controller +class CategoryTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @magentoDataFixture Magento/Store/_files/core_fixturestore.php @@ -333,7 +333,7 @@ class CategoryTest extends \Magento\Backend\Utility\Controller ); $this->dispatch('backend/catalog/category/save'); $this->assertSessionMessages( - $this->equalTo(['Unable to save the category']), + $this->equalTo(['Something went wrong while saving the category.']), \Magento\Framework\Message\MessageInterface::TYPE_ERROR ); } diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php index cb8f0d7354b76faf0c082ac59f31d1de59ca42a9..276f752779f224cedd35b06359147952c5961d69 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Action/AttributeTest.php @@ -8,7 +8,7 @@ namespace Magento\Catalog\Controller\Adminhtml\Product\Action; /** * @magentoAppArea adminhtml */ -class AttributeTest extends \Magento\Backend\Utility\Controller +class AttributeTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @covers \Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute\Save::execute diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php index 4b64142851618d123c4f3a6011146cccd1863692..07b5cac6bb2689cec5c86e56399947798dc28763 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php @@ -8,7 +8,7 @@ namespace Magento\Catalog\Controller\Adminhtml\Product; /** * @magentoAppArea adminhtml */ -class AttributeTest extends \Magento\Backend\Utility\Controller +class AttributeTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @return void diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/NewActionTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/NewActionTest.php index 1af4fd36b8f494e3005f00b50ed0609d290c5e55..b87d11c2c90a3ba8a11a11479bcd7f6369b460c2 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/NewActionTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/NewActionTest.php @@ -11,7 +11,7 @@ namespace Magento\Catalog\Controller\Adminhtml\Product; /** * @magentoAppArea adminhtml */ -class NewActionTest extends \Magento\Backend\Utility\Controller +class NewActionTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @TODO: Remove this test when corresponding functional tests become mandatory: diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/ReviewTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/ReviewTest.php index 54c2a94c9e5a884c2977a6958e2a48f817baf7ad..b684ee4cebf63ad2a719a51d05e06a56f0ab9a71 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/ReviewTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/ReviewTest.php @@ -8,7 +8,7 @@ namespace Magento\Catalog\Controller\Adminhtml\Product; /** * @magentoAppArea adminhtml */ -class ReviewTest extends \Magento\Backend\Utility\Controller +class ReviewTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @magentoDataFixture Magento/Review/_files/review_xss.php diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Set/DeleteTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Set/DeleteTest.php index a8f2d376d96cbbcb704d5d666954b79f4a179e4a..6fdab58458c5d43ee1840d57a5d6e120487d090f 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Set/DeleteTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Set/DeleteTest.php @@ -7,7 +7,7 @@ namespace Magento\Catalog\Controller\Adminhtml\Product\Set; use Magento\Framework\Message\MessageInterface; -class DeleteTest extends \Magento\Backend\Utility\Controller +class DeleteTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @magentoDataFixture Magento/Eav/_files/empty_attribute_set.php @@ -21,7 +21,7 @@ class DeleteTest extends \Magento\Backend\Utility\Controller $this->assertNull($this->getAttributeSetByName('empty_attribute_set')); $this->assertSessionMessages( - $this->equalTo(['The attribute set has been removed.']), + $this->equalTo(['The product template has been removed.']), MessageInterface::TYPE_SUCCESS ); $this->assertRedirect($this->stringContains('catalog/product_set/index/')); diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php index 0ab3f897f2b90307ddbaefec4e41fd642b624d7b..6cefed9c36b43e37763bec0f686a8f47d6629459 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php @@ -8,7 +8,7 @@ namespace Magento\Catalog\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class ProductTest extends \Magento\Backend\Utility\Controller +class ProductTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testSaveActionWithDangerRequest() { diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFileTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFileTest.php index 96833ea6131be828d3511fcd39db17b0409c0d02..3a89eed1a975f1b0d0ab7d93a6977a5cd39eb30c 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFileTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFileTest.php @@ -109,7 +109,7 @@ class ValidatorFileTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Please specify the product's required option(s). + * @expectedExceptionMessage Please specify product's required option(s). * @return void */ public function testException() @@ -134,7 +134,7 @@ class ValidatorFileTest extends \PHPUnit_Framework_TestCase '\Magento\Framework\Exception\LocalizedException', "The file 'test.jpg' for 'MediaOption' has an invalid extension.\n" . "The file 'test.jpg' for 'MediaOption' has an invalid extension.\n" - . "Maximum allowed image size for 'MediaOption' is 2000x2000 px.\n" + . "The maximum allowed image size for 'MediaOption' is 2000x2000 px.\n" . sprintf( "The file 'test.jpg' you uploaded is larger than the %s megabytes allowed by our server.", $this->maxFileSizeInMb diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfoTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfoTest.php index d0a5bdb5bdf034ed408ef27de589cc31626d10ea..f47edeb86bc87444d5fec7c2506bf9bbeb1e18e0 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfoTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfoTest.php @@ -56,7 +56,7 @@ class ValidatorInfoTest extends \PHPUnit_Framework_TestCase '\Magento\Framework\Exception\LocalizedException', "The file 'test.jpg' for 'MediaOption' has an invalid extension.\n" . "The file 'test.jpg' for 'MediaOption' has an invalid extension.\n" - . "Maximum allowed image size for 'MediaOption' is 2000x2000 px.\n" + . "The maximum allowed image size for 'MediaOption' is 2000x2000 px.\n" . sprintf( "The file 'test.jpg' you uploaded is larger than the %s megabytes allowed by our server.", $this->maxFileSizeInMb @@ -88,7 +88,7 @@ class ValidatorInfoTest extends \PHPUnit_Framework_TestCase { $this->setExpectedException( '\Magento\Framework\Exception\LocalizedException', - "Please specify the product's required option(s)." + "Please specify product's required option(s)." ); $validateMock = $this->getMock('Zend_Validate', ['isValid', 'getErrors']); diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/AbstractTypeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/AbstractTypeTest.php index 2dabe7eec0e8f536c4fcb09c07e70112bdf218dd..ac18747bda84e186f8544ce518997412b867e6ce 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/AbstractTypeTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/AbstractTypeTest.php @@ -209,7 +209,7 @@ class AbstractTypeTest extends \PHPUnit_Framework_TestCase $product->load(1); // fixture $this->assertEquals( - 'Please specify the product\'s required option(s).', + 'Please specify product\'s required option(s).', $this->_model->prepareForCart(new \Magento\Framework\Object(), $product) ); } @@ -217,7 +217,7 @@ class AbstractTypeTest extends \PHPUnit_Framework_TestCase public function testGetSpecifyOptionMessage() { $this->assertEquals( - 'Please specify the product\'s required option(s).', + 'Please specify product\'s required option(s).', $this->_model->getSpecifyOptionMessage() ); } diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php index 4c3396302678733c648e1689ed044366c732f51b..7662e16af8283d49e94aeafcea8d7a17a55d4a78 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php @@ -184,7 +184,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE) ->setAttributeSetId($installer->getAttributeSetId('catalog_product', 'Default')) ->setStoreId(1) ->setWebsiteIds([1]) - ->setName('Simple Product Not Visible On Frontend') + ->setName('Simple Product Not Visible On Storefront') ->setSku('simple') ->setPrice(15) ->setWeight(2) diff --git a/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php b/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php index 6acd799855c98ff4bdfce79c329196a94919fea0..ca4260d5c037668987898fb26a647e0ee85aa113 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php +++ b/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php @@ -5,6 +5,8 @@ */ namespace Magento\CatalogInventory\Model\Stock; +use Magento\Indexer\Model\Indexer\State; + class ItemTest extends \PHPUnit_Framework_TestCase { /** @@ -21,6 +23,7 @@ class ItemTest extends \PHPUnit_Framework_TestCase /** * @magentoDataFixture Magento/Catalog/_files/products.php + * @magentoAppIsolation enabled */ public function testSaveWithNullQty() { @@ -31,11 +34,11 @@ class ItemTest extends \PHPUnit_Framework_TestCase $product->load(1); /** @var \Magento\CatalogInventory\Model\Stock\StockItemRepository $stockItemRepository */ - $stockItemRepository = $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + $stockItemRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\CatalogInventory\Model\Stock\StockItemRepository'); /** @var \Magento\CatalogInventory\Api\StockItemCriteriaInterface $stockItemCriteria */ - $stockItemCriteria = $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + $stockItemCriteria = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\CatalogInventory\Api\StockItemCriteriaInterface'); $savedStockItem = current($stockItemRepository->getList($stockItemCriteria)->getItems()); @@ -60,15 +63,49 @@ class ItemTest extends \PHPUnit_Framework_TestCase /** * @magentoDataFixture Magento/Catalog/_files/products.php + * @magentoAppIsolation enabled + */ + public function testIndexerInvalidation() + { + /** @var \Magento\CatalogInventory\Model\Stock\StockItemRepository $stockItemRepository */ + $stockItemRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\CatalogInventory\Model\Stock\StockItemRepository'); + + /** @var \Magento\CatalogInventory\Api\StockItemCriteriaInterface $stockItemCriteria */ + $stockItemCriteria = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\CatalogInventory\Api\StockItemCriteriaInterface'); + /** @var \Magento\CatalogInventory\Model\Indexer\Stock\Processor $indexerProcessor */ + $indexerProcessor = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\CatalogInventory\Model\Indexer\Stock\Processor'); + $indexer = $indexerProcessor->getIndexer(); + $indexer->setScheduled(true); + $indexer->getState()->setStatus(State::STATUS_VALID)->save(); + + /** @var \Magento\CatalogInventory\Api\Data\StockItemInterface $savedStockItem */ + $savedStockItem = current($stockItemRepository->getList($stockItemCriteria)->getItems()); + $savedStockItem->setQty(1); + $savedStockItem->setIsInStock(false); + $savedStockItem->save(); + + + $this->assertEquals('invalid', $indexerProcessor->getIndexer()->getStatus()); + + $indexer->setScheduled(false); + $indexer->getState()->setStatus(State::STATUS_VALID)->save(); + } + + /** + * @magentoDataFixture Magento/Catalog/_files/products.php + * @magentoAppIsolation enabled */ public function testStockStatusChangedAuto() { /** @var \Magento\CatalogInventory\Model\Stock\StockItemRepository $stockItemRepository */ - $stockItemRepository = $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + $stockItemRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\CatalogInventory\Model\Stock\StockItemRepository'); /** @var \Magento\CatalogInventory\Api\StockItemCriteriaInterface $stockItemCriteria */ - $stockItemCriteria = $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + $stockItemCriteria = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->create('Magento\CatalogInventory\Api\StockItemCriteriaInterface'); $savedStockItem = current($stockItemRepository->getList($stockItemCriteria)->getItems()); diff --git a/dev/tests/integration/testsuite/Magento/Checkout/Block/Cart/Item/RendererTest.php b/dev/tests/integration/testsuite/Magento/Checkout/Block/Cart/Item/RendererTest.php index a6957a03133f5dbf7030dd568537dca3d102011f..08220dd340ad85bb01a1dffbea9a1490baa0d014 100644 --- a/dev/tests/integration/testsuite/Magento/Checkout/Block/Cart/Item/RendererTest.php +++ b/dev/tests/integration/testsuite/Magento/Checkout/Block/Cart/Item/RendererTest.php @@ -62,12 +62,6 @@ class RendererTest extends \PHPUnit_Framework_TestCase $this->assertStringEndsWith('magento_image.jpg', $this->_block->getProductThumbnailSidebarUrl()); } - public function testGetConfigureUrl() - { - $testString = 'checkout/cart/configure/id/' . $this->_block->getItem()->getId() . '/product_id/1/'; - $this->assertStringEndsWith($testString, $this->_block->getConfigureUrl()); - } - /** * Gets \Magento\Quote\Model\Quote\Item from \Magento\Quote\Model\Quote by product id * diff --git a/dev/tests/integration/testsuite/Magento/Checkout/Model/Type/OnepageTest.php b/dev/tests/integration/testsuite/Magento/Checkout/Model/Type/OnepageTest.php index aa5dc67e9dfaec6f29bb46f33ddf82a78d88c390..36d6810d4b2027e3a99f43fc1b0f7e04ccb18faf 100644 --- a/dev/tests/integration/testsuite/Magento/Checkout/Model/Type/OnepageTest.php +++ b/dev/tests/integration/testsuite/Magento/Checkout/Model/Type/OnepageTest.php @@ -481,7 +481,7 @@ class OnepageTest extends \PHPUnit_Framework_TestCase $result = $this->_model->saveBilling($customerData, $customerAddressId); $this->assertArrayHasKey('message', $result, 'Error message was expected to be set'); $this->assertStringStartsWith( - 'There is already a registered customer using this email address', + 'This email address already belongs to a registered customer.', (string)$result['message'], 'Validation error is invalid.' ); diff --git a/dev/tests/integration/testsuite/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/IndexTest.php b/dev/tests/integration/testsuite/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/IndexTest.php index 2dc7211134a9ab4275fdfe365aa1a7a676af70c9..db421e962fe1b6e91443645cf17fc3611f9234f5 100644 --- a/dev/tests/integration/testsuite/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/IndexTest.php +++ b/dev/tests/integration/testsuite/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/IndexTest.php @@ -6,7 +6,7 @@ namespace Magento\Cms\Controller\Adminhtml\Wysiwyg\Images; -class IndexTest extends \Magento\Backend\Utility\Controller +class IndexTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testViewAction() { diff --git a/dev/tests/integration/testsuite/Magento/Config/Controller/Adminhtml/System/ConfigTest.php b/dev/tests/integration/testsuite/Magento/Config/Controller/Adminhtml/System/ConfigTest.php index 17507214f58ce960622fe170a94e079f0eb1f863..93300ebe991c14b95c33ead08ea1a8b5ae73f948 100644 --- a/dev/tests/integration/testsuite/Magento/Config/Controller/Adminhtml/System/ConfigTest.php +++ b/dev/tests/integration/testsuite/Magento/Config/Controller/Adminhtml/System/ConfigTest.php @@ -13,7 +13,7 @@ use Magento\TestFramework\Helper\Bootstrap; /** * @magentoAppArea adminhtml */ -class ConfigTest extends \Magento\Backend\Utility\Controller +class ConfigTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testEditAction() { diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php index 73ad1be033ce7020a1cf14fa24322c05a4b241b3..a878e83de053fdf216a97dda9a3c59c1995d13c8 100644 --- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php @@ -9,7 +9,7 @@ namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Con /** * @magentoAppArea adminhtml */ -class MatrixTest extends \Magento\Backend\Utility\Controller +class MatrixTest extends \Magento\TestFramework\TestCase\AbstractBackendController { const ATTRIBUTE_LABEL = 'New Attribute Label'; const ATTRIBUTE_POSITION = 42; diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php index b3c492d07d29ce2d775ca328f070d90ccb5be646..e05edee57e832c8a02083b32fa7d43ec224f0528 100644 --- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php @@ -13,7 +13,7 @@ use Magento\Catalog\Model\Resource\Eav\Attribute; /** * @magentoAppArea adminhtml */ -class ConfigTest extends \Magento\Backend\Utility\Controller +class ConfigTest extends \Magento\TestFramework\TestCase\AbstractBackendController { const ATTRIBUTE_LABEL = 'New Attribute Label'; const ATTRIBUTE_POSITION = 42; diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/ProductTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/ProductTest.php index 3bfa19d422aef293af99f7de84e0433cc364ddd4..0f4b46261fa9f49790b36b330a6461b5fda2080f 100644 --- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/ProductTest.php +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/ProductTest.php @@ -8,7 +8,7 @@ namespace Magento\ConfigurableProduct\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class ProductTest extends \Magento\Backend\Utility\Controller +class ProductTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php index ab40348430e024c0d58e42d8ee649321c0ec754b..504925718beb9ee284d6540107f07500f33ad255 100644 --- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php @@ -291,7 +291,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase public function testGetSpecifyOptionMessage() { $this->assertEquals( - 'Please specify the product\'s option(s).', + 'You need to choose options for your item.', (string)$this->_model->getSpecifyOptionMessage() ); } diff --git a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php index 6b2f926e8adda8676cef2f8a76cae24c31f4de0a..f170ad50089fcf44ae3add9c1ff078f0fb027e06 100644 --- a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php +++ b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php @@ -5,7 +5,7 @@ */ namespace Magento\CurrencySymbol\Controller\Adminhtml\System\Currency; -class FetchRatesTest extends \Magento\Backend\Utility\Controller +class FetchRatesTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Test fetch action without service @@ -51,7 +51,7 @@ class FetchRatesTest extends \Magento\Backend\Utility\Controller $this->runActionWithMockedImportService(['We can\'t retrieve a rate from url']); $this->assertSessionMessages( - $this->contains('All possible rates were fetched, please click on "Save" to apply'), + $this->contains('Click "Save" to apply the rates we found.'), \Magento\Framework\Message\MessageInterface::TYPE_WARNING ); } @@ -64,7 +64,7 @@ class FetchRatesTest extends \Magento\Backend\Utility\Controller $this->runActionWithMockedImportService(); $this->assertSessionMessages( - $this->contains('All rates were fetched, please click on "Save" to apply'), + $this->contains('Click "Save" to apply the rates we found.'), \Magento\Framework\Message\MessageInterface::TYPE_SUCCESS ); } diff --git a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/IndexTest.php b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/IndexTest.php index 668d08345f155e186f8b4aa5f5498b190fa00615..66a0af3bc948c85b8d15491232cd98664af72476 100644 --- a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/IndexTest.php +++ b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/IndexTest.php @@ -5,7 +5,7 @@ */ namespace Magento\CurrencySymbol\Controller\Adminhtml\System\Currency; -class IndexTest extends \Magento\Backend\Utility\Controller +class IndexTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Test index action diff --git a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/SaveRatesTest.php b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/SaveRatesTest.php index 2b7a4fb020953a5997336ec6f6d0d5786e67fb78..0cece519e3355a7900a0a2c91af7e43efcaa0ad2 100644 --- a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/SaveRatesTest.php +++ b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/SaveRatesTest.php @@ -5,7 +5,7 @@ */ namespace Magento\CurrencySymbol\Controller\Adminhtml\System\Currency; -class SaveRatesTest extends \Magento\Backend\Utility\Controller +class SaveRatesTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** @var \Magento\Directory\Model\Currency $currencyRate */ diff --git a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/IndexTest.php b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/IndexTest.php index cb6cb168ad59333d8038a39fcb46b04189d2a500..525dcdfb697e8a4efc8cdf71bf732e4941bcee29 100644 --- a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/IndexTest.php +++ b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/IndexTest.php @@ -5,7 +5,7 @@ */ namespace Magento\CurrencySymbol\Controller\Adminhtml\System\Currencysymbol; -class IndexTest extends \Magento\Backend\Utility\Controller +class IndexTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Test index action diff --git a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/SaveTest.php b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/SaveTest.php index 2f738452630c8506fb0eb8a23bbe527687552aa1..b5fdfc9fc965e2272aabaddd0ed9eecf5238c287 100644 --- a/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/SaveTest.php +++ b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol/SaveTest.php @@ -5,7 +5,7 @@ */ namespace Magento\CurrencySymbol\Controller\Adminhtml\System\Currencysymbol; -class SaveTest extends \Magento\Backend\Utility\Controller +class SaveTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** diff --git a/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Edit/Tab/View/CartTest.php b/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Edit/Tab/View/CartTest.php index 6ec5ae6f465e3ae32880fcd0fd0146c4aac44c1c..da93f3cdd96addf86282dc583908a7e86b20815e 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Edit/Tab/View/CartTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Edit/Tab/View/CartTest.php @@ -94,7 +94,7 @@ class CartTest extends \PHPUnit_Framework_TestCase public function testToHtmlEmptyCart() { $this->assertEquals(0, $this->block->getCollection()->getSize()); - $this->assertContains("There are no items in customer's shopping cart at the moment", $this->block->toHtml()); + $this->assertContains('There are no items in customer\'s shopping cart.', $this->block->toHtml()); } /** diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php index ad67b6d54c886c6d9e4b37b8dd6135b0e3466d54..b53637f8418dd742b90196c4c952b831d59be1e3 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php @@ -194,10 +194,9 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringContains('customer/account/index/')); $this->assertSessionMessages( $this->equalTo([ - 'Account confirmation is required. Please, check your email for the confirmation link. ' . - 'To resend the confirmation email please ' . - '<a href="http://localhost/index.php/customer/account/confirmation/email/' . - $email . '/">click here</a>.', + 'You must confirm your account. Please check your email for the confirmation link or ' + . '<a href="http://localhost/index.php/customer/account/confirmation/email/' + . $email . '/">click here</a> for a new link.' ]), MessageInterface::TYPE_SUCCESS ); @@ -283,7 +282,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->dispatch('customer/account/confirmation'); $this->assertRedirect($this->stringContains('customer/account/index')); $this->assertSessionMessages( - $this->equalTo(['Please, check your email for confirmation key.']), + $this->equalTo(['Please check your email for confirmation key.']), MessageInterface::TYPE_SUCCESS ); } @@ -320,8 +319,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringContains('customer/account/')); $this->assertSessionMessages( $this->equalTo([ - "If there is an account associated with {$email} you will receive an email " . - 'with a link to reset your password.', + 'We\'ll email you a link to reset your password.' ]), MessageInterface::TYPE_SUCCESS ); @@ -358,7 +356,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->dispatch('customer/account/resetPasswordPost'); $this->assertRedirect($this->stringContains('customer/account/')); $this->assertSessionMessages( - $this->equalTo(['There was an error saving the new password.']), + $this->equalTo(['Something went wrong while saving the new password.']), MessageInterface::TYPE_ERROR ); } @@ -380,7 +378,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->dispatch('customer/account/resetPasswordPost'); $this->assertRedirect($this->stringContains('customer/account/login')); $this->assertSessionMessages( - $this->equalTo(['Your password has been updated.']), + $this->equalTo(['You updated your password.']), MessageInterface::TYPE_SUCCESS ); } @@ -446,7 +444,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringEndsWith('customer/account/')); $this->assertSessionMessages( - $this->equalTo(['The account information has been saved.']), + $this->equalTo(['You saved the account information.']), MessageInterface::TYPE_SUCCESS ); @@ -487,7 +485,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringEndsWith('customer/account/')); $this->assertSessionMessages( - $this->equalTo(['The account information has been saved.']), + $this->equalTo(['You saved the account information.']), MessageInterface::TYPE_SUCCESS ); @@ -545,7 +543,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringEndsWith('customer/account/edit/')); // Not sure if its the most secure message. Not changing the behavior for now in the new AccountManagement APIs. $this->assertSessionMessages( - $this->equalTo(["Password doesn't match for this account."]), + $this->equalTo(['The password doesn\'t match this account.']), MessageInterface::TYPE_ERROR ); } @@ -573,7 +571,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringEndsWith('customer/account/edit/')); $this->assertSessionMessages( - $this->equalTo(['Confirm your new password']), + $this->equalTo(['Confirm your new password.']), MessageInterface::TYPE_ERROR ); } diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/AddressTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AddressTest.php index e55c777ef575588c077f2179c9f65dcaa46f5fdb..f1a3573f3b05409cbd691b3e3fe13f6732f2cdd9 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AddressTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AddressTest.php @@ -89,7 +89,7 @@ class AddressTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringContains('customer/address/index')); $this->assertSessionMessages( - $this->equalTo(['The address has been saved.']), + $this->equalTo(['You saved the address.']), \Magento\Framework\Message\MessageInterface::TYPE_SUCCESS ); $address = $this->accountManagement->getDefaultBillingAddress(1); @@ -157,7 +157,7 @@ class AddressTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringContains('customer/address/index')); $this->assertSessionMessages( - $this->equalTo(['The address has been deleted.']), + $this->equalTo(['You deleted the address.']), \Magento\Framework\Message\MessageInterface::TYPE_SUCCESS ); } diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/CartTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/CartTest.php index e68f3c496b63b31bacd8ac68f309e14e6d05a869..482e0d7f7c59ee70bddf6fad3cc8051b78757e44 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/CartTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/CartTest.php @@ -8,7 +8,7 @@ namespace Magento\Customer\Controller\Adminhtml\Cart\Product\Composite; /** * @magentoAppArea adminhtml */ -class CartTest extends \Magento\Backend\Utility\Controller +class CartTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @var \Magento\Quote\Model\Resource\Quote\Item\CollectionFactory diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/GroupTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/GroupTest.php index 93739deb389fea421397ddabb6c7bb612964b91b..87b52cbf40c2ab2feb03bc8951ec1d1474627ecb 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/GroupTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/GroupTest.php @@ -11,7 +11,7 @@ use Magento\TestFramework\Helper\Bootstrap; /** * @magentoAppArea adminhtml */ -class GroupTest extends \Magento\Backend\Utility\Controller +class GroupTest extends \Magento\TestFramework\TestCase\AbstractBackendController { const TAX_CLASS_ID = 3; const TAX_CLASS_NAME = 'Retail Customer'; @@ -97,7 +97,7 @@ class GroupTest extends \Magento\Backend\Utility\Controller * Check that success message is set */ $this->assertSessionMessages( - $this->equalTo(['The customer group has been deleted.']), + $this->equalTo(['You deleted the customer group.']), MessageInterface::TYPE_SUCCESS ); $this->assertRedirect($this->stringStartsWith(self::BASE_CONTROLLER_URL . 'index')); @@ -137,7 +137,7 @@ class GroupTest extends \Magento\Backend\Utility\Controller $this->assertSessionMessages($this->logicalNot($this->isEmpty()), MessageInterface::TYPE_SUCCESS); $this->assertSessionMessages( - $this->equalTo(['The customer group has been saved.']), + $this->equalTo(['You saved the customer group.']), MessageInterface::TYPE_SUCCESS ); diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php index 6eae4325406634be36b7e25ecc58000e3636243a..9126bb17030bb111e807a8170e6eaabca8c3b2be 100755 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php @@ -15,7 +15,7 @@ use Magento\TestFramework\Helper\Bootstrap; /** * @magentoAppArea adminhtml */ -class IndexTest extends \Magento\Backend\Utility\Controller +class IndexTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Base controller URL @@ -375,7 +375,7 @@ class IndexTest extends \Magento\Backend\Utility\Controller * Check that error message is set */ $this->assertSessionMessages( - $this->equalTo(['Customer with the same email already exists in associated website.']), + $this->equalTo(['A customer with the same email already exists in an associated website.']), \Magento\Framework\Message\MessageInterface::TYPE_ERROR ); $this->assertEquals( @@ -1018,7 +1018,7 @@ class IndexTest extends \Magento\Backend\Utility\Controller $this->getRequest()->setPostValue(['customer_id' => '1']); $this->dispatch('backend/customer/index/resetPassword'); $this->assertSessionMessages( - $this->equalTo(['Customer will receive an email with a link to reset password.']), + $this->equalTo(['The customer will receive an email with a link to reset password.']), \Magento\Framework\Message\MessageInterface::TYPE_SUCCESS ); $this->assertRedirect($this->stringStartsWith($this->_baseControllerUrl . 'edit')); diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php index 2fe6befd9c3bdf55461eba4e915d5ef0c8ab26ae..9e44c6b7339379b1bb9823b955c7f69ec494dc90 100755 --- a/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php @@ -135,7 +135,7 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase */ public function testLogin() { - // Customer e-mail and password are pulled from the fixture customer.php + // Customer email and password are pulled from the fixture customer.php $customer = $this->accountManagement->authenticate('customer@example.com', 'password', true); $this->assertSame('customer@example.com', $customer->getEmail()); @@ -149,7 +149,7 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase */ public function testLoginWrongPassword() { - // Customer e-mail and password are pulled from the fixture customer.php + // Customer email and password are pulled from the fixture customer.php $this->accountManagement->authenticate('customer@example.com', 'wrongPassword', true); } @@ -159,7 +159,7 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase */ public function testLoginWrongUsername() { - // Customer e-mail and password are pulled from the fixture customer.php + // Customer email and password are pulled from the fixture customer.php $this->accountManagement->authenticate('non_existing_user', 'password', true); } @@ -178,7 +178,7 @@ class AccountManagementTest extends \PHPUnit_Framework_TestCase * @magentoDataFixture Magento/Customer/_files/customer.php * * @expectedException \Magento\Framework\Exception\InvalidEmailOrPasswordException - * @expectedExceptionMessage Password doesn't match for this account + * @expectedExceptionMessage The password doesn't match this account. */ public function testChangePasswordWrongPassword() { diff --git a/dev/tests/integration/testsuite/Magento/DesignEditor/Controller/Adminhtml/System/Design/EditorTest.php b/dev/tests/integration/testsuite/Magento/DesignEditor/Controller/Adminhtml/System/Design/EditorTest.php index ae89b49fb049bd33e40df44fc2ff57d3a709326c..7e2b343e043ba53630faaa163eacb1749d4eba72 100644 --- a/dev/tests/integration/testsuite/Magento/DesignEditor/Controller/Adminhtml/System/Design/EditorTest.php +++ b/dev/tests/integration/testsuite/Magento/DesignEditor/Controller/Adminhtml/System/Design/EditorTest.php @@ -8,7 +8,7 @@ namespace Magento\DesignEditor\Controller\Adminhtml\System\Design; /** * @magentoAppArea adminhtml */ -class EditorTest extends \Magento\Backend\Utility\Controller +class EditorTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testIndexAction() { diff --git a/dev/tests/integration/testsuite/Magento/Downloadable/Controller/Adminhtml/Downloadable/FileTest.php b/dev/tests/integration/testsuite/Magento/Downloadable/Controller/Adminhtml/Downloadable/FileTest.php index 0060e0c30419b26866322a09d0a8c70d4cf833f0..81268a5d9d3ae0098d49e5e0e9538d2018e0c139 100644 --- a/dev/tests/integration/testsuite/Magento/Downloadable/Controller/Adminhtml/Downloadable/FileTest.php +++ b/dev/tests/integration/testsuite/Magento/Downloadable/Controller/Adminhtml/Downloadable/FileTest.php @@ -8,7 +8,7 @@ namespace Magento\Downloadable\Controller\Adminhtml\Downloadable; * See COPYING.txt for license details. * @magentoAppArea adminhtml */ -class FileTest extends \Magento\Backend\Utility\Controller +class FileTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testUploadAction() { diff --git a/dev/tests/integration/testsuite/Magento/Email/Controller/Adminhtml/Email/TemplateTest.php b/dev/tests/integration/testsuite/Magento/Email/Controller/Adminhtml/Email/TemplateTest.php index 510e10103042213cc42e20bc54500cb146d3bcd9..1e7a3ac5d75bb07ac96af5a9beb570ef4cee0901 100644 --- a/dev/tests/integration/testsuite/Magento/Email/Controller/Adminhtml/Email/TemplateTest.php +++ b/dev/tests/integration/testsuite/Magento/Email/Controller/Adminhtml/Email/TemplateTest.php @@ -8,7 +8,7 @@ namespace Magento\Email\Controller\Adminhtml\Email; /** * @magentoAppArea adminhtml */ -class TemplateTest extends \Magento\Backend\Utility\Controller +class TemplateTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testDefaultTemplateAction() { diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php b/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php index 06746a974e5b04da732eedcb072fd66dc8b0adbc..58db3fe5b812112453f26d4408cece2f45d45d5b 100644 --- a/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php +++ b/dev/tests/integration/testsuite/Magento/Email/Model/Template/FilterTest.php @@ -162,22 +162,22 @@ class FilterTest extends \PHPUnit_Framework_TestCase 'area parameter - omitted' => [ 'adminhtml', 'handle="email_template_test_handle"', - 'E-mail content for frontend/test_default theme', + 'Email content for frontend/test_default theme', ], 'area parameter - frontend' => [ 'adminhtml', 'handle="email_template_test_handle" area="frontend"', - 'E-mail content for frontend/test_default theme', + 'Email content for frontend/test_default theme', ], 'area parameter - backend' => [ 'frontend', 'handle="email_template_test_handle" area="adminhtml"', - 'E-mail content for adminhtml/test_default theme', + 'Email content for adminhtml/test_default theme', ], 'custom parameter' => [ 'frontend', 'handle="email_template_test_handle" template="Magento_Email::sample_email_content_custom.phtml"', - 'Custom E-mail content for frontend/test_default theme', + 'Custom Email content for frontend/test_default theme', ], ]; return $result; diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php index 70d92a6e3a017440a5333f356da2216e9d9b9d64..942f3466297e180ce4faf64d5098b53d5df4e925 100755 --- a/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php +++ b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php @@ -32,8 +32,8 @@ class TemplateTest extends \PHPUnit_Framework_TestCase )->setConstructorArgs( [ $objectManager->get('Magento\Framework\Model\Context'), - $objectManager->get('Magento\Framework\View\DesignInterface'), $objectManager->get('Magento\Framework\Registry'), + $objectManager->get('Magento\Framework\View\DesignInterface'), $objectManager->get('Magento\Store\Model\App\Emulation'), $objectManager->get('Magento\Store\Model\StoreManager'), $objectManager->create('Magento\Framework\Filesystem'), @@ -270,7 +270,7 @@ class TemplateTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Magento\Framework\Exception\MailException - * @expectedExceptionMessage The template Name must not be empty. + * @expectedExceptionMessage Please enter a template name. */ public function testBeforeSaveEmptyTemplateCode() { diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Email/templates/sample_email_content.phtml b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Email/templates/sample_email_content.phtml index 545dc82c315bfee85db0497e819dfc3e39262944..3b4b3ace449f97f1c526701ecd87a9504df58951 100644 --- a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Email/templates/sample_email_content.phtml +++ b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/adminhtml/test_default/Magento_Email/templates/sample_email_content.phtml @@ -4,4 +4,4 @@ * See COPYING.txt for license details. */ ?> -E-mail content for adminhtml/test_default theme +Email content for adminhtml/test_default theme diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/layout/email_template_test_handle.xml b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/layout/email_template_test_handle.xml index 767644707ff84fe0b5c19561a8bc28e2f0e02aaa..5d5eeba0a63bf3376e232c3d80f49fdb8573a43b 100644 --- a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/layout/email_template_test_handle.xml +++ b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/layout/email_template_test_handle.xml @@ -9,7 +9,7 @@ <block class="Magento\Framework\View\Element\Template" name="sample_email_content" template="Magento_Email::sample_email_content.phtml"/> <block class="Magento\Framework\View\Element\Text" name="ignored_email_content"> <action method="setText"> - <argument name="text" xsi:type="string">Ignored e-mail content, only the first block is used</argument> + <argument name="text" xsi:type="string">Ignored email content, only the first block is used</argument> </action> </block> </layout> diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content.phtml b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content.phtml index 6c448d817c69221e904b7d0c19280120582f44d5..7ba93b3a047bbd84c8e490ff8c944957161bde9c 100644 --- a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content.phtml +++ b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content.phtml @@ -4,4 +4,4 @@ * See COPYING.txt for license details. */ ?> -E-mail content for frontend/test_default theme +Email content for frontend/test_default theme diff --git a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content_custom.phtml b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content_custom.phtml index 01ca668c1b3b1d09f52b61d1c9a7f5727d1cb0ce..42fc2b23ebf44bcf46000d60952ca86f0c9b77fa 100644 --- a/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content_custom.phtml +++ b/dev/tests/integration/testsuite/Magento/Email/Model/_files/design/frontend/test_default/Magento_Email/templates/sample_email_content_custom.phtml @@ -4,4 +4,4 @@ * See COPYING.txt for license details. */ ?> -Custom E-mail content for frontend/test_default theme +Custom Email content for frontend/test_default theme diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/FrontControllerTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/FrontControllerTest.php index 5b84fa1bc9742a4822ca31e56c0d21e32e00ebfe..37158f3e4780d53a75c912f70655a9bc45d56a43 100755 --- a/dev/tests/integration/testsuite/Magento/Framework/App/FrontControllerTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/App/FrontControllerTest.php @@ -30,7 +30,7 @@ class FrontControllerTest extends \PHPUnit_Framework_TestCase public function testDispatch() { if (!\Magento\TestFramework\Helper\Bootstrap::canTestHeaders()) { - $this->markTestSkipped('Cant\'t test dispatch process without sending headers'); + $this->markTestSkipped('Can\'t test dispatch process without sending headers'); } $_SERVER['HTTP_HOST'] = 'localhost'; $this->_objectManager->get('Magento\Framework\App\State')->setAreaCode('frontend'); diff --git a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message.php b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message.php new file mode 100644 index 0000000000000000000000000000000000000000..56674a5ba813b2f929843d3be0bcb3c91d4d618f --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message.php @@ -0,0 +1,40 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +require __DIR__ . '/../../Customer/_files/customer.php'; + +$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + +/** @var \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository */ +$customerRepository = $objectManager->create('Magento\Customer\Api\CustomerRepositoryInterface'); +$customer = $customerRepository->getById(1); + +/** @var \Magento\GiftMessage\Model\Message $message */ +$message = $objectManager->create('Magento\GiftMessage\Model\Message'); +$message->setSender('Romeo'); +$message->setRecipient('Mercutio'); +$message->setMessage('I thought all for the best.'); +$message->save(); + +/** @var \Magento\Quote\Model\Quote $quote */ +$quote = $objectManager->create('Magento\Quote\Model\Quote'); +$quote->setData( + [ + 'store_id' => 1, + 'is_active' => 1, + 'reserved_order_id' => 'message_order_21', + 'gift_message_id' => $message->getId(), + ] +)->assignCustomer($customer); +$quote->save(); + +/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ +$quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); +$quoteIdMask->setQuoteId($quote->getId()); +$quoteIdMask->setDataChanges(true); +$quoteIdMask->save(); diff --git a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message_rollback.php b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message_rollback.php new file mode 100644 index 0000000000000000000000000000000000000000..42ae5826a8e72e9d515bb6c52f71003b108c720f --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message_rollback.php @@ -0,0 +1,18 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + +/** @var \Magento\Quote\Model\Quote $quote */ +$quote = $objectManager->create('Magento\Quote\Model\Quote'); +$quote->load('message_order_21', 'reserved_order_id'); + +/** @var \Magento\GiftMessage\Model\Message $message */ +$message = $objectManager->create('Magento\GiftMessage\Model\Message'); +$message->load($quote->getGiftMessageId()); +$message->delete(); + +$quote->delete(); diff --git a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_item_message.php b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_item_message.php index cb590f2ddd2d818b9126340b5c13e4ba366d46f2..cb56c205bad7144ef1dc45d51840c374fdc5e803 100644 --- a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_item_message.php +++ b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_item_message.php @@ -44,3 +44,11 @@ $message->setRecipient('Jane Roe'); $message->setMessage('Gift Message Text'); $message->save(); $quote->getItemByProduct($quoteProduct)->setGiftMessageId($message->getId())->save(); + +/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ +$quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); +$quoteIdMask->setQuoteId($quote->getId()); +$quoteIdMask->setDataChanges(true); +$quoteIdMask->save(); diff --git a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_message.php b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_message.php index 848b8d256241769a30cdd4f1a4eb6ba38e6bf68d..7a575f296fd59deaf631108d7fd0976fd6fece2e 100644 --- a/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_message.php +++ b/dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_message.php @@ -24,3 +24,11 @@ $quote->setData( ] ); $quote->save(); + +/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */ +$quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create('Magento\Quote\Model\QuoteIdMaskFactory') + ->create(); +$quoteIdMask->setQuoteId($quote->getId()); +$quoteIdMask->setDataChanges(true); +$quoteIdMask->save(); diff --git a/dev/tests/integration/testsuite/Magento/GoogleShopping/Controller/Adminhtml/GoogleShopping/ItemsTest.php b/dev/tests/integration/testsuite/Magento/GoogleShopping/Controller/Adminhtml/GoogleShopping/ItemsTest.php index 9862cb8df11b4c20e4463d4a12cce7e3fb6a9b9c..1a6e527bb5176f886f11b8d9dc302bddb2095cc6 100644 --- a/dev/tests/integration/testsuite/Magento/GoogleShopping/Controller/Adminhtml/GoogleShopping/ItemsTest.php +++ b/dev/tests/integration/testsuite/Magento/GoogleShopping/Controller/Adminhtml/GoogleShopping/ItemsTest.php @@ -8,7 +8,7 @@ namespace Magento\GoogleShopping\Controller\Adminhtml\GoogleShopping; /** * @magentoAppArea adminhtml */ -class ItemsTest extends \Magento\Backend\Utility\Controller +class ItemsTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testIndexAction() { diff --git a/dev/tests/integration/testsuite/Magento/GoogleShopping/Controller/Adminhtml/GoogleShopping/TypesTest.php b/dev/tests/integration/testsuite/Magento/GoogleShopping/Controller/Adminhtml/GoogleShopping/TypesTest.php index 6cdcb47a2c486ebf08c36294581cc75ddb8ee839..945d5c45c9d345b2e353a2c255b33eee580be5b5 100644 --- a/dev/tests/integration/testsuite/Magento/GoogleShopping/Controller/Adminhtml/GoogleShopping/TypesTest.php +++ b/dev/tests/integration/testsuite/Magento/GoogleShopping/Controller/Adminhtml/GoogleShopping/TypesTest.php @@ -8,7 +8,7 @@ namespace Magento\GoogleShopping\Controller\Adminhtml\GoogleShopping; /** * @magentoAppArea adminhtml */ -class TypesTest extends \Magento\Backend\Utility\Controller +class TypesTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testIndexAction() { diff --git a/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/ExportTest.php b/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/ExportTest.php index 02a60876b9dba091db31a101a434475a96374d2e..f001fae69deb741567a4844449d48838b9e9484f 100644 --- a/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/ExportTest.php +++ b/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/ExportTest.php @@ -8,7 +8,7 @@ namespace Magento\ImportExport\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class ExportTest extends \Magento\Backend\Utility\Controller +class ExportTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Set value of $_SERVER['HTTP_X_REQUESTED_WITH'] parameter here diff --git a/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/Import/ValidateTest.php b/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/Import/ValidateTest.php index 4667222256a4fdc04c359ae01442b72bb0374acd..6f25434d61bf56e11c13b47c60c5bc60219b41b6 100644 --- a/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/Import/ValidateTest.php +++ b/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/Import/ValidateTest.php @@ -10,7 +10,7 @@ use Magento\Framework\Filesystem\DirectoryList; /** * @magentoAppArea adminhtml */ -class ValidateTest extends \Magento\Backend\Utility\Controller +class ValidateTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @backupGlobals enabled @@ -62,7 +62,7 @@ class ValidateTest extends \Magento\Backend\Utility\Controller $this->dispatch('backend/admin/import/validate'); $this->assertContains('File is valid', $this->getResponse()->getBody()); - $this->assertNotContains('File was not uploaded', $this->getResponse()->getBody()); + $this->assertNotContains('The file was not uploaded.', $this->getResponse()->getBody()); $this->assertNotRegExp( '/clear[^\[]*\[[^\]]*(import_file|import_image_archive)[^\]]*\]/m', $this->getResponse()->getBody() diff --git a/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/ImportTest.php b/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/ImportTest.php index 36e888a964d0115c7597f07fc509f8ed1b15f6ce..75f0021126bf7b00f8e01dac0ade173eb5a543c4 100644 --- a/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/ImportTest.php +++ b/dev/tests/integration/testsuite/Magento/ImportExport/Controller/Adminhtml/ImportTest.php @@ -8,7 +8,7 @@ namespace Magento\ImportExport\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class ImportTest extends \Magento\Backend\Utility\Controller +class ImportTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testGetFilterAction() { diff --git a/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php b/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php index 82606ef75ea7b106c1b61dc2536e27f1cbd6a533..788e55647ad7b7aa306377e5c295818b0b45a484 100644 --- a/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php +++ b/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php @@ -155,7 +155,7 @@ class ImportTest extends \PHPUnit_Framework_TestCase * Test getEntityBehaviors with not existing behavior class * * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage Invalid behavior token for customer + * @expectedExceptionMessage The behavior token for customer is invalid. */ public function testGetEntityBehaviorsWithUnknownBehavior() { diff --git a/dev/tests/integration/testsuite/Magento/Indexer/Controller/Adminhtml/IndexerTest.php b/dev/tests/integration/testsuite/Magento/Indexer/Controller/Adminhtml/IndexerTest.php index 827606d2109cc98040774d98805329fe5ca57594..a2c49175f5378afa4ae9972aa15ad9f03151dbf5 100644 --- a/dev/tests/integration/testsuite/Magento/Indexer/Controller/Adminhtml/IndexerTest.php +++ b/dev/tests/integration/testsuite/Magento/Indexer/Controller/Adminhtml/IndexerTest.php @@ -8,7 +8,7 @@ namespace Magento\Indexer\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class IndexerTest extends \Magento\Backend\Utility\Controller +class IndexerTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Assert that current page is index management page and that it has indexers mode selector diff --git a/dev/tests/integration/testsuite/Magento/Integration/Controller/Adminhtml/IntegrationTest.php b/dev/tests/integration/testsuite/Magento/Integration/Controller/Adminhtml/IntegrationTest.php index eec5ee556e9cdf481f3c3420bd624ee7a94e9b94..5c281c22a5fe425acb0cd5197ea7aab06ec02149 100644 --- a/dev/tests/integration/testsuite/Magento/Integration/Controller/Adminhtml/IntegrationTest.php +++ b/dev/tests/integration/testsuite/Magento/Integration/Controller/Adminhtml/IntegrationTest.php @@ -13,7 +13,7 @@ namespace Magento\Integration\Controller\Adminhtml; * @magentoAppArea adminhtml * @magentoDbIsolation enabled */ -class IntegrationTest extends \Magento\Backend\Utility\Controller +class IntegrationTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** @var \Magento\Integration\Model\Integration */ private $_integration; diff --git a/dev/tests/integration/testsuite/Magento/Newsletter/Controller/Adminhtml/NewsletterQueueTest.php b/dev/tests/integration/testsuite/Magento/Newsletter/Controller/Adminhtml/NewsletterQueueTest.php index 63b8f840c854907776def98ea5069ec859a97fab..5da58b332295708127c6560f6d701574dd2d560d 100644 --- a/dev/tests/integration/testsuite/Magento/Newsletter/Controller/Adminhtml/NewsletterQueueTest.php +++ b/dev/tests/integration/testsuite/Magento/Newsletter/Controller/Adminhtml/NewsletterQueueTest.php @@ -8,7 +8,7 @@ namespace Magento\Newsletter\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class NewsletterQueueTest extends \Magento\Backend\Utility\Controller +class NewsletterQueueTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @var \Magento\Newsletter\Model\Template @@ -62,7 +62,7 @@ class NewsletterQueueTest extends \Magento\Backend\Utility\Controller * Check that success message is set */ $this->assertSessionMessages( - $this->equalTo(['The newsletter queue has been saved.']), + $this->equalTo(['You saved the newsletter queue.']), \Magento\Framework\Message\MessageInterface::TYPE_SUCCESS ); } diff --git a/dev/tests/integration/testsuite/Magento/Newsletter/Controller/Adminhtml/NewsletterTemplateTest.php b/dev/tests/integration/testsuite/Magento/Newsletter/Controller/Adminhtml/NewsletterTemplateTest.php index 3922013af5d5b74accd1b8a8aaeae5937c4f1ce6..a626b60004c8a7b8c90d72e17a483788ebb1e694 100644 --- a/dev/tests/integration/testsuite/Magento/Newsletter/Controller/Adminhtml/NewsletterTemplateTest.php +++ b/dev/tests/integration/testsuite/Magento/Newsletter/Controller/Adminhtml/NewsletterTemplateTest.php @@ -8,7 +8,7 @@ namespace Magento\Newsletter\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class NewsletterTemplateTest extends \Magento\Backend\Utility\Controller +class NewsletterTemplateTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @var \Magento\Newsletter\Model\Template diff --git a/dev/tests/integration/testsuite/Magento/PageCache/Block/System/Config/Form/Field/ExportTest.php b/dev/tests/integration/testsuite/Magento/PageCache/Block/System/Config/Form/Field/ExportTest.php index f5a343241c2e834a4ad7ae2b794ea979b9d31f61..695ae56b1f7205a938b1f112c6808cc5855548ed 100644 --- a/dev/tests/integration/testsuite/Magento/PageCache/Block/System/Config/Form/Field/ExportTest.php +++ b/dev/tests/integration/testsuite/Magento/PageCache/Block/System/Config/Form/Field/ExportTest.php @@ -8,7 +8,7 @@ namespace Magento\PageCache\Block\System\Config\Form\Field; /** * @magentoAppArea adminhtml */ -class ExportTest extends \Magento\Backend\Utility\Controller +class ExportTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Check Varnish export buttons diff --git a/dev/tests/integration/testsuite/Magento/Reports/Controller/Adminhtml/Report/Product/ViewedTest.php b/dev/tests/integration/testsuite/Magento/Reports/Controller/Adminhtml/Report/Product/ViewedTest.php index 44035ad0d3a55cf049c412e06d190f5cf85ed445..c75c03e7a6a025e29a47af6361d794b756ba1881 100644 --- a/dev/tests/integration/testsuite/Magento/Reports/Controller/Adminhtml/Report/Product/ViewedTest.php +++ b/dev/tests/integration/testsuite/Magento/Reports/Controller/Adminhtml/Report/Product/ViewedTest.php @@ -11,7 +11,7 @@ namespace Magento\Reports\Controller\Adminhtml\Report\Product; /** * @magentoAppArea adminhtml */ -class ViewedTest extends \Magento\Backend\Utility\Controller +class ViewedTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testExecute() { diff --git a/dev/tests/integration/testsuite/Magento/Sales/Block/Adminhtml/Order/View/InfoTest.php b/dev/tests/integration/testsuite/Magento/Sales/Block/Adminhtml/Order/View/InfoTest.php index 3995996455974b9767dd32cc470c48791ae39c7d..94ffd027c1da562d790911641b6edf193152e412 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Block/Adminhtml/Order/View/InfoTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Block/Adminhtml/Order/View/InfoTest.php @@ -8,7 +8,7 @@ namespace Magento\Sales\Block\Adminhtml\Order\View; /** * Test class for \Magento\Sales\Block\Adminhtml\Order\View\Info */ -class InfoTest extends \Magento\Backend\Utility\Controller +class InfoTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Value for the user defined custom attribute, which is created by attribute_user_defined_customer.php fixture. diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddCommentTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddCommentTest.php new file mode 100644 index 0000000000000000000000000000000000000000..be01007ab3885041af5aed43372d17f3682c532d --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddCommentTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Order; + +class AddCommentTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::comment'; + $this->uri = 'backend/sales/order/addcomment'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressSaveTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressSaveTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8859a8453c410d83771630c74a6ada661941b006 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressSaveTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Order; + +class AddressSaveTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::actions_edit'; + $this->uri = 'backend/sales/order/addresssave'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a986a948e8235b029335310a844a71a3235c9865 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Order; + +class AddressTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::actions_edit'; + $this->uri = 'backend/sales/order/address'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CancelTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CancelTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7f37712982a85bd8ff37aaf68469d4aa63bc8786 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CancelTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Order; + +class CancelTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::cancel'; + $this->uri = 'backend/sales/order/cancel'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreateTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreateTest.php index 9514e649404e054dcfc4ba7d1a3eaf3c55006859..edc7f00ce5e217727707a2ebf3adbc5672d8d1ef 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreateTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreateTest.php @@ -9,7 +9,7 @@ namespace Magento\Sales\Controller\Adminhtml\Order; * @magentoAppArea adminhtml * @magentoDbIsolation enabled */ -class CreateTest extends \Magento\Backend\Utility\Controller +class CreateTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testLoadBlockAction() { diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreditmemoTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreditmemoTest.php index 5e33aac4557c9475b3f17ddc19cddf2b8fef8070..1f9834830161845426de0bbd59b2937762a9dc07 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreditmemoTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreditmemoTest.php @@ -8,7 +8,7 @@ namespace Magento\Sales\Controller\Adminhtml\Order; /** * @magentoAppArea adminhtml */ -class CreditmemoTest extends \Magento\Backend\Utility\Controller +class CreditmemoTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @magentoConfigFixture current_store cataloginventory/item_options/auto_return 1 diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/EmailTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/EmailTest.php new file mode 100644 index 0000000000000000000000000000000000000000..406511061d4fe5bbec957b2e7710bb75353babd6 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/EmailTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Order; + +class EmailTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::email'; + $this->uri = 'backend/sales/order/email'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/HoldTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/HoldTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8c85de19064010eab3a6aad6113291c63666310a --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/HoldTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Order; + +class HoldTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::hold'; + $this->uri = 'backend/sales/order/hold'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ReviewPaymentTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ReviewPaymentTest.php new file mode 100644 index 0000000000000000000000000000000000000000..042d5b7b2e237c518128de0e4792b86c3add07a5 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ReviewPaymentTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Order; + +class ReviewPaymentTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::review_payment'; + $this->uri = 'backend/sales/order/reviewpayment'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/UnholdTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/UnholdTest.php new file mode 100644 index 0000000000000000000000000000000000000000..33e83893556e43de5098d2dc1b8e22953d78a096 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/UnholdTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Order; + +class UnholdTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::unhold'; + $this->uri = 'backend/sales/order/unhold'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ViewTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ViewTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f61a32c5080268239e440d8659f3a3a323fbc539 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ViewTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Order; + +class ViewTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::actions_view'; + $this->uri = 'backend/sales/order/view'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/OrderTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/OrderTest.php index bb770aca97b952845770050e4c6ad895f80dadeb..7198676eaf45c6ee1a25e8072a78f106280417c1 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/OrderTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/OrderTest.php @@ -8,7 +8,7 @@ namespace Magento\Sales\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class OrderTest extends \Magento\Backend\Utility\Controller +class OrderTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testIndexAction() { @@ -100,7 +100,7 @@ class OrderTest extends \Magento\Backend\Utility\Controller [ 'status' => 'processing', 'comment' => '', - 'response' => '{"error":true,"message":"Comment text cannot be empty."}' + 'response' => '{"error":true,"message":"Please enter a comment."}' ] ]; } diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/FetchTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/FetchTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d1191b8fdce496f4fb678811106cab3eb579f8b3 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/FetchTest.php @@ -0,0 +1,18 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Transactions; + +use Magento\TestFramework\TestCase\AbstractBackendController; + +class FetchTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::transactions_fetch'; + $this->uri = 'backend/sales/transactions/fetch'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Tax/Controller/Adminhtml/RateTest.php b/dev/tests/integration/testsuite/Magento/Tax/Controller/Adminhtml/RateTest.php index f91ac38ec5effe8a65f465a36f0d99ae0a27df30..d308c6834ef1a827e99c30000b7adb68c32af82e 100644 --- a/dev/tests/integration/testsuite/Magento/Tax/Controller/Adminhtml/RateTest.php +++ b/dev/tests/integration/testsuite/Magento/Tax/Controller/Adminhtml/RateTest.php @@ -8,7 +8,7 @@ namespace Magento\Tax\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class RateTest extends \Magento\Backend\Utility\Controller +class RateTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @dataProvider ajaxSaveActionDataProvider diff --git a/dev/tests/integration/testsuite/Magento/Tax/Controller/Adminhtml/TaxTest.php b/dev/tests/integration/testsuite/Magento/Tax/Controller/Adminhtml/TaxTest.php index f2c5c66bac73725a19539c16a0335537eea75a57..deaef7f6999809fa4a887f3c532c111275c75320 100644 --- a/dev/tests/integration/testsuite/Magento/Tax/Controller/Adminhtml/TaxTest.php +++ b/dev/tests/integration/testsuite/Magento/Tax/Controller/Adminhtml/TaxTest.php @@ -10,7 +10,7 @@ use Magento\Framework\Exception\NoSuchEntityException; /** * @magentoAppArea adminhtml */ -class TaxTest extends \Magento\Backend\Utility\Controller +class TaxTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @dataProvider ajaxActionDataProvider diff --git a/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPostTest.php b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPostTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d49cdc7ec840b1a6106a4c5fa14c759816a9d752 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPostTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TaxImportExport\Controller\Adminhtml\Rate; + +class ExportPostTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::transactions_fetch'; + $this->uri = 'backend/sales/transactions/fetch'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExportTest.php b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExportTest.php new file mode 100644 index 0000000000000000000000000000000000000000..34e08d3848b77f2a9cafe6fd69169abe4b0d0675 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExportTest.php @@ -0,0 +1,18 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TaxImportExport\Controller\Adminhtml\Rate; + +use Magento\TestFramework\TestCase\AbstractBackendController; + +class ImportExportTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::transactions_fetch'; + $this->uri = 'backend/sales/transactions/fetch'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPostTest.php b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPostTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7034236c8cc598a5f78d109ab7fd7d3c24ea678b --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPostTest.php @@ -0,0 +1,18 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\TaxImportExport\Controller\Adminhtml\Rate; + +use Magento\TestFramework\TestCase\AbstractBackendController; + +class ImportPostTest extends \Magento\TestFramework\TestCase\AbstractBackendController +{ + public function setUp() + { + $this->resource = 'Magento_Sales::transactions_fetch'; + $this->uri = 'backend/sales/transactions/fetch'; + parent::setUp(); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Theme/Controller/Adminhtml/System/Design/ThemeControllerTest.php b/dev/tests/integration/testsuite/Magento/Theme/Controller/Adminhtml/System/Design/ThemeControllerTest.php index e33d95da85e615e36efc3d908bf6eedbba91a8ad..a11f0ed5aeeb5ba700872f9fff971d9d54ee83d3 100644 --- a/dev/tests/integration/testsuite/Magento/Theme/Controller/Adminhtml/System/Design/ThemeControllerTest.php +++ b/dev/tests/integration/testsuite/Magento/Theme/Controller/Adminhtml/System/Design/ThemeControllerTest.php @@ -11,7 +11,7 @@ use Magento\Framework\Filesystem\DirectoryList; /** * @magentoAppArea adminhtml */ -class ThemeControllerTest extends \Magento\Backend\Utility\Controller +class ThemeControllerTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testUploadJsAction() { diff --git a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Catalog/Edit/FormTest.php b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Catalog/Edit/FormTest.php index d4780d259aafb1213be6b66d7b5329f425ebea5a..cf3101240d285fc15dad60f1026e0a5b5b60ef34 100644 --- a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Catalog/Edit/FormTest.php +++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Catalog/Edit/FormTest.php @@ -177,7 +177,7 @@ class FormTest extends \PHPUnit_Framework_TestCase $form = $this->_getFormInstance($args); $this->assertEquals([], $form->getElement('store_id')->getValues()); $this->assertEquals( - 'We can\'t set up a URL rewrite because the category you chose is not associated with a website.', + 'Please assign a website to the selected category.', $form->getElement('store_id')->getAfterElementHtml() ); } diff --git a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/Edit/FormTest.php b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/Edit/FormTest.php index 8eb255b89d94b35401db85052a114f4fc2577567..f84835366f0cfcc9f70a2c1e09c00ee2394783da 100644 --- a/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/Edit/FormTest.php +++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Cms/Page/Edit/FormTest.php @@ -99,7 +99,7 @@ class FormTest extends \PHPUnit_Framework_TestCase $form = $this->_getFormInstance($args); $this->assertEquals([], $form->getElement('store_id')->getValues()); $this->assertEquals( - 'Chosen cms page does not associated with any website.', + 'Please assign a website to the selected CMS page.', $form->getElement('store_id')->getAfterElementHtml() ); } diff --git a/dev/tests/integration/testsuite/Magento/User/Block/User/Edit/Tab/MainTest.php b/dev/tests/integration/testsuite/Magento/User/Block/User/Edit/Tab/MainTest.php index 27f28a4d6f77ecc636b1f41091068f6a7bbb6d15..79a1ba4425db6ea83f91cf3e6d9d6d9c4873a3d1 100644 --- a/dev/tests/integration/testsuite/Magento/User/Block/User/Edit/Tab/MainTest.php +++ b/dev/tests/integration/testsuite/Magento/User/Block/User/Edit/Tab/MainTest.php @@ -8,7 +8,7 @@ namespace Magento\User\Block\User\Edit\Tab; /** * @magentoAppArea adminhtml */ -class MainTest extends \Magento\Backend\Utility\Controller +class MainTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @var \Magento\User\Block\User\Edit\Tab\Main diff --git a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/AuthTest.php b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/AuthTest.php index 5b9c0f3f53801ac13305994e4cbbc96970a2f8e5..052030a1552fdea8b931479d501192c0873f738b 100644 --- a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/AuthTest.php +++ b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/AuthTest.php @@ -10,7 +10,7 @@ namespace Magento\User\Controller\Adminhtml; * * @magentoAppArea adminhtml */ -class AuthTest extends \Magento\Backend\Utility\Controller +class AuthTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Test form existence diff --git a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/InvalidateTokenTest.php b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/InvalidateTokenTest.php index 72df2422c7b55c972ef57947688f790530e5bf36..58f4fc2dabea0bfdb31047a52dceb25460a16076 100644 --- a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/InvalidateTokenTest.php +++ b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/InvalidateTokenTest.php @@ -14,7 +14,7 @@ use Magento\TestFramework\Helper\Bootstrap; /** * Test class for Magento\User\Controller\Adminhtml\User\InvalidateToken. */ -class InvalidateTokenTest extends \Magento\Backend\Utility\Controller +class InvalidateTokenTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @magentoDataFixture Magento/User/_files/user_with_role.php diff --git a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php index 1683937313c4057dd0f36f9b92f4836607c669e8..932351fb427b712787c64a420f9c86e428f0f5d1 100644 --- a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php +++ b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php @@ -10,7 +10,7 @@ namespace Magento\User\Controller\Adminhtml\User; * * @magentoAppArea adminhtml */ -class RoleTest extends \Magento\Backend\Utility\Controller +class RoleTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testEditRoleAction() { diff --git a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/UserTest.php b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/UserTest.php index f6fa8857422203c5e92a27aad738964eb44c3077..6755a354da484e993a537a47c5a91556e9ba1c22 100644 --- a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/UserTest.php +++ b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/UserTest.php @@ -10,7 +10,7 @@ use Magento\TestFramework\Bootstrap; /** * @magentoAppArea adminhtml */ -class UserTest extends \Magento\Backend\Utility\Controller +class UserTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function testIndexAction() { diff --git a/dev/tests/integration/testsuite/Magento/Variable/Controller/Adminhtml/System/VariableTest.php b/dev/tests/integration/testsuite/Magento/Variable/Controller/Adminhtml/System/VariableTest.php index 9b50fdcbc477ec4eae68ad518f8e071600e26867..f7601ddca76d98124e3190b78afec7c51174b9b0 100644 --- a/dev/tests/integration/testsuite/Magento/Variable/Controller/Adminhtml/System/VariableTest.php +++ b/dev/tests/integration/testsuite/Magento/Variable/Controller/Adminhtml/System/VariableTest.php @@ -8,7 +8,7 @@ namespace Magento\Variable\Controller\Adminhtml\System; /** * @magentoAppArea adminhtml */ -class VariableTest extends \Magento\Backend\Utility\Controller +class VariableTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * @covers \Magento\Backend\App\Action::_addLeft diff --git a/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php b/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php new file mode 100644 index 0000000000000000000000000000000000000000..3fcd52372495618c34abe710326e17066c4d704f --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php @@ -0,0 +1,34 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Version\Controller\Index; + +class IndexTest extends \Magento\TestFramework\TestCase\AbstractController +{ + public function testIndexAction() + { + // Execute controller to get version response + $this->dispatch('magento_version/index/index'); + $body = $this->getResponse()->getBody(); + + $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + /** @var \Magento\Framework\App\ProductMetadataInterface $productMetadata */ + $productMetadata = $objectManager->get('Magento\Framework\App\ProductMetadataInterface'); + $name = $productMetadata->getName(); + $edition = $productMetadata->getEdition(); + + $fullVersion = $productMetadata->getVersion(); + $versionParts = explode('.', $fullVersion); + $majorMinor = $versionParts[0] . '.' . $versionParts[1]; + + // Response must contain Major.Minor version, product name, and edition + $this->assertContains($majorMinor, $body); + $this->assertContains($name, $body); + $this->assertContains($edition, $body); + + // Response must not contain full version including patch version + $this->assertNotContains($fullVersion, $body); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Widget/Controller/Adminhtml/Widget/InstanceTest.php b/dev/tests/integration/testsuite/Magento/Widget/Controller/Adminhtml/Widget/InstanceTest.php index 2f72dcf52197624a6fd609175e58ceb289538508..30dbf0cf1816b31252c76fb8936fff6084d1f9c4 100644 --- a/dev/tests/integration/testsuite/Magento/Widget/Controller/Adminhtml/Widget/InstanceTest.php +++ b/dev/tests/integration/testsuite/Magento/Widget/Controller/Adminhtml/Widget/InstanceTest.php @@ -8,7 +8,7 @@ namespace Magento\Widget\Controller\Adminhtml\Widget; /** * @magentoAppArea adminhtml */ -class InstanceTest extends \Magento\Backend\Utility\Controller +class InstanceTest extends \Magento\TestFramework\TestCase\AbstractBackendController { protected function setUp() { diff --git a/dev/tests/integration/testsuite/Magento/Widget/Controller/Adminhtml/WidgetTest.php b/dev/tests/integration/testsuite/Magento/Widget/Controller/Adminhtml/WidgetTest.php index 0b36d7cd5b35d7aee117d90cdfd01b9dbf5bf08d..90f1d482a23dc7c2c2603adb46e100371b759a19 100644 --- a/dev/tests/integration/testsuite/Magento/Widget/Controller/Adminhtml/WidgetTest.php +++ b/dev/tests/integration/testsuite/Magento/Widget/Controller/Adminhtml/WidgetTest.php @@ -8,7 +8,7 @@ namespace Magento\Widget\Controller\Adminhtml; /** * @magentoAppArea adminhtml */ -class WidgetTest extends \Magento\Backend\Utility\Controller +class WidgetTest extends \Magento\TestFramework\TestCase\AbstractBackendController { /** * Partially covers \Magento\Widget\Block\Adminhtml\Widget\Options::_addField() diff --git a/dev/tests/performance/benchmark.jmx b/dev/tests/performance/benchmark.jmx index 77934c61897c52225fd378fe738a06312b0dbbf1..6fda461b91e00c23daa17bf64a3f578f456c5ffc 100644 --- a/dev/tests/performance/benchmark.jmx +++ b/dev/tests/performance/benchmark.jmx @@ -1143,7 +1143,7 @@ <hashTree> <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assert success" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="890055751">You are now logged out</stringProp> + <stringProp name="890055751">You are signed out.</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> diff --git a/dev/tests/performance/testsuite/advanced_search.jmx b/dev/tests/performance/testsuite/advanced_search.jmx index 9b9679b2311b6bf69094920dfb2c42bc49b6ec5f..99aa94c587a53b2c2d0037710e36709cf7fc7667 100644 --- a/dev/tests/performance/testsuite/advanced_search.jmx +++ b/dev/tests/performance/testsuite/advanced_search.jmx @@ -158,7 +158,7 @@ <hashTree> <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Assertion: Non-Empty Search Results" enabled="true"> <collectionProp name="Asserion.test_strings"> - <stringProp name="110843263">No items were found using the following search criteria</stringProp> + <stringProp name="110843263">We can\'t find any items matching these search criteria.</stringProp> </collectionProp> <stringProp name="Assertion.test_field">Assertion.response_data</stringProp> <boolProp name="Assertion.assume_success">false</boolProp> diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Widget/_files/invalid_widget.xml b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Widget/_files/invalid_widget.xml index 9648839a4b6fa13b79396db049156ea5b546f409..98ee95ccfa0e3a2e46d2c3f94623ea08053d4768 100644 --- a/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Widget/_files/invalid_widget.xml +++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Widget/_files/invalid_widget.xml @@ -91,7 +91,7 @@ </parameter> <parameter name="anchor_text" type="text" visible="true" translate="label description"> <label>Anchor Custom Text</label> - <description>If empty, the Product Name will be used</description> + <description>If empty, we'll use the product name here.</description> </parameter> <parameter name="title" type="text" visible="true" translate="label"> <label>Anchor Custom Title</label> @@ -123,7 +123,7 @@ </parameter> <parameter name="anchor_text" type="text" visible="true" translate="label description"> <label>Anchor Custom Text</label> - <description>If empty, the Category Name will be used</description> + <description>If empty, we'll use the category name here.</description> </parameter> <parameter name="title" type="text" visible="true" translate="label"> <label>Anchor Custom Title</label> diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php index 1ae037a2b477a3957cc658ecdac90f7e737eef1e..ffd2dd8bb778d3e9c0650350d663d3c1d1dd8b7b 100644 --- a/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php +++ b/dev/tests/static/testsuite/Magento/Test/Integrity/_files/dependency_test/tables_ce.php @@ -90,7 +90,6 @@ return [ 'cataloginventory_stock_status' => 'Magento\CatalogInventory', 'cataloginventory_stock_status_idx' => 'Magento\CatalogInventory', 'cataloginventory_stock_status_tmp' => 'Magento\CatalogInventory', - 'catalogrule_affected_product' => 'Magento\CatalogRule', 'catalogrule_customer_group' => 'Magento\CatalogRule', 'catalogrule' => 'Magento\CatalogRule', 'catalogrule_group_website' => 'Magento\CatalogRule', diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index 7e83ed446bb590bb0c35c7a0dbd7b87ff41ab10a..c563b677620382c5b08c868fec60488247f6d359 100755 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3657,5 +3657,6 @@ return [ ['Magento\Centinel\Test\TestCase\CentinelPaymentsValidCcTest'], ['Magento\Centinel\CreateOrderTest'], ['Magento\Payment\Model\Checks\PaymentMethodChecksInterface', 'Magento\Payment\Model\MethodInterface'], + ['Magento\GiftMessage\Model\Plugin\TotalsDataProcessorPlugin'], ['Magento\Catalog\Model\Product\Attribute\Backend\Startdate', 'Magento\Catalog\Model\Attribute\Backend\Startdate'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 0190eae3befa0fb582a3001a28c48da09cd22df8..b2ac847c21585fcfb2f533d683401d3d2df00319 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2257,5 +2257,10 @@ return [ ['getOrigData', 'Magento\Framework\Object', 'Moved to Magento\Framework\Model\AbstractModel'], ['dataHasChangedFor', 'Magento\Framework\Object', 'Moved to Magento\Framework\Model\AbstractModel'], ['setDataChanges', 'Magento\Framework\Object', 'Moved to Magento\Framework\Model\AbstractModel'], + [ + 'getConfigureUrl', + 'Magento\Checkout\Block\Cart\Item\Renderer', + '\Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit::getConfigureUrl' + ], ['getCurrenCategoryKey', 'Magento\Catalog\Block\Navigation', 'getCurrentCategoryKey'], ]; diff --git a/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php b/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php index b154d0183f2a3583c5bb0c1183e6fc2ffc3c7d6e..f8889d4f2cb4937f0d4a12aefb1c04254a8d78f7 100644 --- a/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php +++ b/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php @@ -105,7 +105,6 @@ return [ 'cataloginventory/stock_status' => 'cataloginventory_stock_status', 'cataloginventory/stock_status_indexer_idx' => 'cataloginventory_stock_status_idx', 'cataloginventory/stock_status_indexer_tmp' => 'cataloginventory_stock_status_tmp', - 'catalogrule/affected_product' => 'catalogrule_affected_product', 'catalogrule/customer_group' => 'catalogrule_customer_group', 'catalogrule/rule' => 'catalogrule', 'catalogrule/rule_group_website' => 'catalogrule_group_website', diff --git a/lib/internal/Magento/Framework/App/Resource.php b/lib/internal/Magento/Framework/App/Resource.php index d76a3a68bdcafbc35eda2c73dc8b1868fb39ee61..fae3cdb761c5fc502aef804db2f7b59f492ef335 100644 --- a/lib/internal/Magento/Framework/App/Resource.php +++ b/lib/internal/Magento/Framework/App/Resource.php @@ -85,6 +85,7 @@ class Resource * * @param string $resourceName * @return \Magento\Framework\DB\Adapter\AdapterInterface|false + * @codeCoverageIgnore */ public function getConnection($resourceName) { @@ -152,12 +153,26 @@ class Resource return $this->getConnection($connectionName)->getTableName($tableName); } + /** + * Build a trigger name + * + * @param string $tableName The table that is the subject of the trigger + * @param string $time Either "before" or "after" + * @param string $event The DB level event which activates the trigger, i.e. "update" or "insert" + * @return string + */ + public function getTriggerName($tableName, $time, $event) + { + return $this->getConnection(self::DEFAULT_READ_RESOURCE)->getTriggerName($tableName, $time, $event); + } + /** * Set mapped table name * * @param string $tableName * @param string $mappedName * @return $this + * @codeCoverageIgnore */ public function setMappedTableName($tableName, $mappedName) { @@ -193,13 +208,12 @@ class Resource $fields, $indexType = \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX ) { - return $this->getConnection( - self::DEFAULT_READ_RESOURCE - )->getIndexName( - $this->getTableName($tableName), - $fields, - $indexType - ); + return $this->getConnection(self::DEFAULT_READ_RESOURCE) + ->getIndexName( + $this->getTableName($tableName), + $fields, + $indexType + ); } /** diff --git a/lib/internal/Magento/Framework/App/Response/Http.php b/lib/internal/Magento/Framework/App/Response/Http.php index 55cda163252ab018807cc5d3323fc134e27146f0..3f419b71acf21f335ce6b1e99d3252f46a8d4689 100644 --- a/lib/internal/Magento/Framework/App/Response/Http.php +++ b/lib/internal/Magento/Framework/App/Response/Http.php @@ -21,6 +21,9 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response /** Format for expiration timestamp headers */ const EXPIRATION_TIMESTAMP_FORMAT = 'D, d M Y H:i:s T'; + /** X-FRAME-OPTIONS Header name */ + const HEADER_X_FRAME_OPT = 'X-Frame-Options'; + /** @var \Magento\Framework\Stdlib\CookieManagerInterface */ protected $cookieManager; @@ -51,6 +54,17 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response $this->dateTime = $dateTime; } + /** + * Sends the X-FRAME-OPTIONS header to protect against click-jacking + * + * @param string $value + * @return void + */ + public function setXFrameOptions($value) + { + $this->setHeader(self::HEADER_X_FRAME_OPT, $value); + } + /** * Send Vary cookie * @@ -109,6 +123,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response * Set headers for no-cache responses * * @return void + * @codeCoverageIgnore */ public function setNoCacheHeaders() { @@ -122,6 +137,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response * * @param string $content String in JSON format * @return \Magento\Framework\App\Response\Http + * @codeCoverageIgnore */ public function representJson($content) { @@ -131,6 +147,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response /** * @return string[] + * @codeCoverageIgnore */ public function __sleep() { @@ -141,6 +158,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response * Need to reconstruct dependencies when being de-serialized. * * @return void + * @codeCoverageIgnore */ public function __wakeup() { @@ -154,6 +172,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response * * @param string $time * @return string + * @codeCoverageIgnore */ protected function getExpirationHeader($time) { diff --git a/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php b/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php new file mode 100644 index 0000000000000000000000000000000000000000..a108b754893e0ecc1eed081e0e0fe47dcb0f4790 --- /dev/null +++ b/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php @@ -0,0 +1,43 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Framework\App\Response; + +/** + * Adds an X-FRAME-OPTIONS header to HTTP responses to safeguard against click-jacking. + */ +class XFrameOptPlugin +{ + /** Deployment config key for frontend x-frame-options header value */ + const DEPLOYMENT_CONFIG_X_FRAME_OPT = 'x-frame-options'; + + /** Always send SAMEORIGIN in backend x-frame-options header */ + const BACKEND_X_FRAME_OPT = 'SAMEORIGIN'; + + /** + *The header value + * @var string + */ + private $xFrameOpt; + + /** + * @param string $xFrameOpt + */ + public function __construct($xFrameOpt) + { + $this->xFrameOpt = $xFrameOpt; + } + + /** + * @param \Magento\Framework\App\Response\Http $subject + * @return void + * @codeCoverageIgnore + */ + public function beforeSendResponse(\Magento\Framework\App\Response\Http $subject) + { + $subject->setXFrameOptions($this->xFrameOpt); + } +} diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ResourceTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ResourceTest.php index a92a9eb73432db63d22a8b28c104da5ec28360f4..86fc5bf7ac92bcbd89d423311a0fd3fc9be8cfbe 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/ResourceTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/ResourceTest.php @@ -14,7 +14,7 @@ use Magento\Framework\Config\ConfigOptionsListConstants; class ResourceTest extends \PHPUnit_Framework_TestCase { const RESOURCE_NAME = \Magento\Framework\App\Resource::DEFAULT_READ_RESOURCE; - const CONNECTION_NAME = 'Connection Name'; + const CONNECTION_NAME = 'connection-name'; const TABLE_PREFIX = 'prefix_'; /** @@ -197,4 +197,21 @@ class ResourceTest extends \PHPUnit_Framework_TestCase $this->assertEquals('fkName', $this->resource->getFkName($table, $columnName, $refTable, $refColumnName)); } + + public function testGetTriggerName() + { + $tableName = 'subject_table'; + $time = 'before'; + $event = 'insert'; + $triggerName = 'trg_subject_table_before_insert'; + + $this->_connectionFactory->expects($this->once()) + ->method('create') + ->will($this->returnValue($this->connection)); + $this->connection->expects($this->once()) + ->method('getTriggerName') + ->with($tableName, $time, $event) + ->willReturn($triggerName); + $this->assertSame($triggerName, $this->resource->getTriggerName($tableName, $time, $event)); + } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php index 3fb38007f0a56a0152d2caabd4e0f3109551e0dd..bcc51a53e3e9dc4b1b1c4aeb2110a9f83e60de38 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php @@ -271,4 +271,11 @@ class HttpTest extends \PHPUnit_Framework_TestCase \Magento\Framework\App\ObjectManager::setInstance($objectManagerMock); $this->model->__wakeup(); } + + public function testSetXFrameOptions() + { + $value = 'DENY'; + $this->model->setXFrameOptions($value); + $this->assertSame($value, $this->model->getHeader(Http::HEADER_X_FRAME_OPT)->getFieldValue()); + } } diff --git a/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php b/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php index f6de3f89043da2b1ce6eddc60dc635fb45a1d2cb..3148109e53938eaabe116b2340b9a5ac2cd4e350 100644 --- a/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php +++ b/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php @@ -22,6 +22,7 @@ class ConfigOptionsListConstants const CONFIG_PATH_DB_CONNECTION_DEFAULT = 'db/connection/default'; const CONFIG_PATH_DB_CONNECTIONS = 'db/connection'; const CONFIG_PATH_DB_PREFIX = 'db/table_prefix'; + const CONFIG_PATH_X_FRAME_OPT = 'x-frame-options'; /**#@-*/ /**#@+ @@ -67,7 +68,7 @@ class ConfigOptionsListConstants const KEY_INIT_STATEMENTS = 'initStatements'; const KEY_ACTIVE = 'active'; /**#@-*/ - + /** * Db config key */ diff --git a/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php b/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php index 96eb992ade3f58cd9e3d6860c36fc1310baacd4b..c2068fe188cde418899fcebaf5ddcc340259e89c 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php +++ b/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php @@ -129,6 +129,16 @@ interface AdapterInterface */ public function createTemporaryTable(Table $table); + /** + * Create temporary table from other table + * + * @param string $temporaryTableName + * @param string $originTableName + * @param bool $ifNotExists + * @return \Zend_Db_Statement_Interface + */ + public function createTemporaryTableLike($temporaryTableName, $originTableName, $ifNotExists = false); + /** * Drop temporary table from database * @@ -918,6 +928,17 @@ interface AdapterInterface */ public function getTableName($tableName); + + /** + * Build a trigger name based on table name and trigger details + * + * @param string $tableName The table that is the subject of the trigger + * @param string $time Either "before" or "after" + * @param string $event The DB level event which activates the trigger, i.e. "update" or "insert" + * @return string + */ + public function getTriggerName($tableName, $time, $event); + /** * Retrieve valid index name * Check index name length and allowed symbols diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index 74d74986e0e68fb81a46da87df2e4d8b359cf2d4..21db76cc7545bd52760186d17b04ef6f9dbc0f8c 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -19,6 +19,7 @@ use Magento\Framework\DB\Profiler; use Magento\Framework\DB\Select; use Magento\Framework\DB\Statement\Parameter; use Magento\Framework\Exception\LocalizedException; +use Magento\Framework\Mview\View\Subscription; use Magento\Framework\Phrase; use Magento\Framework\Stdlib\DateTime; use Magento\Framework\Stdlib\String; @@ -396,8 +397,9 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface protected function _checkDdlTransaction($sql) { if (is_string($sql) && $this->getTransactionLevel() > 0) { - $startSql = strtolower(substr(ltrim($sql), 0, 3)); - if (in_array($startSql, $this->_ddlRoutines)) { + $sqlMessage = explode(' ', $sql, 3); + $startSql = strtolower(substr(ltrim($sqlMessage[0]), 0, 3)); + if (in_array($startSql, $this->_ddlRoutines) && strcasecmp($sqlMessage[1], 'temporary') !== 0) { trigger_error(AdapterInterface::ERROR_DDL_MESSAGE, E_USER_ERROR); } } @@ -2002,6 +2004,24 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface return $this->query($sql); } + /** + * Create temporary table like + * + * @param string $temporaryTableName + * @param string $originTableName + * @param bool $ifNotExists + * @return \Zend_Db_Statement_Pdo + */ + public function createTemporaryTableLike($temporaryTableName, $originTableName, $ifNotExists = false) + { + $ifNotExistsSql = ($ifNotExists ? 'IF NOT EXISTS' : ''); + $temporaryTable = $this->quoteIdentifier($this->_getTableName($temporaryTableName)); + $originTable = $this->quoteIdentifier($this->_getTableName($originTableName)); + $sql = sprintf('CREATE TEMPORARY TABLE %s %s LIKE %s', $ifNotExistsSql, $temporaryTable, $originTable); + + return $this->query($sql); + } + /** * Rename several tables * @@ -2713,14 +2733,11 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface 'to' => "{{fieldName}} <= ?", 'seq' => null, 'sneq' => null, + 'ntoa' => "INET_NTOA({{fieldName}}) LIKE ?", ]; $query = ''; if (is_array($condition)) { - if (isset($condition['field_expr'])) { - $fieldName = str_replace('#?', $this->quoteIdentifier($fieldName), $condition['field_expr']); - unset($condition['field_expr']); - } $key = key(array_intersect_key($condition, $conditionKeyMap)); if (isset($condition['from']) || isset($condition['to'])) { @@ -3118,47 +3135,31 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface } /** - * Minus superfluous characters from hash. + * Returns a compressed version of the table name if it is too long * - * @param string $hash - * @param string $prefix - * @param int $maxCharacters + * @param string $tableName * @return string + * @codeCoverageIgnore */ - protected function _minusSuperfluous($hash, $prefix, $maxCharacters) + public function getTableName($tableName) { - $diff = strlen($hash) + strlen($prefix) - $maxCharacters; - $superfluous = $diff / 2; - $odd = $diff % 2; - $hash = substr($hash, $superfluous, - ($superfluous + $odd)); - return $hash; + return ExpressionConverter::shortenEntityName($tableName, 't_'); } /** - * Retrieve valid table name - * Check table name length and allowed symbols + * Build a trigger name based on table name and trigger details * - * @param string $tableName + * @param string $tableName The table which is the subject of the trigger + * @param string $time Either "before" or "after" + * @param string $event The DB level event which activates the trigger, i.e. "update" or "insert" * @return string + * @codeCoverageIgnore */ - public function getTableName($tableName) - { - $prefix = 't_'; - if (strlen($tableName) > self::LENGTH_TABLE_NAME) { - $shortName = ExpressionConverter::shortName($tableName); - if (strlen($shortName) > self::LENGTH_TABLE_NAME) { - $hash = md5($tableName); - if (strlen($prefix . $hash) > self::LENGTH_TABLE_NAME) { - $tableName = $this->_minusSuperfluous($hash, $prefix, self::LENGTH_TABLE_NAME); - } else { - $tableName = $prefix . $hash; - } - } else { - $tableName = $shortName; - } - } - return $tableName; + public function getTriggerName($tableName, $time, $event) + { + $triggerName = 'trg_' . $tableName . '_' . $time . '_' . $event; + return ExpressionConverter::shortenEntityName($triggerName, 'trg_'); } /** @@ -3179,35 +3180,15 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface switch (strtolower($indexType)) { case AdapterInterface::INDEX_TYPE_UNIQUE: $prefix = 'unq_'; - $shortPrefix = 'u_'; break; case AdapterInterface::INDEX_TYPE_FULLTEXT: $prefix = 'fti_'; - $shortPrefix = 'f_'; break; case AdapterInterface::INDEX_TYPE_INDEX: default: $prefix = 'idx_'; - $shortPrefix = 'i_'; - } - - $hash = $tableName . '_' . $fields; - - if (strlen($hash) + strlen($prefix) > self::LENGTH_INDEX_NAME) { - $short = ExpressionConverter::shortName($prefix . $hash); - if (strlen($short) > self::LENGTH_INDEX_NAME) { - $hash = md5($hash); - if (strlen($hash) + strlen($shortPrefix) > self::LENGTH_INDEX_NAME) { - $hash = $this->_minusSuperfluous($hash, $shortPrefix, self::LENGTH_INDEX_NAME); - } - } else { - $hash = $short; - } - } else { - $hash = $prefix . $hash; } - - return strtoupper($hash); + return strtoupper(ExpressionConverter::shortenEntityName($tableName . '_' . $fields, $prefix)); } /** @@ -3219,28 +3200,12 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface * @param string $refTableName * @param string $refColumnName * @return string + * @codeCoverageIgnore */ public function getForeignKeyName($priTableName, $priColumnName, $refTableName, $refColumnName) { - $prefix = 'fk_'; - $hash = sprintf('%s_%s_%s_%s', $priTableName, $priColumnName, $refTableName, $refColumnName); - if (strlen($prefix . $hash) > self::LENGTH_FOREIGN_NAME) { - $short = ExpressionConverter::shortName($prefix . $hash); - if (strlen($short) > self::LENGTH_FOREIGN_NAME) { - $hash = md5($hash); - if (strlen($prefix . $hash) > self::LENGTH_FOREIGN_NAME) { - $hash = $this->_minusSuperfluous($hash, $prefix, self::LENGTH_FOREIGN_NAME); - } else { - $hash = $prefix . $hash; - } - } else { - $hash = $short; - } - } else { - $hash = $prefix . $hash; - } - - return strtoupper($hash); + $fkName = sprintf('%s_%s_%s_%s', $priTableName, $priColumnName, $refTableName, $refColumnName); + return strtoupper(ExpressionConverter::shortenEntityName($fkName, 'fk_')); } /** diff --git a/lib/internal/Magento/Framework/DB/ExpressionConverter.php b/lib/internal/Magento/Framework/DB/ExpressionConverter.php index 2df91ab77991222d8f1814134020df7e3d45dc1e..9a9b2d7eacf4797821fded20bf885edb7367ea00 100644 --- a/lib/internal/Magento/Framework/DB/ExpressionConverter.php +++ b/lib/internal/Magento/Framework/DB/ExpressionConverter.php @@ -10,7 +10,12 @@ namespace Magento\Framework\DB; class ExpressionConverter { /** - * Dictionary for generate short name + * Maximum length for many MySql identifiers, including database, table, trigger, and column names + */ + const MYSQL_IDENTIFIER_LEN = 64; + + /** + * Dictionary maps common words in identifiers to abbreviations * * @var array */ @@ -62,7 +67,7 @@ class ExpressionConverter ]; /** - * Convert name using dictionary + * Shorten name by abbreviating words * * @param string $name * @return string @@ -73,7 +78,7 @@ class ExpressionConverter } /** - * Add or replace translate to dictionary + * Add an abbreviation to the dictionary, or replace if it already exists * * @param string $from * @param string $to @@ -83,4 +88,47 @@ class ExpressionConverter { self::$_translateMap[$from] = $to; } + + /** + * Shorten the name of a MySql identifier, by abbreviating common words and hashing if necessary. Prepends the + * given prefix to clarify what kind of entity the identifier represents, in case hashing is used. + * + * @param string $entityName + * @param string $prefix + * @return string + */ + public static function shortenEntityName($entityName, $prefix) + { + if (strlen($entityName) > self::MYSQL_IDENTIFIER_LEN) { + $shortName = ExpressionConverter::shortName($entityName); + if (strlen($shortName) > self::MYSQL_IDENTIFIER_LEN) { + $hash = md5($entityName); + if (strlen($prefix . $hash) > self::MYSQL_IDENTIFIER_LEN) { + $entityName = self::trimHash($hash, $prefix, self::MYSQL_IDENTIFIER_LEN); + } else { + $entityName = $prefix . $hash; + } + } else { + $entityName = $shortName; + } + } + return $entityName; + } + + /** + * Remove superfluous characters from hash + * + * @param string $hash + * @param string $prefix + * @param int $maxCharacters + * @return string + */ + private static function trimHash($hash, $prefix, $maxCharacters) + { + $diff = strlen($hash) + strlen($prefix) - $maxCharacters; + $superfluous = $diff / 2; + $odd = $diff % 2; + $hash = substr($hash, $superfluous, - ($superfluous + $odd)); + return $hash; + } } diff --git a/lib/internal/Magento/Framework/DB/Test/Unit/Adapter/Pdo/MysqlTest.php b/lib/internal/Magento/Framework/DB/Test/Unit/Adapter/Pdo/MysqlTest.php index b7c080064bc969890c42c8ca983025f89548738c..4d7bfa42ed2eab83d5f1d5e67b31ca022cf1e8b1 100644 --- a/lib/internal/Magento/Framework/DB/Test/Unit/Adapter/Pdo/MysqlTest.php +++ b/lib/internal/Magento/Framework/DB/Test/Unit/Adapter/Pdo/MysqlTest.php @@ -11,6 +11,8 @@ */ namespace Magento\Framework\DB\Test\Unit\Adapter\Pdo; +use Magento\Framework\DB\Adapter\AdapterInterface; + class MysqlTest extends \PHPUnit_Framework_TestCase { /** @@ -149,7 +151,7 @@ class MysqlTest extends \PHPUnit_Framework_TestCase } catch (\Exception $e) { $this->assertNotContains( $e->getMessage(), - \Magento\Framework\DB\Adapter\AdapterInterface::ERROR_DDL_MESSAGE + AdapterInterface::ERROR_DDL_MESSAGE ); } @@ -160,7 +162,7 @@ class MysqlTest extends \PHPUnit_Framework_TestCase } catch (\Exception $e) { $this->assertNotContains( $e->getMessage(), - \Magento\Framework\DB\Adapter\AdapterInterface::ERROR_DDL_MESSAGE + AdapterInterface::ERROR_DDL_MESSAGE ); } } @@ -226,7 +228,7 @@ class MysqlTest extends \PHPUnit_Framework_TestCase throw new \Exception('Test Failed!'); } catch (\Exception $e) { $this->assertEquals( - \Magento\Framework\DB\Adapter\AdapterInterface::ERROR_ASYMMETRIC_ROLLBACK_MESSAGE, + AdapterInterface::ERROR_ASYMMETRIC_ROLLBACK_MESSAGE, $e->getMessage() ); } @@ -242,7 +244,7 @@ class MysqlTest extends \PHPUnit_Framework_TestCase throw new \Exception('Test Failed!'); } catch (\Exception $e) { $this->assertEquals( - \Magento\Framework\DB\Adapter\AdapterInterface::ERROR_ASYMMETRIC_COMMIT_MESSAGE, + AdapterInterface::ERROR_ASYMMETRIC_COMMIT_MESSAGE, $e->getMessage() ); } @@ -354,7 +356,7 @@ class MysqlTest extends \PHPUnit_Framework_TestCase throw new \Exception('Test Failed!'); } catch (\Exception $e) { $this->assertEquals( - \Magento\Framework\DB\Adapter\AdapterInterface::ERROR_ROLLBACK_INCOMPLETE_MESSAGE, + AdapterInterface::ERROR_ROLLBACK_INCOMPLETE_MESSAGE, $e->getMessage() ); $this->_adapter->rollBack(); @@ -377,7 +379,7 @@ class MysqlTest extends \PHPUnit_Framework_TestCase throw new \Exception('Test Failed!'); } catch (\Exception $e) { $this->assertEquals( - \Magento\Framework\DB\Adapter\AdapterInterface::ERROR_ROLLBACK_INCOMPLETE_MESSAGE, + AdapterInterface::ERROR_ROLLBACK_INCOMPLETE_MESSAGE, $e->getMessage() ); $this->_adapter->rollBack(); @@ -549,4 +551,28 @@ class MysqlTest extends \PHPUnit_Framework_TestCase ] ]; } + + /** + * @dataProvider getIndexNameDataProvider + */ + public function testGetIndexName($name, $fields, $indexType, $expectedName) + { + $resultIndexName = $this->_mockAdapter->getIndexName($name, $fields, $indexType); + $this->assertTrue( + strpos($resultIndexName, $expectedName) === 0, + "Index name '$resultIndexName' did not begin with expected value '$expectedName'" + ); + } + + public function getIndexNameDataProvider() + { + // 65 characters long - will be compressed + $longTableName = '__________________________________________________long_table_name'; + return [ + [$longTableName, [], AdapterInterface::INDEX_TYPE_UNIQUE, 'UNQ_'], + [$longTableName, [], AdapterInterface::INDEX_TYPE_FULLTEXT, 'FTI_'], + [$longTableName, [], AdapterInterface::INDEX_TYPE_INDEX, 'IDX_'], + ['short_table_name', ['field1', 'field2'], '', 'SHORT_TABLE_NAME_FIELD1_FIELD2'], + ]; + } } diff --git a/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php new file mode 100644 index 0000000000000000000000000000000000000000..5c122c497cfc314731d38c2a81c0cf67fb25d171 --- /dev/null +++ b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php @@ -0,0 +1,57 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Framework\DB\Test\Unit; + + +use Magento\Framework\DB\ExpressionConverter; + +class ExpressionConverterTest extends \PHPUnit_Framework_TestCase +{ + /** + * @dataProvider shortenEntityNameDataProvider + */ + public function testShortenEntityName($in, $prefix, $expectedOut) + { + $resultEntityName = ExpressionConverter::shortenEntityName($in, $prefix); + $this->assertTrue( + strpos($resultEntityName, $expectedOut) === 0, + "Entity name '$resultEntityName' did not begin with expected value '$expectedOut'" + ); + } + + public function shortenEntityNameDataProvider() + { + $length64 = '________________________________________________________________'; + $length40 = '________________________________________'; + return [ + 'Short identifier' => [ + 'already_short', + 'pre_', + 'already_short' + ], + 'Hashed identifer' => [ + $length64 . '_cannotBeAbbreviated', + 'pre_', + 'pre_' + ], + 'Abbreviated identifier' => [ + $length40 . 'downloadable_notification_index', + 'pre_', + $length40 . 'dl_ntfc_idx' + ], + ]; + } + + public function testShortenEntityNameReducedHash() + { + /** Length of 64 characters, to go over max MySql identifier length */ + $length64 = '________________________________________________________________'; + $longPrefix = 'pre_____________________________________'; + $shortenedName = ExpressionConverter::shortenEntityName($length64 . '_cannotBeAbbreviated', $longPrefix); + $this->assertNotSame(0, strpos($shortenedName, 'pre'), 'Entity name not supposed to with long prefix'); + } +} diff --git a/lib/internal/Magento/Framework/File/Uploader.php b/lib/internal/Magento/Framework/File/Uploader.php index cfc862a635bc137a62320b56ff2563fcdbb2a529..b5a0dedbbdf5b151b15ad111d1f24b38420d7425 100644 --- a/lib/internal/Magento/Framework/File/Uploader.php +++ b/lib/internal/Magento/Framework/File/Uploader.php @@ -159,7 +159,7 @@ class Uploader $this->_setUploadFileId($fileId); if (!file_exists($this->_file['tmp_name'])) { $code = empty($this->_file['tmp_name']) ? self::TMP_NAME_EMPTY : 0; - throw new \Exception('File was not uploaded.', $code); + throw new \Exception('The file was not uploaded.', $code); } else { $this->_fileExists = true; } diff --git a/lib/internal/Magento/Framework/Filesystem/Driver/Http.php b/lib/internal/Magento/Framework/Filesystem/Driver/Http.php index 2e60f74c6f15f0ae865fbcd809ae82c336f0cf2b..fc82bbdbc46e223f3f9b37e82b88275e0011c6ad 100644 --- a/lib/internal/Magento/Framework/Filesystem/Driver/Http.php +++ b/lib/internal/Magento/Framework/Filesystem/Driver/Http.php @@ -167,8 +167,7 @@ class Http extends File 'Host: ' . $hostname . "\r\n" . - 'User-Agent: Magento ver/' . - \Magento\Framework\AppInterface::VERSION . + 'User-Agent: Magento' . "\r\n" . 'Connection: close' . "\r\n" . @@ -243,7 +242,7 @@ class Http extends File if ($result === false) { throw new FileSystemException( new \Magento\Framework\Phrase( - 'Something went wrong connecting to the host. Error#%1 - %2.', + 'Something went wrong while connecting to the host. Error#%1 - %2.', [$errorNumber, $errorMessage] ) ); diff --git a/lib/internal/Magento/Framework/Model/AbstractModel.php b/lib/internal/Magento/Framework/Model/AbstractModel.php index 76729e191161dbd9e09a5a8e873957f86116a448..1c702229061d364526c8e48def6afc36be4b1227 100644 --- a/lib/internal/Magento/Framework/Model/AbstractModel.php +++ b/lib/internal/Magento/Framework/Model/AbstractModel.php @@ -455,7 +455,7 @@ abstract class AbstractModel extends \Magento\Framework\Object { if (empty($this->_resourceName) && empty($this->_resource)) { throw new \Magento\Framework\Exception\LocalizedException( - new \Magento\Framework\Phrase('Resource is not set.') + new \Magento\Framework\Phrase('The resource isn\'t set.') ); } diff --git a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php index ba80e64a256222d7d02ac7eaae6cd95f7ec3717a..87732d71a0f068818c993fd836d8baa8bb9d9d3a 100644 --- a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php +++ b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php @@ -625,6 +625,7 @@ abstract class AbstractDb extends \Magento\Framework\Model\Resource\AbstractReso * @return $this * @throws AlreadyExistsException * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) */ protected function _checkUnique(\Magento\Framework\Model\AbstractModel $object) { @@ -640,13 +641,13 @@ abstract class AbstractDb extends \Magento\Framework\Model\Resource\AbstractReso foreach ($fields as $unique) { $select->reset(\Zend_Db_Select::WHERE); - - if (is_array($unique['field'])) { - foreach ($unique['field'] as $field) { - $select->where($field . '=?', trim($data->getData($field))); + foreach ((array)$unique['field'] as $field) { + $value = $data->getData($field); + if ($value === null) { + $select->where($field . ' IS NULL'); + } else { + $select->where($field . '=?', trim($value)); } - } else { - $select->where($unique['field'] . '=?', trim($data->getData($unique['field']))); } if ($object->getId() || $object->getId() === '0') { diff --git a/lib/internal/Magento/Framework/Mview/Test/Unit/View/SubscriptionTest.php b/lib/internal/Magento/Framework/Mview/Test/Unit/View/SubscriptionTest.php index 8b36902a699e2f0f56c397a9e787651c07faeb06..f9b642136422dd229deebd9762f183742646c698 100644 --- a/lib/internal/Magento/Framework/Mview/Test/Unit/View/SubscriptionTest.php +++ b/lib/internal/Magento/Framework/Mview/Test/Unit/View/SubscriptionTest.php @@ -12,11 +12,6 @@ use \Magento\Framework\Mview\View\Subscription; class SubscriptionTest extends \PHPUnit_Framework_TestCase { - /** - * @var \Magento\Framework\Mview\View\Subscription - */ - protected $model; - /** * Mysql PDO DB adapter mock * @@ -24,34 +19,37 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase */ protected $connectionMock; - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\Resource - */ + /** @var \Magento\Framework\Mview\View\Subscription */ + protected $model; + + /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\Resource */ protected $resourceMock; - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\DB\Ddl\TriggerFactory - */ + /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\DB\Ddl\TriggerFactory */ protected $triggerFactoryMock; - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Mview\View\CollectionInterface - */ + /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Mview\View\CollectionInterface */ protected $viewCollectionMock; - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Mview\ViewInterface - */ + /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Mview\ViewInterface */ protected $viewMock; + /** @var string */ + private $tableName; + protected function setUp() { $this->connectionMock = $this->getMock('Magento\Framework\DB\Adapter\Pdo\Mysql', [], [], '', false); + $this->resourceMock = $this->getMock('Magento\Framework\App\Resource', [], [], '', false, false); + + $this->connectionMock->expects($this->any()) + ->method('quoteIdentifier') + ->will($this->returnArgument(0)); + + $this->resourceMock->expects($this->atLeastOnce()) + ->method('getConnection') + ->willReturn($this->connectionMock); - $this->resourceMock = $this->getMock( - 'Magento\Framework\App\Resource', ['getConnection', 'getTableName'], [], '', false, false - ); - $this->mockGetConnection($this->connectionMock); $this->triggerFactoryMock = $this->getMock( 'Magento\Framework\DB\Ddl\TriggerFactory', [], [], '', false, false ); @@ -62,16 +60,16 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase 'Magento\Framework\Mview\ViewInterface', [], '', false, false, true, [] ); - $this->connectionMock->expects($this->any()) - ->method('quoteIdentifier') - ->will($this->returnArgument(0)); + $this->resourceMock->expects($this->any()) + ->method('getTableName') + ->willReturn($this->tableName); $this->model = new Subscription( $this->resourceMock, $this->triggerFactoryMock, $this->viewCollectionMock, $this->viewMock, - 'tableName', + $this->tableName, 'columnName' ); } @@ -83,7 +81,7 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase public function testGetTableName() { - $this->assertEquals('tableName', $this->model->getTableName()); + $this->assertEquals($this->tableName, $this->model->getTableName()); } public function testGetColumnName() @@ -93,11 +91,14 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase public function testCreate() { - $this->mockGetTableName(); - - $triggerMock = $this->getMock('Magento\Framework\DB\Ddl\Trigger', [], [], '', false, false); + $triggerName = 'trigger_name'; + $this->resourceMock->expects($this->atLeastOnce())->method('getTriggerName')->willReturn($triggerName); + $triggerMock = $this->getMockBuilder('Magento\Framework\DB\Ddl\Trigger') + ->disableOriginalConstructor() + ->getMock(); $triggerMock->expects($this->exactly(3)) ->method('setName') + ->with($triggerName) ->will($this->returnSelf()); $triggerMock->expects($this->exactly(3)) ->method('getName') @@ -111,7 +112,7 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase ->will($this->returnSelf()); $triggerMock->expects($this->exactly(3)) ->method('setTable') - ->with('tableName') + ->with($this->tableName) ->will($this->returnSelf()); $triggerMock->expects($this->exactly(6)) ->method('addStatement') @@ -153,7 +154,7 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue('other_id')); $otherViewMock->expects($this->exactly(1)) ->method('getSubscriptions') - ->will($this->returnValue([['name' => 'tableName'], ['name' => 'otherTableName']])); + ->will($this->returnValue([['name' => $this->tableName], ['name' => 'otherTableName']])); $otherViewMock->expects($this->exactly(3)) ->method('getChangelog') ->will($this->returnValue($otherChangelogMock)); @@ -182,8 +183,6 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase public function testRemove() { - $this->mockGetTableName(); - $triggerMock = $this->getMock('Magento\Framework\DB\Ddl\Trigger', [], [], '', false, false); $triggerMock->expects($this->exactly(3)) ->method('setName') @@ -200,7 +199,7 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase ->will($this->returnSelf()); $triggerMock->expects($this->exactly(3)) ->method('setTable') - ->with('tableName') + ->with($this->tableName) ->will($this->returnSelf()); $triggerMock->expects($this->exactly(3)) ->method('addStatement') @@ -228,7 +227,7 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue('other_id')); $otherViewMock->expects($this->exactly(1)) ->method('getSubscriptions') - ->will($this->returnValue([['name' => 'tableName'], ['name' => 'otherTableName']])); + ->will($this->returnValue([['name' => $this->tableName], ['name' => 'otherTableName']])); $otherViewMock->expects($this->exactly(3)) ->method('getChangelog') ->will($this->returnValue($otherChangelogMock)); @@ -259,21 +258,4 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase $this->model->remove(); } - - /** - * @param $connection - */ - protected function mockGetConnection($connection) - { - $this->resourceMock->expects($this->once()) - ->method('getConnection') - ->will($this->returnValue($connection)); - } - - protected function mockGetTableName() - { - $this->resourceMock->expects($this->any()) - ->method('getTableName') - ->will($this->returnArgument(0)); - } } diff --git a/lib/internal/Magento/Framework/Mview/View/Subscription.php b/lib/internal/Magento/Framework/Mview/View/Subscription.php index 498cb0e147801ef8709a89a13def616677662be3..e72c255d750ac85df31a1d4a9a1e8eb6e30d3c53 100644 --- a/lib/internal/Magento/Framework/Mview/View/Subscription.php +++ b/lib/internal/Magento/Framework/Mview/View/Subscription.php @@ -8,13 +8,11 @@ namespace Magento\Framework\Mview\View; +use Magento\Framework\App\Resource; +use Magento\Framework\DB\Ddl\Trigger; + class Subscription implements SubscriptionInterface { - /** - * Trigger name qualifier - */ - const TRIGGER_NAME_QUALIFIER = 'trg'; - /** * Database write connection * @@ -23,7 +21,7 @@ class Subscription implements SubscriptionInterface protected $write; /** - * @var \Magento\Framework\DB\Ddl\Trigger + * @var \Magento\Framework\DB\Ddl\TriggerFactory */ protected $triggerFactory; @@ -55,12 +53,12 @@ class Subscription implements SubscriptionInterface protected $linkedViews = []; /** - * @var \Magento\Framework\App\Resource + * @var Resource */ protected $resource; /** - * @param \Magento\Framework\App\Resource $resource + * @param Resource $resource * @param \Magento\Framework\DB\Ddl\TriggerFactory $triggerFactory * @param \Magento\Framework\Mview\View\CollectionInterface $viewCollection * @param \Magento\Framework\Mview\ViewInterface $view @@ -68,7 +66,7 @@ class Subscription implements SubscriptionInterface * @param string $columnName */ public function __construct( - \Magento\Framework\App\Resource $resource, + Resource $resource, \Magento\Framework\DB\Ddl\TriggerFactory $triggerFactory, \Magento\Framework\Mview\View\CollectionInterface $viewCollection, \Magento\Framework\Mview\ViewInterface $view, @@ -91,23 +89,14 @@ class Subscription implements SubscriptionInterface */ public function create() { - foreach (\Magento\Framework\DB\Ddl\Trigger::getListOfEvents() as $event) { - $triggerName = $this->getTriggerName( - $this->resource->getTableName($this->getTableName()), - \Magento\Framework\DB\Ddl\Trigger::TIME_AFTER, - $event - ); - - /** @var \Magento\Framework\DB\Ddl\Trigger $trigger */ - $trigger = $this->triggerFactory->create()->setName( - $triggerName - )->setTime( - \Magento\Framework\DB\Ddl\Trigger::TIME_AFTER - )->setEvent( - $event - )->setTable( - $this->resource->getTableName($this->getTableName()) - ); + foreach (Trigger::getListOfEvents() as $event) { + $triggerName = $this->getAfterEventTriggerName($event); + /** @var Trigger $trigger */ + $trigger = $this->triggerFactory->create() + ->setName($triggerName) + ->setTime(Trigger::TIME_AFTER) + ->setEvent($event) + ->setTable($this->resource->getTableName($this->tableName)); $trigger->addStatement($this->buildStatement($event, $this->getView()->getChangelog())); @@ -131,23 +120,14 @@ class Subscription implements SubscriptionInterface */ public function remove() { - foreach (\Magento\Framework\DB\Ddl\Trigger::getListOfEvents() as $event) { - $triggerName = $this->getTriggerName( - $this->resource->getTableName($this->getTableName()), - \Magento\Framework\DB\Ddl\Trigger::TIME_AFTER, - $event - ); - - /** @var \Magento\Framework\DB\Ddl\Trigger $trigger */ - $trigger = $this->triggerFactory->create()->setName( - $triggerName - )->setTime( - \Magento\Framework\DB\Ddl\Trigger::TIME_AFTER - )->setEvent( - $event - )->setTable( - $this->resource->getTableName($this->getTableName()) - ); + foreach (Trigger::getListOfEvents() as $event) { + $triggerName = $this->getAfterEventTriggerName($event); + /** @var Trigger $trigger */ + $trigger = $this->triggerFactory->create() + ->setName($triggerName) + ->setTime(Trigger::TIME_AFTER) + ->setEvent($event) + ->setTable($this->resource->getTableName($this->getTableName())); // Add statements for linked views foreach ($this->getLinkedViews() as $view) { @@ -204,8 +184,8 @@ class Subscription implements SubscriptionInterface protected function buildStatement($event, $changelog) { switch ($event) { - case \Magento\Framework\DB\Ddl\Trigger::EVENT_INSERT: - case \Magento\Framework\DB\Ddl\Trigger::EVENT_UPDATE: + case Trigger::EVENT_INSERT: + case Trigger::EVENT_UPDATE: return sprintf( "INSERT IGNORE INTO %s (%s) VALUES (NEW.%s);", $this->write->quoteIdentifier($this->resource->getTableName($changelog->getName())), @@ -213,7 +193,7 @@ class Subscription implements SubscriptionInterface $this->write->quoteIdentifier($this->getColumnName()) ); - case \Magento\Framework\DB\Ddl\Trigger::EVENT_DELETE: + case Trigger::EVENT_DELETE: return sprintf( "INSERT IGNORE INTO %s (%s) VALUES (OLD.%s);", $this->write->quoteIdentifier($this->resource->getTableName($changelog->getName())), @@ -227,25 +207,26 @@ class Subscription implements SubscriptionInterface } /** - * Retrieve trigger name + * Build an "after" event for the given table and event * - * Build a trigger name by concatenating trigger name prefix, table name, - * trigger time and trigger event. + * @param string $event The DB level event, like "update" or "insert" * - * @param string $tableName - * @param string $time - * @param string $event * @return string */ - protected function getTriggerName($tableName, $time, $event) + private function getAfterEventTriggerName($event) { - return self::TRIGGER_NAME_QUALIFIER . '_' . $tableName . '_' . $time . '_' . $event; + return $this->resource->getTriggerName( + $this->resource->getTableName($this->getTableName()), + Trigger::TIME_AFTER, + $event + ); } /** * Retrieve View related to subscription * * @return \Magento\Framework\Mview\ViewInterface + * @codeCoverageIgnore */ public function getView() { @@ -256,6 +237,7 @@ class Subscription implements SubscriptionInterface * Retrieve table name * * @return string + * @codeCoverageIgnore */ public function getTableName() { @@ -266,6 +248,7 @@ class Subscription implements SubscriptionInterface * Retrieve table column name * * @return string + * @codeCoverageIgnore */ public function getColumnName() { diff --git a/lib/internal/Magento/Framework/Validator/EmailAddress.php b/lib/internal/Magento/Framework/Validator/EmailAddress.php index 7420debc7f83f6a438b7d7bdf513e2fdb1b84686..5a310f18775ac6ee4b2b41f7ea1b3ca8e99bed17 100644 --- a/lib/internal/Magento/Framework/Validator/EmailAddress.php +++ b/lib/internal/Magento/Framework/Validator/EmailAddress.php @@ -1,6 +1,6 @@ <?php /** - * E-mail address validator + * Email address validator * * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. diff --git a/lib/web/css/docs/docs.css b/lib/web/css/docs/docs.css index c582689347ea21d675d48262cc12d75868a93be5..bd3fb54a7376ad58e526e199f281a813f7be7d46 100644 --- a/lib/web/css/docs/docs.css +++ b/lib/web/css/docs/docs.css @@ -8193,7 +8193,6 @@ pre { margin: 0 0 10px; line-height: 1.42857143; padding: 10px; - word-break: break-all; word-wrap: break-word; } pre code { @@ -8258,8 +8257,6 @@ cite { line-height: 3rem; } .example-word-wrap { - word-break: break-all; - word-break: break-word; word-wrap: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; @@ -8562,7 +8559,6 @@ pre { margin: 0 0 10px; line-height: 1.42857143; padding: 10px; - word-break: break-all; word-wrap: break-word; } pre code { @@ -8732,4 +8728,4 @@ body { padding: 15px; background-image: none; } -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL191dGlsaXRpZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9icmVhZGNydW1icy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2JyZWFkY3J1bWJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2ljb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX3R5cG9ncmFwaHkubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9pY29ucy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2J1dHRvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19idXR0b25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZm9ybXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19mb3Jtcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19sb2FkZXJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9tZXNzYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX21lc3NhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZ3JpZHMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9wYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3BhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmVzcG9uc2l2ZS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3NlY3Rpb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fc2VjdGlvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL190YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90b29sdGlwcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3Rvb2x0aXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3V0aWxpdGllcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2RvY3MubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpREksZ0JBQUM7QUFDRCxnQkFBQztFQUNHLFNBQVMsRUFBVDtFQUNBLGNBQUE7O0FBRUosZ0JBQUM7RUFDRyxXQUFBOztBQ25CUixnQkMyQ0k7RUFDSSxXQUFBOztBRDVDUixnQkM4Q0k7RUFDSSxZQUFBOztBRC9DUixnQkNWSTtBRFVKLGdCQ1RJO0VBQ0ks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 */ \ No newline at end of file +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL191dGlsaXRpZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9icmVhZGNydW1icy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2JyZWFkY3J1bWJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2ljb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX3R5cG9ncmFwaHkubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9pY29ucy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2J1dHRvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19idXR0b25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZm9ybXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19mb3Jtcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19sb2FkZXJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9tZXNzYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX21lc3NhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZ3JpZHMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9wYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3BhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmVzcG9uc2l2ZS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3NlY3Rpb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fc2VjdGlvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL190YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90b29sdGlwcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3Rvb2x0aXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3V0aWxpdGllcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2RvY3MubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpREksZ0JBQUM7QUFDRCxnQkFBQztFQUNHLFNBQVMsRUFBVDtFQUNBLGNBQUE7O0FBRUosZ0JBQUM7RUFDRyxXQUFBOztBQ25CUixnQkMyQ0k7RUFDSSxXQUFBOztBRDVDUixnQkM4Q0k7RUFDSSxZQUFBOztBRC9DUixnQkNWSTtBRFVKLGdCQ1RJO0VBQ0ks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 */ \ No newline at end of file diff --git a/lib/web/css/docs/forms.html b/lib/web/css/docs/forms.html index 03c301a17afd3c21db1badaa83810a350860078a..a7fccf9d9d97b2a86f35df4cb476bf7098f57f64 100644 --- a/lib/web/css/docs/forms.html +++ b/lib/web/css/docs/forms.html @@ -1,10 +1,10 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> - +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> + <!DOCTYPE html><html><head><title>forms | Magento UI Library </title><meta charset="utf-8"><style>*{-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;border:0}body{padding:60px 0 40px;background-color:hsl(207,10%,90%);color:hsl(207,5%,30%)}.container{max-width:1300px;margin:0 auto;padding:0 20px}.section{position:relative;margin-bottom:20px}.docs{position:relative;z-index:2;width:68%;min-height:200px;background-color:hsl(207,0%,100%);background-clip:padding-box;border:1px solid hsla(207,5%,5%,.1);border-radius:5px;box-shadow:0 0 3px hsla(207,5%,5%,.1)}.code{position:absolute;top:5px;bottom:5px;right:0;z-index:1;width:33%;padding:10px 10px 10px 20px;border-radius:0 5px 5px 0;border:1px solid hsla(207,20%,10%,.1);background-color:hsla(207,20%,95%,.9);background-clip:padding-box;opacity:.5;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.code:hover{opacity:1}.preview{background:hsl(207,0%,100%);border-top:1px solid hsl(207,30%,95%);position:relative;z-index:1}.preview-code+.preview{margin-top:0;border-top:0}.preview iframe{display:block;width:100%;height:100%;overflow:hidden}.preview-code{position:relative;z-index:2;display:block;width:100%;color:hsl(207,9%,37%);max-height:200px;padding:10px 20px;overflow-y:auto;background:hsl(207,30%,95%);border:1px solid hsl(207,30%,85%);border-left:0;border-right;box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1);line-height:1.1!important;resize:none}.preview-code:focus{outline:0;background:hsl(207,30%,97%);box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1),0 0 5px hsla(207,75%,75%,.9)}.preview-code:last-child{border-bottom:0;border-radius:0 0 5px 5px}.resizeable{padding:15px;overflow:auto;background:hsl(207,0%,100%);box-shadow:0 0 2px hsla(207,10%,20%,.2);resize:both}.preview-code,pre{white-space:pre-wrap;word-wrap:break-word;overflow-y:auto}.code pre{height:100%;margin-top:0}.bar{position:fixed;left:0;right:0;z-index:1010;min-height:40px;line-height:40px;background-image:-webkit-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-moz-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-o-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92))}.bar.top{top:0;box-shadow:0 1px 2px hsla(207,5%,0%,.2)}.bar.bottom{bottom:0;box-shadow:0 -1px 2px hsla(207,5%,0%,.2)}.bar ul{margin:0!important}.bar li{display:block;list-style:none}.bar .icon path{fill:hsla(27,10%,75%,.75)}.docs .icon path{fill:hsla(207,10%,75%,.5)}.docs .permalink:hover .icon path{fill:hsl(207,10%,75%)}.bar button{color:hsla(27,10%,75%,.75)}.bar button:hover .icon path,.bar button.is-active .icon path{fill:hsl(27,10%,85%)}.bar button:hover,.bar button.is-active{color:hsl(27,10%,85%)}.bar .icon{vertical-align:middle;display:inline-block}.bar,.bar a,.bar a:visited{color:hsl(27,10%,85%);text-shadow:1px 1px 0 hsla(27,5%,0%,.5)}.bar a:hover,.bar a.is-active{color:hsl(27,10%,95%);text-shadow:1px 1px 0 hsla(27,5%,0%,1);text-decoration:none}.brand{float:left;margin-right:20px;font-weight:700;font-size:16px;text-decoration:none}.brand,a.brand,a.brand:visited{color:hsl(27,5%,5%);text-shadow:1px 1px 0 hsla(27,5%,100%,.2)}.brand:hover,a.brand:hover{color:hsl(27,5%,0%);text-shadow:1px 1px 0 hsla(27,5%,100%,.3);text-decoration:none}.menu{font-size:12px}.menu>li{float:left;position:relative}.menu a{display:block;margin-right:15px}.dropdown-toggle{position:relative;padding-right:15px}.dropdown-toggle:after{display:block;position:absolute;right:0;top:18px;content:'';border:4px solid;border-left-color:transparent;border-right-color:transparent;border-bottom-color:transparent}.nav-results,.dropdown{position:absolute;z-index:1020;top:32px;left:-16px;width:175px;max-height:500px;padding:10px 0;overflow-y:auto;word-wrap:break-word;font-size:11px;line-height:20px;background-color:hsla(207,10%,25%,.97);border:1px solid hsla(207,5%,70%,.3);border-radius:3px;box-shadow:0 0 3px hsla(207,5%,0%,.2)}.toc-list{width:200px}.nav-results{right:0;width:200px;left:auto;padding:5px 0}.nav-results-filename{display:block;font-size:10px;opacity:.75}.nav-results a{display:block;line-height:15px;padding:5px 10px}.nav-results li:not([hidden])~li a{border-top:1px solid hsla(27,10%,90%,.1)}.dropdown a{padding:0 15px}.dropdown li:hover{background-color:hsl(207,10%,22%)}.nav{float:right;position:relative}.nav input[type="search"]{padding:2px 4px;color:#fff;width:150px;border:1px solid hsla(207,5%,0%,.3);background:hsla(207,12%,40%,.9);box-shadow:inset 1px 1px 3px hsla(207,5%,0%,.05),1px 1px 0 hsla(207,5%,100%,.05);border-radius:10px;-webkit-appearance:textfield}.nav input[type="search"]:focus{outline:0;background:hsla(207,7%,45%,.9)}.settings{text-align:center}.bar button{display:inline-block;vertical-align:middle;padding:0 5px;margin:0 3px;background:transparent}.bar button:first-child{margin-left:0}.settings .auto{line-height:32px;font-size:11px;font-weight:700;letter-spacing:-1px;text-shadow:none;text-transform:uppercase}body{font-family:sans-serif;font-size:14px;line-height:1.618}.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-left:20px;margin-right:20px}.preview,.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-top:10px}ul ul,ol ol,ul ol,ol ul,blockquote p:last-child{margin-top:0}ul,ol{padding-left:1.5em}p:last-child,ol:last-child,ul:last-child,dl:last-child{margin-bottom:20px}hr,h1,h2,h3,h4,h5,h6{margin:1em 20px .5em}h1:first-of-type{margin-top:20px}h1,h2,h3,h4,h5,h6{line-height:1.2;color:hsl(207,10%,50%)}h1 a,h1 a:hover,h1 a:visited{color:inherit;text-decoration:inherit}h1{font-size:3.052em;font-weight:400;color:hsl(207,10%,45%)}h2{font-size:1.953em}h3{font-size:1.536em}h1,h2,h3{letter-spacing:-.025em}h4{font-size:1.25em}h5{font-size:1em;text-transform:uppercase}h6{font-size:1em}.permalink{position:absolute;top:15px;right:15px}a{color:hsl(207,90%,50%);text-decoration:none}a:hover{color:hsl(207,95%,40%);text-decoration:underline}a:visited{color:hsl(207,100%,35%)}.preview-code,pre,code,var{font-style:normal;font-family:"Ubuntu Mono","Andale Mono","DejaVu Sans Mono","Monaco","Bitstream Vera Sans Mono","Consolas","Lucida Console",monospace;font-size:12px}.docs pre,code,var{padding:.1em 3px;background:hsla(207,5%,0%,.025);border:1px solid hsla(207,5%,0%,.05);border-radius:3px}.code pre{line-height:1.1!important}pre code{padding:0;background:transparent;border:0}.cf:before,.cf:after{content:'';display:table}.cf:after{clear:both}[unselectable="on"]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[hidden]{display:none!important}small{font-size:85%;opacity:.9}.docs .vars_list{width:100%}.docs .vars_list th,.docs .vars_list td{width:33%}.docs pre th{text-align:left}.docs pre table{border-collapse:collapse;margin:0}.docs th,.docs td{border:0;padding:9px 10px 9px 0;vertical-align:top}.docs tr th:last-child,.docs tr td:last-child{padding-right:0}.docs pre th{font-weight:400}.docs pre th.vars_head{border-bottom:1px solid #e5e5e5;color:#707070;white-space:nowrap}.docs pre th.vars_section{border-bottom:1px solid #e5e5e5;color:#333;font-size:18px;padding-top:30px}.vars_value{color:#338bb8}.docs li p{margin:0 0 20px}.dropdown a{text-transform:capitalize}#default-button #default-button-big+.preview+.preview-code{display:block}#actions-toolbar-alignment .preview-code,#reverse-primary-and-secondary-blocks .preview-code,#actions-toolbar-indents-customizations .preview-code,#actionstoolbarclearfloats-mixin .preview-code,#responsive-actions-toolbar .preview-code,#button-with-gradient-background .preview-code,#primary-button .preview-code,#button-as-an-icon .preview-code,#button-with-an-icon-on-the-left-or-right-side-of-the-text .preview-code,#button-with-fixed-width .preview-code,#button-as-a-link .preview-code,#link-as-a-button .preview-code,#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol .preview-code,#breadcrumbs-with-solid-background .preview-code,#pagination-without-label-with-solid-background .preview-code,#pagination-with-label-and-text-previousnext-links .preview-code,#pagination-with-label-and-gradient-background-on-links .preview-code,#fixed-height-popup .preview-code,#fixed-content-height-popup .preview-code,#margins-for-header-content-and-footer-block-in-popup .preview-code,#popup-titles-with-styled-as-theme-headings .preview-code,#popup-action-toolbar .preview-code,#popup-close-button-without-an-icon .preview-code,#modify-icon-of-popup-close-button .preview-code,#modify-overlay-styles .preview-code,#rating-summary-multiple-ratings .preview-code,#rating-summary-hide-label .preview-code,#rating-summary-icons-symbol .preview-code,#rating-summary-icons-color .preview-code,#rating-summary-set-number-of-icons .preview-code,#rating-summary .preview-code,#rating-with-vote-icon-symbol .preview-code,#rating-with-vote-setup-icons-colors .preview-code,#rating-with-vote-setup-number-of-icons .preview-code,#tabs-with-content-top-border .preview-code,#accordion-mixin-variables .preview-code,#tabs-base .preview-code,#accordion-base .preview-code,#warning-message .preview-code,#error-message .preview-code,#success-message .preview-code,#notice-message .preview-code,#message-with-inner-icon .preview-code,#message-with-lateral-icon .preview-code,#custom-message-style .preview-code,#modify-dropdown-list-styles .preview-code,#dropdown-with-icon-customization .preview-code,#split-button-button-styling .preview-code,#split-button-icon-customization .preview-code,#split-button-dropdown-list-customization .preview-code,#table-cells-resize .preview-code,#table-caption .preview-code,#table-typography .preview-code,#table-background-customization .preview-code,#table-borders-customization .preview-code,#table-without-borders .preview-code,#table-with-horizontal-borders .preview-code,#table-with-vertical-borders .preview-code,#striped-table .preview-code,#responsive-table-technics-1 .preview-code,#responsive-table-technics-2 .preview-code,#fontsize-mixin .preview-code,#word-breaking-mixin .preview-code,#word-breaking-mixin .preview-code,#text-overflow-mixin .preview-code,#text-hide .preview-code,#hyphens .preview-code,#font-style-and-color .preview-code,#reset-list-styles .preview-code,#inlineblock-list-item-styling .preview-code,#link-styling-mixin .preview-code,#heading-styling-mixin .preview-code,#icon-with-image-or-sprite .preview-code,#change-the-size-of-font-icon .preview-code,#sprite-and-font-icons-for-blank-theme .preview-code,#icon-position-for-an-icon-with-image-or-sprite .preview-code{display:none}article[id$="-variables"] .docs,#resets .docs,#ratings .docs,#tabs-and-accordions .docs,#messages .docs,#dropdown-and-split-buttons-mixins .docs,#font-face-mixin .docs,#layout .docs,#forms-mixins .docs,#including-magento-ui-library-to-your-theme .docs,#global-forms-elements-customization .docs,#mobile-off-canvas-navigation .docs,#desktop-navigation .docs,#layout-width .docs{width:100%}article[id$="-variables"] .code{display:none}article[id$="-variables"] .docs pre{background:#fff;border:0;margin-top:0}</style><script type="text/preview">(function(){"use strict";var a=function(a){return Array.prototype.slice.call(a)},b=document.getElementsByTagName("body")[0],c=["link","visited","hover","active","focus","target","enabled","disabled","checked"],d=new RegExp(":(("+c.join(")|(")+"))","gi"),e=a(document.styleSheets).map(function(b){return a(b.cssRules).filter(function(a){return a.selectorText&&a.selectorText.match(d)}).map(function(a){return a.cssText.replace(d,".\\3A $1")}).join("")}).join("");if(e.length){var f=document.createElement("style");f.innerText=e;var g=document.getElementsByTagName("style")[0];g.parentNode.insertBefore(f,g)}var h=function(){var a=window.getComputedStyle(b,null);return function(){if(b.childElementCount===0)return b.offsetHeight;var c=b.getElementsByTagName("*"),d=[];for(var e=0,f=c.length;e<f;e++)d.push(c[e].offsetTop+c[e].offsetHeight+parseInt(window.getComputedStyle(c[e],null).getPropertyValue("margin-bottom")));var g=Math.max.apply(Math,d);return g+=parseInt(a.getPropertyValue("padding-bottom"),10),Math.max(g,b.offsetHeight)}}(),i={getHeight:function(){window.parent.postMessage({height:h()},"*")}};window.addEventListener("message",function(a){if(a.data==null)return;typeof a.data=="string"&&i[a.data]()},!1)})()</script><style type="text/preview">.actions-toolbar:before,.actions-toolbar:after{content:"";display:table}.actions-toolbar:after{clear:both}.actions-toolbar .primary{float:left}.actions-toolbar .secondary{float:right}.actions-toolbar .primary,.actions-toolbar .secondary{display:inline-block}.actions-toolbar .primary a.action,.actions-toolbar .secondary a.action{display:inline-block}.actions-toolbar .primary .action{margin:0 5px 0 0}.actions-toolbar .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-2:before,.example-actions-toolbar-2:after{content:"";display:table}.example-actions-toolbar-2:after{clear:both}.example-actions-toolbar-2 .primary{float:left}.example-actions-toolbar-2 .secondary{float:right}.example-actions-toolbar-2 .primary,.example-actions-toolbar-2 .secondary{display:inline-block}.example-actions-toolbar-2 .primary a.action,.example-actions-toolbar-2 .secondary a.action{display:inline-block}.example-actions-toolbar-2 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-2 .secondary a.action{margin-top:6px}.example-actions-toolbar-3{text-align:left}.example-actions-toolbar-3:before,.example-actions-toolbar-3:after{content:"";display:table}.example-actions-toolbar-3:after{clear:both}.example-actions-toolbar-3 .primary{float:left}.example-actions-toolbar-3 .primary,.example-actions-toolbar-3 .secondary{display:inline-block}.example-actions-toolbar-3 .primary a.action,.example-actions-toolbar-3 .secondary a.action{display:inline-block}.example-actions-toolbar-3 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-3 .secondary a.action{margin-top:6px}.example-actions-toolbar-4{text-align:right}.example-actions-toolbar-4:before,.example-actions-toolbar-4:after{content:"";display:table}.example-actions-toolbar-4:after{clear:both}.example-actions-toolbar-4 .secondary{float:right}.example-actions-toolbar-4 .primary,.example-actions-toolbar-4 .secondary{display:inline-block}.example-actions-toolbar-4 .primary a.action,.example-actions-toolbar-4 .secondary a.action{display:inline-block}.example-actions-toolbar-4 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-4 .secondary a.action{margin-top:6px}.example-actions-toolbar-5{text-align:center}.example-actions-toolbar-5:before,.example-actions-toolbar-5:after{content:"";display:table}.example-actions-toolbar-5:after{clear:both}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{vertical-align:top}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{display:inline-block}.example-actions-toolbar-5 .primary a.action,.example-actions-toolbar-5 .secondary a.action{display:inline-block}.example-actions-toolbar-5 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-5 .secondary a.action{margin-top:6px}.example-actions-toolbar-6:before,.example-actions-toolbar-6:after{content:"";display:table}.example-actions-toolbar-6:after{clear:both}.example-actions-toolbar-6 .primary{float:right}.example-actions-toolbar-6 .secondary{float:left}.example-actions-toolbar-6 .primary,.example-actions-toolbar-6 .secondary{display:inline-block}.example-actions-toolbar-6 .primary a.action,.example-actions-toolbar-6 .secondary a.action{display:inline-block}.example-actions-toolbar-6 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-6 .secondary a.action{margin-top:6px}.example-actions-toolbar-7{text-align:left}.example-actions-toolbar-7:before,.example-actions-toolbar-7:after{content:"";display:table}.example-actions-toolbar-7:after{clear:both}.example-actions-toolbar-7 .secondary{float:left}.example-actions-toolbar-7 .primary,.example-actions-toolbar-7 .secondary{display:inline-block}.example-actions-toolbar-7 .primary a.action,.example-actions-toolbar-7 .secondary a.action{display:inline-block}.example-actions-toolbar-7 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-7 .secondary a.action{margin-top:6px}.example-actions-toolbar-8{text-align:right}.example-actions-toolbar-8:before,.example-actions-toolbar-8:after{content:"";display:table}.example-actions-toolbar-8:after{clear:both}.example-actions-toolbar-8 .primary{float:right}.example-actions-toolbar-8 .primary,.example-actions-toolbar-8 .secondary{display:inline-block}.example-actions-toolbar-8 .primary a.action,.example-actions-toolbar-8 .secondary a.action{display:inline-block}.example-actions-toolbar-8 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-8 .secondary a.action{margin-top:6px}.example-actions-toolbar-9{margin:10px;padding:10px}.example-actions-toolbar-9:before,.example-actions-toolbar-9:after{content:"";display:table}.example-actions-toolbar-9:after{clear:both}.example-actions-toolbar-9 .primary{float:left}.example-actions-toolbar-9 .secondary{float:right}.example-actions-toolbar-9 .primary,.example-actions-toolbar-9 .secondary{display:inline-block}.example-actions-toolbar-9 .primary a.action,.example-actions-toolbar-9 .secondary a.action{display:inline-block}.example-actions-toolbar-9 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-9 .secondary a.action{margin-top:6px}.example-actions-toolbar-10{text-align:left}.example-actions-toolbar-10:before,.example-actions-toolbar-10:after{content:"";display:table}.example-actions-toolbar-10:after{clear:both}.example-actions-toolbar-10 .primary{float:left}.example-actions-toolbar-10 .primary,.example-actions-toolbar-10 .secondary{display:inline-block}.example-actions-toolbar-10 .primary a.action,.example-actions-toolbar-10 .secondary a.action{display:inline-block}.example-actions-toolbar-10 .primary .action{margin:0 50px 0 0}.example-actions-toolbar-10 .secondary a.action{margin-top:6px}.example-actions-toolbar-11{text-align:left}.example-actions-toolbar-11:before,.example-actions-toolbar-11:after{content:"";display:table}.example-actions-toolbar-11:after{clear:both}.example-actions-toolbar-11 .primary{float:left}.example-actions-toolbar-11 .primary,.example-actions-toolbar-11 .secondary{display:inline-block}.example-actions-toolbar-11 .primary a.action,.example-actions-toolbar-11 .secondary a.action{display:inline-block}.example-actions-toolbar-11 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-11 .secondary .action{margin:0 50px 0 0}.example-actions-toolbar-11 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}@media only screen and (max-width: 768px){.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{ display:block;float:none}}.example-breadcrumbs-1{margin:0 0 20px}.example-breadcrumbs-1 .items{font-size:1.2rem;color:#a3a3a3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-1 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-1 .item{margin:0}.example-breadcrumbs-1 a{color:#333;text-decoration:none}.example-breadcrumbs-1 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-1 a:hover{color:#333;text-decoration:underline}.example-breadcrumbs-1 a:active{color:#333;text-decoration:none}.example-breadcrumbs-1 strong{font-weight:400}.example-breadcrumbs-1 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-1 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-2{margin:0 0 20px}.example-breadcrumbs-2 .items{font-size:1.2rem;color:#1979c3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-2 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-2 .item{margin:0}.example-breadcrumbs-2 a{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #ccc;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-2 a:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 strong{background-color:#ff5501;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f7b32e 0, #ff5501 100%);background-image:linear-gradient(to bottom, #f7b32e 0, #ff5501 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7b32e', endColorstr='#ff5501', GradientType=0);border:1px solid #d04b0a;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-2 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-2 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3{margin:0 0 20px}.example-breadcrumbs-3 .items{font-size:1.2rem;color:#333;margin:0;padding:0;list-style:none none}.example-breadcrumbs-3 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-3 .item{margin:0}.example-breadcrumbs-3 a{background:#f4f4f4;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-3 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-3 a:hover{background:#ccc;color:#333;text-decoration:none}.example-breadcrumbs-3 a:active{color:#333;text-decoration:none}.example-breadcrumbs-3 strong{background:#e7e7e7;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-3 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-3 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3 .item a{position:relative;margin:0 11px 0 0}.example-breadcrumbs-3 .item a:after{border:12px solid transparent;height:0;width:0;border-left-color:#f4f4f4;content:"";position:absolute;display:block;top:0;right:-23px}.example-breadcrumbs-3 .item a:hover:after{border-color:transparent transparent transparent #ccc}button{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}button:focus,button:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}button:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}button.disabled,button[disabled],fieldset[disabled] button{cursor:default;pointer-events:none;opacity:.5}button:active,button:focus{box-shadow:inset 0 2px 1px rgba(0,0,0,.12)}.example-button-1.example-button-2{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-button-1.example-button-3{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;border-radius:0;color:#000}.example-button-1.example-button-3:hover,.example-button-1.example-button-3.active{color:#000}.example-button-10{background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-10>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-button-10:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-10:hover:before{color:inherit}.example-button-10:active:before{color:inherit}.example-button-10:focus,.example-button-10:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-10:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:default;pointer-events:none;opacity:.5}.example-button-10:focus,.example-button-10:active{background:0;border:0}.example-button-10:hover{background:0;border:0}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-11{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-11:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-11:hover:before{color:inherit}.example-button-11:active:before{color:inherit}.example-button-11:focus,.example-button-11:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-11:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-11.disabled,.example-button-11[disabled],fieldset[disabled] .example-button-11{cursor:default;pointer-events:none;opacity:.5}.example-button-12{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-12:after{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-12:hover:after{color:inherit}.example-button-12:active:after{color:inherit}.example-button-12:focus,.example-button-12:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-12:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-12.disabled,.example-button-12[disabled],fieldset[disabled] .example-button-12{cursor:default;pointer-events:none;opacity:.5}.example-button-13{background-image:none;background:#f2f2f2;padding:7px 15px;width:100px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-13:focus,.example-button-13:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-13:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-13.disabled,.example-button-13[disabled],fieldset[disabled] .example-button-13{cursor:default;pointer-events:none;opacity:.5}.example-button-4{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-4:focus,.example-button-4:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4.disabled,.example-button-4[disabled],fieldset[disabled] .example-button-4{cursor:default;pointer-events:none;opacity:.5}.example-button-4:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-4.example-button-5{line-height:2.2rem;padding:7px 35px;font-size:1.8rem}.example-button-4.example-button-6{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;color:#fff}.example-button-4.example-button-6:hover,.example-button-4.example-button-6.active{color:#fff}.example-button-7{background-image:none;background:#f2f2f2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #1979c3 0, #006bb4 100%);background-image:linear-gradient(to bottom, #1979c3 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1979c3', endColorstr='#006bb4', GradientType=0);padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}.example-button-7:focus,.example-button-7:active{background:#e2e2e2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #006bb4 100%);background-image:linear-gradient(to bottom, #006bb4 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#006bb4', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7:hover{background:#e2e2e2;background-color:#1979c3;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #1979c3 100%);background-image:linear-gradient(to bottom, #006bb4 0, #1979c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#1979c3', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7.disabled,.example-button-7[disabled],fieldset[disabled] .example-button-7{cursor:default;pointer-events:none;opacity:.5}.example-button-7:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-8{background:0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;font-weight:400}.example-button-8:visited{color:#1979c3;text-decoration:none}.example-button-8:hover{color:#006bb4;text-decoration:underline}.example-button-8:active{color:#ff5501;text-decoration:underline}.example-button-8:hover{color:#006bb4}.example-button-8:hover,.example-button-8:active,.example-button-8:focus{background:0;border:0}.example-button-8.disabled,.example-button-8[disabled],fieldset[disabled] .example-button-8{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.example-button-8:active{box-shadow:none}.example-button-9{text-decoration:none;background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:0;vertical-align:middle;margin:3px;border-radius:3px;font-weight:700}.example-button-9:hover,.example-button-9:active,.example-button-9:focus{text-decoration:none}.example-button-9:focus,.example-button-9:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-9:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-9.disabled,.example-button-9[disabled],fieldset[disabled] .example-button-9{cursor:default;pointer-events:none;opacity:.5}.example-button-9:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-14{background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-14:focus,.example-button-14:active{background:0;border:0}.example-button-14:hover{background:0;border:0}.example-button-14.disabled,.example-button-14[disabled],fieldset[disabled] .example-button-14{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-15{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;vertical-align:middle;background:#f2f2f2;color:#333;border:1px solid #cdcdcd}.example-button-15:focus,.example-button-15:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15.disabled,.example-button-15[disabled],fieldset[disabled] .example-button-15{cursor:default;pointer-events:none;opacity:.5}.example-button-15:focus,.example-button-15:active{background:#e2e2e2;color:#333;border:1px solid #cdcdcd}.example-button-15:hover{background:#e2e2e2;color:#555;border:1px solid #cdcdcd}.example-button-17{line-height:2.2rem;padding:14px 17px;font-size:1.8rem;font-size:1.4rem;line-height:1.6rem;padding:7px 15px}.example-button-18{font-size:1rem;line-height:1.2rem;padding:4px 10px}.example-dropdown-1{display:inline-block;position:relative}.example-dropdown-1:before,.example-dropdown-1:after{content:"";display:table}.example-dropdown-1:after{clear:both}.example-dropdown-1 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle:hover:after{color:inherit}.example-dropdown-1 .action.toggle:active:after{color:inherit}.example-dropdown-1 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle.active:hover:after{color:inherit}.example-dropdown-1 .action.toggle.active:active:after{color:inherit}.example-dropdown-1 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-1 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-1 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-1 ul.dropdown:before,.example-dropdown-1 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-1 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-1 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-1 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-1 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-1.active{overflow:visible}.example-dropdown-1.active ul.dropdown{display:block}.example-dropdown-2{display:inline-block;position:relative}.example-dropdown-2:before,.example-dropdown-2:after{content:"";display:table}.example-dropdown-2:after{clear:both}.example-dropdown-2 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle:hover:after{color:inherit}.example-dropdown-2 .action.toggle:active:after{color:inherit}.example-dropdown-2 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle.active:hover:after{color:inherit}.example-dropdown-2 .action.toggle.active:active:after{color:inherit}.example-dropdown-2 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-2 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-2 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-2 ul.dropdown:before,.example-dropdown-2 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-2 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-2 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-2 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-2 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-2.active{overflow:visible}.example-dropdown-2.active ul.dropdown{display:block}.example-dropdown-3{display:inline-block;position:relative}.example-dropdown-3:before,.example-dropdown-3:after{content:"";display:table}.example-dropdown-3:after{clear:both}.example-dropdown-3 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle:hover:before{color:red}.example-dropdown-3 .action.toggle:active:before{color:inherit}.example-dropdown-3 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle.active:hover:before{color:red}.example-dropdown-3 .action.toggle.active:active:before{color:inherit}.example-dropdown-3 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-3 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-3 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-3 ul.dropdown:before,.example-dropdown-3 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-3 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-3 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-3 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-3 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-3.active{overflow:visible}.example-dropdown-3.active ul.dropdown{display:block}.example-dropdown-5{display:inline-block;position:relative}.example-dropdown-5:before,.example-dropdown-5:after{content:"";display:table}.example-dropdown-5:after{clear:both}.example-dropdown-5 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle:hover:after{color:inherit}.example-dropdown-5 .action.toggle:active:after{color:inherit}.example-dropdown-5 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle.active:hover:after{color:inherit}.example-dropdown-5 .action.toggle.active:active:after{color:inherit}.example-dropdown-5 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-5 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-5 ul.dropdown li:first-child{border:0}.example-dropdown-5 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-5.active{overflow:visible}.example-dropdown-5.active ul.dropdown{display:block}.example-dropdown-6{display:inline-block;position:relative}.example-dropdown-6:before,.example-dropdown-6:after{content:"";display:table}.example-dropdown-6:after{clear:both}.example-dropdown-6 .action.split{float:left;margin:0}.example-dropdown-6 .action.toggle{float:right;margin:0}.example-dropdown-6 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-6 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-6 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle:hover:after{color:inherit}.example-dropdown-6 .action.toggle:active:after{color:inherit}.example-dropdown-6 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle.active:hover:after{color:inherit}.example-dropdown-6 .action.toggle.active:active:after{color:inherit}.example-dropdown-6 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-6 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-6 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-6 ul.dropdown:before,.example-dropdown-6 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-6 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-6 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-6 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-6 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-6.active{overflow:visible}.example-dropdown-6.active ul.dropdown{display:block}.split.example-dropdown-7{display:inline-block;position:relative}.split.example-dropdown-7:before,.split.example-dropdown-7:after{content:"";display:table}.split.example-dropdown-7:after{clear:both}.split.example-dropdown-7 .action.split{float:left;margin:0}.split.example-dropdown-7 .action.toggle{float:right;margin:0}.split.example-dropdown-7 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle:active:after{color:inherit}.split.example-dropdown-7 .action.toggle.active{display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle.active:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle.active:active:after{color:inherit}.split.example-dropdown-7 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.split.example-dropdown-7 ul.dropdown li{margin:0;padding:3px 5px}.split.example-dropdown-7 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.split.example-dropdown-7 ul.dropdown:before,.split.example-dropdown-7 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.split.example-dropdown-7 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.split.example-dropdown-7 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.split.example-dropdown-7 ul.dropdown:before{top:-12px;right:10px}.split.example-dropdown-7 ul.dropdown:after{top:-14px;right:9px}.split.example-dropdown-7.active{overflow:visible}.split.example-dropdown-7.active ul.dropdown{display:block}.example-dropdown-8{display:inline-block;position:relative}.example-dropdown-8:before,.example-dropdown-8:after{content:"";display:table}.example-dropdown-8:after{clear:both}.example-dropdown-8 .action.split{float:left;margin:0}.example-dropdown-8 .action.toggle{float:right;margin:0}.example-dropdown-8 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-8 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-8 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle:hover:after{color:inherit}.example-dropdown-8 .action.toggle:active:after{color:inherit}.example-dropdown-8 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle.active:hover:after{color:inherit}.example-dropdown-8 .action.toggle.active:active:after{color:inherit}.example-dropdown-8 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-8 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-8 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-8 ul.dropdown:before,.example-dropdown-8 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-8 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-8 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-8 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-8 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-8.active{overflow:visible}.example-dropdown-8.active ul.dropdown{display:block}.example-dropdown-9{display:inline-block;position:relative}.example-dropdown-9 .action.split,.example-dropdown-9 .action.toggle{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-dropdown-9:before,.example-dropdown-9:after{content:"";display:table}.example-dropdown-9:after{clear:both}.example-dropdown-9 .action.split{float:left;margin:0}.example-dropdown-9 .action.toggle{float:right;margin:0}.example-dropdown-9 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-9 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-9 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle:hover:after{color:inherit}.example-dropdown-9 .action.toggle:active:after{color:inherit}.example-dropdown-9 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle.active:hover:after{color:inherit}.example-dropdown-9 .action.toggle.active:active:after{color:inherit}.example-dropdown-9 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-9 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-9 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-9 ul.dropdown:before,.example-dropdown-9 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-9 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-9 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-9 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-9 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-9.active{overflow:visible}.example-dropdown-9.active ul.dropdown{display:block}.example-dropdown-10{display:inline-block;position:relative}.example-dropdown-10 .action.split,.example-dropdown-10 .action.toggle{line-height:1.2rem;padding:5px 8px;font-size:1.1rem}.example-dropdown-10:before,.example-dropdown-10:after{content:"";display:table}.example-dropdown-10:after{clear:both}.example-dropdown-10 .action.split{float:left;margin:0}.example-dropdown-10 .action.toggle{float:right;margin:0}.example-dropdown-10 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-10 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-10 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle:hover:after{color:inherit}.example-dropdown-10 .action.toggle:active:after{color:inherit}.example-dropdown-10 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle.active:hover:after{color:inherit}.example-dropdown-10 .action.toggle.active:active:after{color:inherit}.example-dropdown-10 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-10 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-10 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-10 ul.dropdown:before,.example-dropdown-10 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-10 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-10 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-10 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-10 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-10.active{overflow:visible}.example-dropdown-10.active ul.dropdown{display:block}.example-dropdown-11{display:inline-block;position:relative}.example-dropdown-11:before,.example-dropdown-11:after{content:"";display:table}.example-dropdown-11:after{clear:both}.example-dropdown-11 .action.split{float:right;margin:0}.example-dropdown-11 .action.toggle{float:left;margin:0}.example-dropdown-11 button.action.split{border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-11 button+.action.toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-11 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle:hover:before{color:red}.example-dropdown-11 .action.toggle:active:before{color:inherit}.example-dropdown-11 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle.active:hover:before{color:red}.example-dropdown-11 .action.toggle.active:active:before{color:inherit}.example-dropdown-11 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-11 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-11 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-11 ul.dropdown:before,.example-dropdown-11 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-11 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-11 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-11 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-11 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-11.active{overflow:visible}.example-dropdown-11.active ul.dropdown{display:block}.example-dropdown-12{display:inline-block;position:relative}.example-dropdown-12:before,.example-dropdown-12:after{content:"";display:table}.example-dropdown-12:after{clear:both}.example-dropdown-12 .action.split{float:left;margin:0}.example-dropdown-12 .action.toggle{float:right;margin:0}.example-dropdown-12 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-12 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-12 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle:hover:after{color:inherit}.example-dropdown-12 .action.toggle:active:after{color:inherit}.example-dropdown-12 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle.active:hover:after{color:inherit}.example-dropdown-12 .action.toggle.active:active:after{color:inherit}.example-dropdown-12 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-12 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-12 ul.dropdown li:first-child{border:0}.example-dropdown-12 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-12.active{overflow:visible}.example-dropdown-12.active ul.dropdown{display:block}.example-form-1 .example-form-1-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-1 .example-form-1-fieldset>*{letter-spacing:normal}.example-form-1 .example-form-1-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-1 .example-form-1-fieldset:after{content:attr(data-hasrequired);display:block;font-size:1.2rem;color:#e02b27;margin:10px 0 0;letter-spacing:normal;word-spacing:normal}.example-form-1 .example-form-1-fieldset>.field{margin:0 0 20px}.example-form-1 .example-form-1-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-1 .example-form-1-fieldset>.field:last-child{margin-bottom:0}.example-form-1 .example-form-1-fieldset>.field>.label{font-weight:700}.example-form-1 .example-form-1-fieldset>.field>.label+br{display:none}.example-form-1 .example-form-1-fieldset>.field .choice input{vertical-align:top}.example-form-1 .example-form-1-fieldset>.field .fields.group:before,.example-form-1 .example-form-1-fieldset>.field .fields.group:after{content:"";display:table}.example-form-1 .example-form-1-fieldset>.field .fields.group:after{clear:both}.example-form-1 .example-form-1-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-1 .example-form-1-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-1 .example-form-1-fieldset>.field .addon textarea,.example-form-1 .example-form-1-fieldset>.field .addon select,.example-form-1 .example-form-1-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;box-shadow:none;display:inline-block;margin:0;width:auto}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore,.example-form-1 .example-form-1-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:disabled,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-1 .example-form-1-fieldset>.field .additional{margin-top:10px}.example-form-1 .example-form-1-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-1 .example-form-1-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-1 .example-form-1-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-form-2 .example-form-2-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-2 .example-form-2-fieldset>*{letter-spacing:normal}.example-form-2 .example-form-2-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-2 .example-form-2-fieldset>.field{margin:0 0 20px;box-sizing:border-box;display:inline-block;padding:0 12px 0 0;width:50%;vertical-align:top}.example-form-2 .example-form-2-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-2 .example-form-2-fieldset>.field:last-child{margin-bottom:0}.example-form-2 .example-form-2-fieldset>.field+.fieldset{clear:both}.example-form-2 .example-form-2-fieldset>.field>.label{font-weight:700}.example-form-2 .example-form-2-fieldset>.field>.label+br{display:none}.example-form-2 .example-form-2-fieldset>.field .choice input{vertical-align:top}.example-form-2 .example-form-2-fieldset>.field .fields.group:before,.example-form-2 .example-form-2-fieldset>.field .fields.group:after{content:"";display:table}.example-form-2 .example-form-2-fieldset>.field .fields.group:after{clear:both}.example-form-2 .example-form-2-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-2 .example-form-2-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-2 .example-form-2-fieldset>.field .addon textarea,.example-form-2 .example-form-2-fieldset>.field .addon select,.example-form-2 .example-form-2-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;box-shadow:none;display:inline-block;margin:0;width:auto}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore,.example-form-2 .example-form-2-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:disabled,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-2 .example-form-2-fieldset>.field .additional{margin-top:10px}.example-form-2 .example-form-2-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-2 .example-form-2-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-2 .example-form-2-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}input[type="text"],input[type="password"],input[type="url"],input[type="tel"],input[type="search"],input[type="number"],input[type="datetime"],input[type="email"]{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}input[type="text"]:disabled,input[type="password"]:disabled,input[type="url"]:disabled,input[type="tel"]:disabled,input[type="search"]:disabled,input[type="number"]:disabled,input[type="datetime"]:disabled,input[type="email"]:disabled{opacity:.5}input[type="text"]::-moz-placeholder,input[type="password"]::-moz-placeholder,input[type="url"]::-moz-placeholder,input[type="tel"]::-moz-placeholder,input[type="search"]::-moz-placeholder,input[type="number"]::-moz-placeholder,input[type="datetime"]::-moz-placeholder,input[type="email"]::-moz-placeholder{color:#c2c2c2}input[type="text"]::-webkit-input-placeholder,input[type="password"]::-webkit-input-placeholder,input[type="url"]::-webkit-input-placeholder,input[type="tel"]::-webkit-input-placeholder,input[type="search"]::-webkit-input-placeholder,input[type="number"]::-webkit-input-placeholder,input[type="datetime"]::-webkit-input-placeholder,input[type="email"]::-webkit-input-placeholder{color:#c2c2c2}input[type="text"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder,input[type="url"]:-ms-input-placeholder,input[type="tel"]:-ms-input-placeholder,input[type="search"]:-ms-input-placeholder,input[type="number"]:-ms-input-placeholder,input[type="datetime"]:-ms-input-placeholder,input[type="email"]:-ms-input-placeholder{color:#c2c2c2}select{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:5px 10px 4px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}select:disabled{opacity:.5}select[multiple="multiple"]{height:auto;margin-bottom:20px}textarea{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:auto;width:100%;padding:10px;margin:0;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;resize:vertical}textarea:disabled{opacity:.5}textarea::-moz-placeholder{color:#c2c2c2}textarea::-webkit-input-placeholder{color:#c2c2c2}textarea:-ms-input-placeholder{color:#c2c2c2}input[type="checkbox"]{margin:2px 5px 0 0}input[type="checkbox"]:disabled{opacity:.5}input[type="radio"]{margin:2px 5px 0 0}input[type="radio"]:disabled{opacity:.5}input.text-example-1,select.select-example-1,textarea.textarea-example-1{background:#fdf0d5;border-color:#fc0;color:#b30000}input.text-example-1:focus,select.select-example-1:focus,textarea.textarea-example-1:focus{border-color:#cff;color:#060}input.text-example-1:disabled,select.select-example-1:disabled,textarea.textarea-example-1:disabled{color:#fcc}input.text-example-1::-moz-placeholder,textarea.textarea-example-1::-moz-placeholder{color:#ccc}input.text-example-1::-webkit-input-placeholder,textarea.textarea-example-1::-webkit-input-placeholder{color:#ccc}input.text-example-1:-ms-input-placeholder,textarea.textarea-example-1:-ms-input-placeholder{color:#ccc}.number-example{-moz-appearance:textfield}.number-example::-webkit-inner-spin-button,.number-example::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.search-example{-webkit-appearance:none}.search-example::-webkit-search-cancel-button,.search-example::-webkit-search-decoration,.search-example::-webkit-search-results-button,.search-example::-webkit-search-results-decoration{-webkit-appearance:none}input,textarea,select{font-size:1.2rem;color:#e02b27}.example-icon-1{display:inline-block}.example-icon-1:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-2{display:inline-block}.example-icon-2:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -26px 0}.example-icon-3{display:inline-block}.example-icon-3>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-3:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -156px -52px}.example-icon-4{display:inline-block;text-decoration:none}.example-icon-4:before{font-family:'icons-blank-theme';content:'\e606';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-5{display:inline-block;text-decoration:none}.example-icon-5:after{font-family:'icons-blank-theme';content:'\e605';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-6{display:inline-block;text-decoration:none}.example-icon-6>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-6:before{font-family:'icons-blank-theme';content:'\e61b';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-7{display:inline-block}.example-icon-7:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8{display:inline-block}.example-icon-8:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8:before{background-position:-182px 0}.example-icon-9{display:inline-block}.example-icon-9:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-9:after{background-position:-52px -26px}.example-icon-10{display:inline-block}.example-icon-10:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-10:before{background-position:-104px 0}.example-icon-11{display:inline-block}.example-icon-11:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-11:before{width:30px;height:30px}.example-icon-11:after{width:30px;height:30px}.example-icon-11:before{background-color:#f1f1f1}.example-icon-12{display:inline-block;text-decoration:none}.example-icon-12:before{font-family:'icons-blank-theme';content:'\e612';font-size:28px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13{display:inline-block;text-decoration:none}.example-icon-13:before{font-family:'icons-blank-theme';content:'\e612';font-size:inherit;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13:before{font-size:26px;line-height:inherit}.example-icon-14{display:inline-block;text-decoration:none}.example-icon-14:before{font-family:'icons-blank-theme';content:'\e61d';font-size:26px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-14>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.icons-image-list{list-style:none;padding:0}.icons-image-list li{float:left;width:33%}.icons-image-list li>span{display:inline-block}.icons-image-list li>span:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.icons-image-list li .icon-search:before{background-position:0 0}.icons-image-list li .icon-cart:before{background-position:-26px 0}.icons-image-list li .icon-arrow-down:before{background-position:-52px 0}.icons-image-list li .icon-arrow-up:before{background-position:-78px 0}.icons-image-list li .icon-grid:before{background-position:-104px 0}.icons-image-list li .icon-list:before{background-position:-130px 0}.icons-image-list li .icon-remove:before{background-position:-156px 0}.icons-image-list li .icon-star:before{background-position:-182px 0}.icons-image-list li .icon-pointer-down:before{background-position:-208px 0}.icons-image-list li .icon-pointer-up:before{background-position:-234px 0}.icons-image-list li .icon-pointer-left:before{background-position:-260px 0}.icons-image-list li .icon-pointer-right:before{background-position:-286px 0}.icons-image-list li .icon-compare-empty:before{background-position:0 -26px}.icons-image-list li .icon-compare-full:before{background-position:-26px -26px}.icons-image-list li .icon-wishlist-empty:before{background-position:-52px -26px}.icons-image-list li .icon-wishlist-full:before{background-position:-78px -26px}.icons-image-list li .icon-update:before{background-position:-104px -26px}.icons-image-list li .icon-collapse:before{background-position:-130px -26px}.icons-image-list li .icon-expand:before{background-position:-156px -26px}.icons-image-list li .icon-menu:before{background-position:-182px -26px}.icons-image-list li .icon-prev:before{background-position:-208px -26px}.icons-image-list li .icon-next:before{background-position:-234px -26px}.icons-image-list li .icon-settings:before{background-position:-260px -26px}.icons-image-list li .icon-info:before{background-position:-286px -26px}.icons-image-list li .icon-checkmark:before{background-position:0 -52px}.icons-image-list li .icon-calendar:before{background-position:-26px -52px}.icons-image-list li .icon-comment:before{background-position:-52px -52px}.icons-image-list li .icon-comment-reflected:before{background-position:-78px -52px}.icons-image-list li .icon-envelope:before{background-position:-104px -52px}.icons-image-list li .icon-warning:before{background-position:-130px -52px}.icons-image-list li .icon-trash:before{background-position:-156px -52px}.icons-image-list li .icon-flag:before{background-position:-182px -52px}.icons-image-list li .icon-location:before{background-position:-208px -52px}.icons-image-list li .icon-up:before{background-position:-234px -52px}.icons-image-list li .icon-down:before{background-position:-260px -52px}.icons-font-list{list-style:none;padding:0}.icons-font-list li{float:left;width:25%;margin-bottom:35px;text-align:center}.icons-font-list li>span{display:inline-block;text-decoration:none}.icons-font-list li>span:before{font-family:'icons-blank-theme';font-size:34px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.icons-font-list li>span:before{content:attr(data-icon);margin:0 auto;display:block}.loader{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.5);z-index:9999}.loader:before{border-radius:5px;background:transparent url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%;box-sizing:border-box;content:'';position:absolute;top:0;right:0;left:0;bottom:0;margin:auto;width:160px;height:160px}.loading{position:relative}.loading:before{content:'';position:absolute;left:0;top:0;right:0;bottom:0;background:rgba(255,255,255,.5) url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%}.example-message-info{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-info a{color:#1979c3}.example-message-info a:hover{color:#006bb4}.example-message-info a:active{color:#006bb4}.example-message-warning{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-warning a{color:#1979c3}.example-message-warning a:hover{color:#006bb4}.example-message-warning a:active{color:#006bb4}.example-message-error{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27}.example-message-error a{color:#1979c3}.example-message-error a:hover{color:#006bb4}.example-message-error a:active{color:#006bb4}.example-message-success{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400}.example-message-success a{color:#1979c3}.example-message-success a:hover{color:#006bb4}.example-message-success a:active{color:#006bb4}.example-message-notice{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-notice a{color:#1979c3}.example-message-notice a:hover{color:#006bb4}.example-message-notice a:active{color:#006bb4}.example-message-1{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400;position:relative;padding-left:40px}.example-message-1 a{color:#1979c3}.example-message-1 a:hover{color:#006bb4}.example-message-1 a:active{color:#006bb4}.example-message-1>:first-child:before{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#c07600;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:40px}.example-message-2{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27;position:relative;padding-right:40px}.example-message-2 a{color:#1979c3}.example-message-2 a:hover{color:#006bb4}.example-message-2 a:active{color:#006bb4}.example-message-2:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#b30000}.example-message-2>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-2>:first-child:after{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-2:before{right:0}.example-message-2>:first-child:before{border:5px solid transparent;height:0;width:0;border-right-color:#b30000;right:30px}.example-message-2>:first-child:after{right:0}.example-message-3{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400;position:relative;padding-left:40px}.example-message-3 a{color:#1979c3}.example-message-3 a:hover{color:#006bb4}.example-message-3 a:active{color:#006bb4}.example-message-3:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#006400}.example-message-3>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-3>:first-child:after{font-family:'icons-blank-theme';content:'\e610';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-3:before{left:0}.example-message-3>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#006400;left:30px}.example-message-3>:first-child:after{left:0}.example-message-4{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fc0;border-color:#ffa500;color:#000;position:relative;padding-left:40px;border-width:4px;border-radius:10px}.example-message-4 a{color:#00f}.example-message-4 a:hover{color:#009}.example-message-4 a:active{color:#006}.example-message-4:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#green}.example-message-4>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-4>:first-child:after{font-family:'icons-blank-theme';content:'\e606';font-size:28px;line-height:28px;color:#000;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:15px;left:0;text-align:center;width:30px}.example-message-4:before{left:0}.example-message-4>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#green;left:30px}.example-message-4>:first-child:after{left:0}header.header{background-color:rgba(255,0,0,.2)}.column.main{background-color:rgba(255,255,0,.2)}.column.left{background-color:rgba(0,255,255,.2)}.column.right{background-color:rgba(0,0,255,.2)}footer.footer{background-color:rgba(0,0,0,.2)}.columns{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.columns:after{content:" ";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.columns>.column{padding-bottom:40px}@media (min-width: 600px){.page-layout-1column .column.main{ width:100%;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-3columns .column.main{width:66.66666667%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-left .column.main{width:83.33333333%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.main{width:83.33333333%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-left .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-right .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.right{width:16.66666667%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.page-layout-2columns-left .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}}.layout-example-3 .column.main{width:60%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3 .column.left{width:20%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.layout-example-3-1 .column.main{width:60%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3-1 .column.left{width:20%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3-1 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.pages>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.pages .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.pages .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.pages a.page:visited{color:#1979c3}.pages a.page:hover{color:#006bb4;text-decoration:none}.pages a.page:active{color:#ff5501}.pages strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.pages .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.pages .action:visited{color:#7d7d7d}.pages .action:hover{color:#7d7d7d;text-decoration:none}.pages .action:active{color:#7d7d7d}.pages .action.next{display:inline-block;text-decoration:none}.pages .action.next:visited:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.next:hover:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.previous{display:inline-block;text-decoration:none}.pages .action.previous:visited:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.pages .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.previous:hover:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.example-pages-1>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-1>.label:after{content:':'}.example-pages-1 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-1 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 3px;display:inline-block}.example-pages-1 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 a.page{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #b3b3b3;color:#333;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-1 a.page:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#1979c3}.example-pages-1 a.page:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);border:1px solid #999;color:#333;text-decoration:none}.example-pages-1 a.page:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#ff5501}.example-pages-1 strong.page{background:#1979c3;border:1px solid #135d96;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#f7b32e;display:inline-block;font-weight:700;padding:0 4px}.example-pages-1 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-1 .action:visited{color:#7d7d7d}.example-pages-1 .action:hover{color:#ff5501;text-decoration:none}.example-pages-1 .action:active{color:#7d7d7d}.example-pages-1 .action.next{display:inline-block;text-decoration:none}.example-pages-1 .action.next:visited:before{color:#7d7d7d}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.next:hover:before{color:#ff5501}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.previous{display:inline-block;text-decoration:none}.example-pages-1 .action.previous:visited:before{color:#7d7d7d}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-1 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.previous:hover:before{color:#ff5501}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-2>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-2>.label:after{content:':'}.example-pages-2 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-2 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-2 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-2 a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-2 a.page:visited{color:#1979c3}.example-pages-2 a.page:hover{color:#006bb4;text-decoration:none}.example-pages-2 a.page:active{color:#ff5501}.example-pages-2 strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.example-pages-2 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-2 .action:visited{color:#7d7d7d}.example-pages-2 .action:hover{color:#7d7d7d;text-decoration:none}.example-pages-2 .action:active{color:#7d7d7d}.example-pages-3>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-3 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-3 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 a.page{background:#1979c3;color:#fff;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-3 a.page:visited{background:#1979c3;color:#fff}.example-pages-3 a.page:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 a.page:active{background:#ff5501;color:#fff}.example-pages-3 strong.page{background:#1979c3;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#fff;display:inline-block;font-weight:700;padding:0 4px}.example-pages-3 .action{background:#1979c3;border:1px solid #d1d1d1;color:#fff;display:inline-block;padding:0;text-decoration:none}.example-pages-3 .action:visited{background:#1979c3;color:#7d7d7d}.example-pages-3 .action:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 .action:active{background:#ff5501;color:#fff}.example-pages-3 .action.next{display:inline-block;text-decoration:none}.example-pages-3 .action.next:visited:before{color:#7d7d7d}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.next:hover:before{color:#fff}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.previous{display:inline-block;text-decoration:none}.example-pages-3 .action.previous:visited:before{color:#7d7d7d}.example-pages-3 .action.previous:active:before{color:#fff}.example-pages-3 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.previous:hover:before{color:#fff}.example-pages-3 .action.previous:active:before{color:#fff}.window.popup.popup-example{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:focus,.window.popup.popup-example .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example .popup-actions .action.close.disabled,.window.popup.popup-example .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example.active{opacity:1}.window.popup.popup-example-1{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-1 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-1 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-1 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-1 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-1 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-1 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:focus,.window.popup.popup-example-1 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close.disabled,.window.popup.popup-example-1 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-1 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-1.active{opacity:1}.window.overlay{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#000;z-index:1000;opacity:0}.window.overlay.active{opacity:.5;filter:alpha(opacity=50)}.window.popup.popup-example-2{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;overflow-y:auto;max-height:200px;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-2 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-2 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-2 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-2 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-2 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-2 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:focus,.window.popup.popup-example-2 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close.disabled,.window.popup.popup-example-2 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-2 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-2.active{opacity:1}.window.popup.popup-example-3{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-3 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-3 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-3 .popup-content{overflow-y:auto;max-height:200px}.window.popup.popup-example-3 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-3 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-3 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-3 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:focus,.window.popup.popup-example-3 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close.disabled,.window.popup.popup-example-3 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-3 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-3.active{opacity:1}.window.popup.popup-example-4{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-4 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-4 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-4 .popup-content{margin:0 0 20px}.window.popup.popup-example-4 .popup-footer{margin:0 20px}.window.popup.popup-example-4 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-4 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-4 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-4 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:focus,.window.popup.popup-example-4 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close.disabled,.window.popup.popup-example-4 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-4 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-4.active{opacity:1}.window.popup.popup-example-5{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-5 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-5 .popup-header .title{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.window.popup.popup-example-5 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-5 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-5 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-5 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:focus,.window.popup.popup-example-5 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close.disabled,.window.popup.popup-example-5 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-5 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-5.active{opacity:1}.window.popup.popup-example-6{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-6 .popup-footer .actions.toolbar{text-align:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar:before,.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{content:"";display:table}.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{clear:both}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{float:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary a.action,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary .action{margin:0 5px 0 0}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{margin-top:6px}.window.popup.popup-example-6 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-6 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-6 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-6 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-6 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-6 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:focus,.window.popup.popup-example-6 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close.disabled,.window.popup.popup-example-6 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-6 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-6.active{opacity:1}.window.popup.popup-example-7{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-7 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-7 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-7 .popup-actions .action.close{position:absolute;top:10px;right:10px}.window.popup.popup-example-7.active{opacity:1}.window.popup.popup-example-8{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-8 .popup-header{margin:0 0 25px;padding-right:30px}.window.popup.popup-example-8 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-8 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-8 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e613';font-size:30px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:0}.window.popup.popup-example-8 .popup-actions .action.close:hover:before{color:#090}.window.popup.popup-example-8 .popup-actions .action.close:active:before{color:#00f}.window.popup.popup-example-8 .popup-actions .action.close:focus,.window.popup.popup-example-8 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close.disabled,.window.popup.popup-example-8 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-8 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-8.active{opacity:1}.window.popup.popup-example-9{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-9 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-9 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-9 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-9 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-9 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-9 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:focus,.window.popup.popup-example-9 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close.disabled,.window.popup.popup-example-9 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-9 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-9.active{opacity:1}.window.overlay.example-overlay-1.active{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#0f5293;z-index:1000;opacity:0}.window.overlay.example-overlay-1.active.active{opacity:.8;filter:alpha(opacity=80)}.example-ratings-1{overflow:hidden}.example-ratings-1:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-1 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 input[type="radio"]:focus+label:before,.example-ratings-1 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-1 label{position:absolute;display:block;cursor:pointer}.example-ratings-1 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-1 label:hover:before{opacity:1}.example-ratings-1 label:hover~label:before{opacity:0}.example-ratings-1 .rating-5{z-index:2}.example-ratings-1 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-4{z-index:3}.example-ratings-1 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-3{z-index:4}.example-ratings-1 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-1 .rating-2{z-index:5}.example-ratings-1 .rating-2:before{content:'\e605' '\e605'}.example-ratings-1 .rating-1{z-index:6}.example-ratings-1 .rating-1:before{content:'\e605'}.example-ratings-2{overflow:hidden}.example-ratings-2:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-2 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 input[type="radio"]:focus+label:before,.example-ratings-2 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-2 label{position:absolute;display:block;cursor:pointer}.example-ratings-2 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-2 label:hover:before{opacity:1}.example-ratings-2 label:hover~label:before{opacity:0}.example-ratings-2 .rating-8{z-index:2}.example-ratings-2 .rating-8:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-7{z-index:3}.example-ratings-2 .rating-7:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-6{z-index:4}.example-ratings-2 .rating-6:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-5{z-index:5}.example-ratings-2 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-4{z-index:6}.example-ratings-2 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-3{z-index:7}.example-ratings-2 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-2 .rating-2{z-index:8}.example-ratings-2 .rating-2:before{content:'\e605' '\e605'}.example-ratings-2 .rating-1{z-index:9}.example-ratings-2 .rating-1:before{content:'\e605'}.example-ratings-3{overflow:hidden}.example-ratings-3:before{color:#aff5e3;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-3 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 input[type="radio"]:focus+label:before,.example-ratings-3 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-3 label{position:absolute;display:block;cursor:pointer}.example-ratings-3 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 label:before{color:#0a6767;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-3 label:hover:before{opacity:1}.example-ratings-3 label:hover~label:before{opacity:0}.example-ratings-3 .rating-5{z-index:2}.example-ratings-3 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-4{z-index:3}.example-ratings-3 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-3{z-index:4}.example-ratings-3 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-3 .rating-2{z-index:5}.example-ratings-3 .rating-2:before{content:'\e605' '\e605'}.example-ratings-3 .rating-1{z-index:6}.example-ratings-3 .rating-1:before{content:'\e605'}.example-ratings-4{overflow:hidden}.example-ratings-4:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e600' '\e600' '\e600' '\e600' '\e600';position:absolute;z-index:1;display:block}.example-ratings-4 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 input[type="radio"]:focus+label:before,.example-ratings-4 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-4 label{position:absolute;display:block;cursor:pointer}.example-ratings-4 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-4 label:hover:before{opacity:1}.example-ratings-4 label:hover~label:before{opacity:0}.example-ratings-4 .rating-5{z-index:2}.example-ratings-4 .rating-5:before{content:'\e600' '\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-4{z-index:3}.example-ratings-4 .rating-4:before{content:'\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-3{z-index:4}.example-ratings-4 .rating-3:before{content:'\e600' '\e600' '\e600'}.example-ratings-4 .rating-2{z-index:5}.example-ratings-4 .rating-2:before{content:'\e600' '\e600'}.example-ratings-4 .rating-1{z-index:6}.example-ratings-4 .rating-1:before{content:'\e600'}.exapmle-ratings-5 .control.rating.vote{overflow:hidden}.exapmle-ratings-5 .control.rating.vote:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.exapmle-ratings-5 .control.rating.vote input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote input[type="radio"]:focus+label:before,.exapmle-ratings-5 .control.rating.vote input[type="radio"]:checked+label:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label{position:absolute;display:block;cursor:pointer}.exapmle-ratings-5 .control.rating.vote label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.exapmle-ratings-5 .control.rating.vote label:hover:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label:hover~label:before{opacity:0}.exapmle-ratings-5 .control.rating.vote .rating-5{z-index:2}.exapmle-ratings-5 .control.rating.vote .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-4{z-index:3}.exapmle-ratings-5 .control.rating.vote .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-3{z-index:4}.exapmle-ratings-5 .control.rating.vote .rating-3:before{content:'\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-2{z-index:5}.exapmle-ratings-5 .control.rating.vote .rating-2:before{content:'\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-1{z-index:6}.exapmle-ratings-5 .control.rating.vote .rating-1:before{content:'\e605'}.example-rating-summary-1{white-space:nowrap;overflow:hidden}.example-rating-summary-1 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-1 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-1 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-2{white-space:nowrap;overflow:hidden}.example-rating-summary-2 .rating-result{width:154px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-2 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-2 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-3{white-space:nowrap;overflow:hidden}.example-rating-summary-3 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-3 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#aff5e3;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-3 .rating-result>span:before{position:relative;z-index:2;color:#0a6767;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-4{white-space:nowrap;overflow:hidden}.example-rating-summary-4 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-4 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-4 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5{white-space:nowrap;overflow:hidden}.example-rating-summary-5 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-5 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-5 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-6 .rating-summary{white-space:nowrap;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-6 .rating-summary .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span{display:block;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7{white-space:nowrap;overflow:hidden}.example-rating-summary-7 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-7 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-7 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-responsive-block{padding:10px}.example-sections-1{position:relative;z-index:1}.example-sections-1:before,.example-sections-1:after{content:"";display:table}.example-sections-1:after{clear:both}.example-sections-1>.item.title{float:left;width:auto}.example-sections-1>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-1>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-1>.item.content:before,.example-sections-1>.item.content:after{content:"";display:table}.example-sections-1>.item.content:after{clear:both}.example-sections-1>.item.content.active{display:block}.example-sections-1>.item.title{margin:0 5px 0 0}.example-sections-1>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-1>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-1>.item.title:not(.disabled)>.switch:focus,.example-sections-1>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-1>.item.title:not(.disabled)>.switch:active,.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-1>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}.example-sections-2{position:relative;z-index:1}.example-sections-2:before,.example-sections-2:after{content:"";display:table}.example-sections-2:after{clear:both}.example-sections-2>.item.title{float:left;width:auto}.example-sections-2>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-2>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-2>.item.content:before,.example-sections-2>.item.content:after{content:"";display:table}.example-sections-2>.item.content:after{clear:both}.example-sections-2>.item.content.active{display:block}.example-sections-2>.item.title{margin:0 5px 0 0}.example-sections-2>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-2>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-2>.item.title:not(.disabled)>.switch:focus,.example-sections-2>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-2>.item.title:not(.disabled)>.switch:active,.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-2>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:0;border-top:1px solid #d1d1d1}.example-sections-3{margin:0;padding:0}.example-sections-3>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-3>.item.title>.switch{display:block}.example-sections-3>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-3>.item.content:before,.example-sections-3>.item.content:after{content:"";display:table}.example-sections-3>.item.content:after{clear:both}.example-sections-3>.item.content.active{display:block}.example-sections-3>.item.title{margin:0 0 5px}.example-sections-3>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-3>.item.title:not(.disabled)>.switch:focus,.example-sections-3>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-3>.item.title:not(.disabled)>.switch:active,.example-sections-3>.item.title.active>.switch,.example-sections-3>.item.title.active>.switch:focus,.example-sections-3>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-3>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}@media only screen and (max-width: 99999px){.example-sections-4{ position:relative;z-index:1}.example-sections-4:before,.example-sections-4:after{content:"";display:table}.example-sections-4:after{clear:both}.example-sections-4>.item.title{float:left;width:auto}.example-sections-4>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-4>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 5px 0 0}.example-sections-4>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-4>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}}@media only screen and (max-width: 768px){.example-sections-4{ margin:0;padding:0}.example-sections-4>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-4>.item.title>.switch{display:block}.example-sections-4>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 0 5px}.example-sections-4>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-4>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}}.example-sections-5{position:relative;z-index:1}.example-sections-5:before,.example-sections-5:after{content:"";display:table}.example-sections-5:after{clear:both}.example-sections-5>.item.title{float:left;width:auto}.example-sections-5>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-5>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-5>.item.content:before,.example-sections-5>.item.content:after{content:"";display:table}.example-sections-5>.item.content:after{clear:both}.example-sections-5>.item.content.active{display:block}.example-sections-6{margin:0;padding:0}.example-sections-6>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-6>.item.title>.switch{display:block}.example-sections-6>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-6>.item.content:before,.example-sections-6>.item.content:after{content:"";display:table}.example-sections-6>.item.content:after{clear:both}.example-sections-6>.item.content.active{display:block}.example-table-1{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-1 th{text-align:left}.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{vertical-align:top}.example-table-1>thead>tr>th,.example-table-1>thead>tr>td{vertical-align:bottom}.example-table-1>thead>tr>th,.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>thead>tr>td,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{padding:8px 10px}.example-table-2>thead>tr>th,.example-table-2>tbody>tr>th,.example-table-2>tfoot>tr>th{color:#111;font-weight:700}.example-table-3{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-3 th{text-align:left}.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{vertical-align:top}.example-table-3>thead>tr>th,.example-table-3>thead>tr>td{vertical-align:bottom}.example-table-3>thead>tr>th,.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>thead>tr>td,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{padding:8px 10px}.example-table-3>caption{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-table-4{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-4 th{text-align:left}.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{vertical-align:top}.example-table-4>thead>tr>th,.example-table-4>thead>tr>td{vertical-align:bottom}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:8px 10px}.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:15px 25px 5px 0}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th{padding:15px 25px 10px 0}.example-table-5{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;background:#fff}.example-table-5 th{text-align:left}.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{vertical-align:top}.example-table-5>thead>tr>th,.example-table-5>thead>tr>td{vertical-align:bottom}.example-table-5>thead>tr>th,.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>thead>tr>td,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{padding:8px 10px}.example-table-5>thead{background:#ccf}.example-table-5>tfoot{background:#cff}.example-table-5>tbody>tr>td{background:#fcc}.example-table-5>tbody>tr>th{background:#ffc}.example-table-6{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-6 th{text-align:left}.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{vertical-align:top}.example-table-6>thead>tr>th,.example-table-6>thead>tr>td{vertical-align:bottom}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{padding:8px 10px}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-7{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-7 th{text-align:left}.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{vertical-align:top}.example-table-7>thead>tr>th,.example-table-7>thead>tr>td{vertical-align:bottom}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{padding:8px 10px}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{border-top:1px solid #d1d1d1}.example-table-7>caption+thead>tr:first-child>th,.example-table-7>colgroup+thead>tr:first-child>th,.example-table-7>thead:first-child>tr:first-child>th,.example-table-7>caption+thead>tr:first-child>td,.example-table-7>colgroup+thead>tr:first-child>td,.example-table-7>thead:first-child>tr:first-child>td{border-top:0}.example-table-7>tbody+tbody{border-top:1px solid #d1d1d1}.example-table-8{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-8 th{text-align:left}.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{vertical-align:top}.example-table-8>thead>tr>th,.example-table-8>thead>tr>td{vertical-align:bottom}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{padding:8px 10px}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{border-left:1px solid #d1d1d1}.example-table-8>thead>tr>th:first-child,.example-table-8>tbody>tr>th:first-child,.example-table-8>tfoot>tr>th:first-child,.example-table-8>thead>tr>td:first-child,.example-table-8>tbody>tr>td:first-child,.example-table-8>tfoot>tr>td:first-child{border-left:0}.example-table-9{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-9 th{text-align:left}.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{vertical-align:top}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{vertical-align:bottom}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{padding:8px 10px}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{border:0}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{border-bottom:1px solid #d1d1d1}.example-table-10{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-10 th{text-align:left}.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{vertical-align:top}.example-table-10>thead>tr>th,.example-table-10>thead>tr>td{vertical-align:bottom}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{padding:8px 10px}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{border:0}.example-table-11{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-11 th{text-align:left}.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{vertical-align:top}.example-table-11>thead>tr>th,.example-table-11>thead>tr>td{vertical-align:bottom}.example-table-11>thead>tr>th,.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>thead>tr>td,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{padding:8px 10px}.example-table-11>tbody>tr:nth-child(even)>td,.example-table-11>tbody>tr:nth-child(even)>th{background:#ffc;color:#000}.example-table-12{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-12 th{text-align:left}.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{vertical-align:top}.example-table-12>thead>tr>th,.example-table-12>thead>tr>td{vertical-align:bottom}.example-table-12>thead>tr>th,.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>thead>tr>td,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{padding:8px 10px}.example-table-12>tbody>tr:nth-child(even):hover>td,.example-table-12>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-12>tbody>tr:nth-child(odd):hover>td,.example-table-12>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}.example-table-13{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-13 th{text-align:left}.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{vertical-align:top}.example-table-13>thead>tr>th,.example-table-13>thead>tr>td{vertical-align:bottom}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{padding:8px 10px}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-13>tbody>tr:nth-child(odd)>td,.example-table-13>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-13>tbody>tr:nth-child(even):hover>td,.example-table-13>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-13>tbody>tr:nth-child(odd):hover>td,.example-table-13>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-14{ width:100%;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}}.example-table-15{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-15 th{text-align:left}.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{vertical-align:top}.example-table-15>thead>tr>th,.example-table-15>thead>tr>td{vertical-align:bottom}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{padding:8px 10px}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-15{ border:0;display:block;background:#cff}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#cff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#cff}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#cff}.example-table-15>thead>tr>th{display:none}.example-table-15>tbody{display:block}.example-table-15>tbody>tr{display:block}.example-table-15>tbody>tr td,.example-table-15>tbody>tr th{border-bottom:0;display:block;padding:5px 0}.example-table-15>tbody>tr td:before,.example-table-15>tbody>tr th:before{content:attr(data-th) ":";display:inline-block;padding-right:10px;color:#111;font-weight:700}.example-table-15>tbody>tr td{background:#cff}.example-table-15>tbody>tr>th{background-color:#ffc!important}}.example-tooltip-bottom{position:relative}.example-tooltip-bottom .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;top:100%;left:0;margin-top:5px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-bottom .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-bottom .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{bottom:100%}.example-tooltip-bottom .tooltip-content:after{border-bottom-color:#fff;margin-left:-5px;left:15px}.example-tooltip-bottom .tooltip-content:before{border-bottom-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-bottom .tooltip-toggle{cursor:help}.example-tooltip-bottom .tooltip-toggle:hover+.tooltip-content,.example-tooltip-bottom .tooltip-toggle:focus+.tooltip-content,.example-tooltip-bottom:hover .tooltip-content{display:block}.example-tooltip-left{position:relative}.example-tooltip-left .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;right:100%;top:0;margin-right:5px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-left .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-left .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{left:100%}.example-tooltip-left .tooltip-content:after{border-left-color:#fff;margin-top:-5px;top:15px}.example-tooltip-left .tooltip-content:before{border-left-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-left .tooltip-toggle{cursor:help}.example-tooltip-left .tooltip-toggle:hover+.tooltip-content,.example-tooltip-left .tooltip-toggle:focus+.tooltip-content,.example-tooltip-left:hover .tooltip-content{display:block}.example-tooltip-right{position:relative}.example-tooltip-right .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;left:100%;top:0;margin-left:5px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-right .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-right .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{right:100%}.example-tooltip-right .tooltip-content:after{border-right-color:#fff;margin-top:-5px;top:15px}.example-tooltip-right .tooltip-content:before{border-right-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-right .tooltip-toggle{cursor:help}.example-tooltip-right .tooltip-toggle:hover+.tooltip-content,.example-tooltip-right .tooltip-toggle:focus+.tooltip-content,.example-tooltip-right:hover .tooltip-content{display:block}.example-tooltip-top{position:relative}.example-tooltip-top .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;bottom:100%;left:0;margin-bottom:5px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-top .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-top .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{top:100%}.example-tooltip-top .tooltip-content:after{border-top-color:#fff;margin-left:-5px;left:15px}.example-tooltip-top .tooltip-content:before{border-top-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-top .tooltip-toggle{cursor:help}.example-tooltip-top .tooltip-toggle:hover+.tooltip-content,.example-tooltip-top .tooltip-toggle:focus+.tooltip-content,.example-tooltip-top:hover .tooltip-content{display:block}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{font-size:71.42857143%;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-break:break-all;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-line-height{line-height:3rem}.example-word-wrap{word-break:break-all;word-break:break-word;word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;background:#ccc;width:120px}.example-text-overflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:#ccc;width:120px}.example-text-hide{background-color:transparent;border:0;font:0/0 a;color:transparent;text-shadow:none}.example-hyphens{word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.example-hyphens-none{word-wrap:break-word;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.example-typography{color:#fc0;font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-weight:500;font-style:italic;line-height:1.2}.example-list-reset-styles{margin:0;padding:0;list-style:none none}.example-list-inline{margin:0;padding:0;list-style:none none}.example-list-inline>li{display:inline-block;vertical-align:top}.example-link-default{color:#1979c3;text-decoration:none}.example-link-default:visited{color:#1979c3;text-decoration:none}.example-link-default:hover{color:#006bb4;text-decoration:underline}.example-link-default:active{color:#ff5501;text-decoration:underline}.example-link{color:#008000;text-decoration:none}.example-link:visited{color:#1979c3;text-decoration:none}.example-link:hover{color:#ffa500;text-decoration:none}.example-link:active{color:#ff5501;text-decoration:underline}.example-heading{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.example-heading-2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{font-size:71.42857143%;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-break:break-all;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-clearfix-container-1{border:1px solid red}.example-clearfix-container-2{border:1px solid #0f0}.example-clearfix-container-2:before,.example-clearfix-container-2:after{content:"";display:table}.example-clearfix-container-2:after{clear:both}.example-clearfix-item.left{float:left}.example-clearfix-item.right{float:right}.example-visibility-hidden{height:0;visibility:hidden}.example-visually-hidden-1{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{background:#fdf0d5;padding:5px;border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.example-css-container{padding:20px;background:#e8e8e8}.example-rotate{background:red;position:absolute;height:20px;width:40px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.example-placeholder::-webkit-input-placeholder{color:#808080;font-weight:700}.example-placeholder:-moz-placeholder{color:#808080;font-weight:700}.example-placeholder::-moz-placeholder{color:#808080;font-weight:700}.example-placeholder:-ms-input-placeholder{color:#808080;font-weight:700}.example-background-gradient-1{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #cff 0, #ccf 100%);background-image:linear-gradient(to bottom, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=0)}.example-background-gradient-2{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop( #cff 0),color-stop( #ccf 100%));background-image:linear-gradient(to right, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=1)}.example-background-gradient-3-wrapper{background:#ffc;padding:10px}.example-background-gradient-3{background-color:rgba(255,255,255,0);background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(rgba(255,255,255,0) 0),color-stop( #ccf 100%));background-image:linear-gradient(to right,rgba(255,255,255,0) 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='rgba(255, 255, 255, 0)',endColorstr='#ccccff',GradientType=1)}body{padding:15px;background-image:none}</style></head><body><nav class="bar top cf"><div class="container"><a href="index.html" class="brand">Magento UI Library</a><ul class="menu"><li><a href="#" data-toggle="dropdown-1" unselectable="on" class="dropdown-toggle">files</a><ul id="dropdown-1" hidden class="dropdown"><li><a href="actions-toolbar.html">actions-toolbar</a></li><li><a href="breadcrumbs.html">breadcrumbs</a></li><li><a href="buttons.html">buttons</a></li><li><a href="docs.html">docs</a></li><li><a href="dropdowns.html">dropdowns</a></li><li><a href="forms.html">forms</a></li><li><a href="icons.html">icons</a></li><li><a href="layout.html">layout</a></li><li><a href="lib.html">lib</a></li><li><a href="loaders.html">loaders</a></li><li><a href="messages.html">messages</a></li><li><a href="pages.html">pages</a></li><li><a href="popups.html">popups</a></li><li><a href="rating.html">rating</a></li><li><a href="resets.html">resets</a></li><li><a href="responsive.html">responsive</a></li><li><a href="sections.html">sections</a></li><li><a href="tables.html">tables</a></li><li><a href="tooltips.html">tooltips</a></li><li><a href="typography.html">typography</a></li><li><a href="utilities.html">utilities</a></li><li><a href="variables.html">variables</a></li></ul></li></ul><div class="nav"><button title="Table of Contents" data-toggle="nav-toc"><svg viewBox="0 0 512 512" height="22" width="22" class="icon"><path d="M108.9,403.1V462H50v-58.9H108.9z M108.9,285.4H50v58.9h58.9V285.4zM108.9,50H50v58.9h58.9V50z M108.9,167.7H50v58.9h58.9V167.7z M167.7,344.3H462v-58.9H167.7V344.3zM167.7,50v58.9H462V50H167.7z M167.7,462H462v-58.9H167.7V462z M167.7,226.6H462v-58.9H167.7V226.6z"></path></svg></button><input type="search" placeholder="Search" class="search"></div></div></nav><section class="container"><article id="forms-mixins" class="section"><div class="docs"><a href="#forms-mixins" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="forms-mixins">Forms mixins</h1> <p> Magento UI library provides a set of mixins for forms elements customization. You can customize your forms globally by configuring global variables, or you can customize every form separately using appropriate mixin.</p> @@ -19,7 +19,7 @@ <h2 id="simple-form-with-required-fields-message">Simple form with "required fields" message</h2> <textarea class="preview-code" spellcheck="false"> <form class="example-form-1"> <fieldset class="example-form-1-fieldset" data-hasrequired="* Required Fields"> - <legend class="legend"><span>Login Information</span></legend><br> + <legend class="legend"><span>Sign-in Information</span></legend><br> <div class="field password required"> <label for="password" class="label"><span>Password</span></label> @@ -195,29 +195,30 @@ </div> </fieldset> </form></textarea> -</div><div class="code"><pre><code> -.example-form-1 { - .example-form-1-fieldset { - .form-fieldset(); - .form-hasrequired(bottom); - > .field { - .form-field(); - } - } -} - -.example-form-2 { - .example-form-2-fieldset { - .form-fieldset(); - > .field { - .form-field( - @_type: block, - @_column: true - ); - } - } -} - </code></pre></div></article><article id="fieldset-and-legend-customization-variables" class="section"><div class="docs"><a href="#fieldset-and-legend-customization-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="fieldset-and-legend-customization-variables">Fieldset and legend customization variables</h1> +</div><div class="code"><pre><code> +.example-form-1 { + .example-form-1-fieldset { + .form-fieldset(); + .form-hasrequired(bottom); + > .field { + .form-field(); + } + } +} + +.example-form-2 { + .example-form-2-fieldset { + .form-fieldset(); + > .field { + .form-field( + @_type: block, + @_column: true + ); + } + } +} + +</code></pre></div></article><article id="fieldset-and-legend-customization-variables" class="section"><div class="docs"><a href="#fieldset-and-legend-customization-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="fieldset-and-legend-customization-variables">Fieldset and legend customization variables</h1> <p> The <code>.form-fieldset()</code> mixin variables <pre> <table> @@ -677,35 +678,36 @@ <select><option>type = select</option><option>option</option></select> <select multiple="multiple"><option>type = select multiple</option><option>option</option></select> <textarea placeholder="placeholder, type = textarea" ></textarea></textarea> -</div><div class="code"><pre><code> - -input[type="text"], -input[type="password"], -input[type="url"], -input[type="tel"], -input[type="search"], -input[type="number"], -input[type="datetime"], -input[type="email"] { - .form-element-input(@_type: input-text); - margin-bottom: 20px; -} - -select { - .form-element-input(@_type: select); - margin-bottom: 20px; -} - -select[multiple="multiple"] { - .css(height, auto); - margin-bottom: 20px; -} - -textarea { - .form-element-input(@_type: textarea); - .form-element-textarea-resize(); -} - </code></pre></div></article><article id="form-element-inputs-customization-variables" class="section"><div class="docs"><a href="#form-element-inputs-customization-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="form-element-inputs-customization-variables">Form element inputs customization variables</h1> +</div><div class="code"><pre><code> + +input[type="text"], +input[type="password"], +input[type="url"], +input[type="tel"], +input[type="search"], +input[type="number"], +input[type="datetime"], +input[type="email"] { + .form-element-input(@_type: input-text); + margin-bottom: 20px; +} + +select { + .form-element-input(@_type: select); + margin-bottom: 20px; +} + +select[multiple="multiple"] { + .css(height, auto); + margin-bottom: 20px; +} + +textarea { + .form-element-input(@_type: textarea); + .form-element-textarea-resize(); +} + +</code></pre></div></article><article id="form-element-inputs-customization-variables" class="section"><div class="docs"><a href="#form-element-inputs-customization-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="form-element-inputs-customization-variables">Form element inputs customization variables</h1> <pre> <table> <tr> @@ -890,19 +892,21 @@ textarea { </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="form-element-choice" class="section"><div class="docs"><a href="#form-element-choice" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="form-element-choice">Form element choice</h1> +</div><div class="code"><pre><code> +</code></pre></div></article><article id="form-element-choice" class="section"><div class="docs"><a href="#form-element-choice" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="form-element-choice">Form element choice</h1> <p> The <code>.form-element-choise()</code> mixin is used to customize checkboxes and radio buttons.</p> <textarea class="preview-code" spellcheck="false"> <input type="checkbox" name="checkbox-example" /><label for="checkbox-example">Label for checkbox</label><br /> <input type="radio" name="radio-example" /><label for="radio-example">Label for radio button</label></textarea> -</div><div class="code"><pre><code> -input[type="checkbox"] { - .form-element-choice(@_type: input-checkbox); -} - -input[type="radio"] { - .form-element-choice(@_type: input-radio); -} - </code></pre></div></article><article id="form-element-choice-variables" class="section"><div class="docs"><a href="#form-element-choice-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="form-element-choice-variables">Form element choice variables</h1> +</div><div class="code"><pre><code> +input[type="checkbox"] { + .form-element-choice(@_type: input-checkbox); +} + +input[type="radio"] { + .form-element-choice(@_type: input-radio); +} + +</code></pre></div></article><article id="form-element-choice-variables" class="section"><div class="docs"><a href="#form-element-choice-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="form-element-choice-variables">Form element choice variables</h1> <pre> <table> <tr> @@ -937,7 +941,8 @@ input[type="radio"] { </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="custom-color" class="section"><div class="docs"><a href="#custom-color" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="custom-color">Custom color</h1> +</div><div class="code"><pre><code> +</code></pre></div></article><article id="custom-color" class="section"><div class="docs"><a href="#custom-color" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="custom-color">Custom color</h1> <p> The <code>.form-element-color()</code> mixin is used to set form elements background and color.</p> <pre><code class="lang-css"> @_border-color: '' @_background: '' @@ -953,37 +958,40 @@ input[type="radio"] { <input type="text" class="text text-example-1" placeholder="placeholder, type = text, disabled" disabled="disabled" /><br /><br /> <select class="select-example-1"><option>type = select</option><option>option</option></select><br /><br /> <textarea class="textarea-example-1" placeholder="placeholder, type = textarea"></textarea></textarea> -</div><div class="code"><pre><code> -input.text-example-1, -select.select-example-1, -textarea.textarea-example-1 { - .form-element-color( - @_background: #fdf0d5, - @_border-color: #fc0, - @_color: #b30000, - @_focus-color: #060, - @_focus-border-color: #cff, - @_disabled-color: #fcc - ); -} - -input.text-example-1, -textarea.textarea-example-1 { - .form-element-color( - @_placeholder-color: #ccc - ); -} - </code></pre></div></article><article id="input-number-inputtext-view" class="section"><div class="docs"><a href="#input-number-inputtext-view" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="input-number-inputtext-view">Input number - input-text view</h1> +</div><div class="code"><pre><code> +input.text-example-1, +select.select-example-1, +textarea.textarea-example-1 { + .form-element-color( + @_background: #fdf0d5, + @_border-color: #fc0, + @_color: #b30000, + @_focus-color: #060, + @_focus-border-color: #cff, + @_disabled-color: #fcc + ); +} + +input.text-example-1, +textarea.textarea-example-1 { + .form-element-color( + @_placeholder-color: #ccc + ); +} + +</code></pre></div></article><article id="input-number-inputtext-view" class="section"><div class="docs"><a href="#input-number-inputtext-view" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="input-number-inputtext-view">Input number - input-text view</h1> <textarea class="preview-code" spellcheck="false"> <input type="number" class="number number-example" placeholder="placeholder, type = number " /></textarea> -</div><div class="code"><pre><code>.number-example { - .form-element-number-reset(); -} - </code></pre></div></article><article id="input-search-inputtext-view" class="section"><div class="docs"><a href="#input-search-inputtext-view" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="input-search-inputtext-view">Input search - input-text view</h1> +</div><div class="code"><pre><code>.number-example { + .form-element-number-reset(); +} + +</code></pre></div></article><article id="input-search-inputtext-view" class="section"><div class="docs"><a href="#input-search-inputtext-view" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="input-search-inputtext-view">Input search - input-text view</h1> <textarea class="preview-code" spellcheck="false"> <input type="search" class="search search-example" placeholder="placeholder, type = search " /></textarea> -</div><div class="code"><pre><code>.search-example { - .form-element-search-reset(); -} - </code></pre></div></article><article id="form-validation" class="section"><div class="docs"><a href="#form-validation" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="form-validation">Form validation</h1> +</div><div class="code"><pre><code>.search-example { + .form-element-search-reset(); +} + +</code></pre></div></article><article id="form-validation" class="section"><div class="docs"><a href="#form-validation" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="form-validation">Form validation</h1> <p> The <code>.form-validation-note()</code> mixin is used to customize form validation error messages.</p> <textarea class="preview-code" spellcheck="false"> <input type="text" class="textarea-example-4 mage-error" placeholder="placeholder, type = text" /> <div class="mage-error">This is a required field.</div> @@ -1009,12 +1017,13 @@ textarea.textarea-example-1 { <br /><br /> <input type="radio" name="radio-example-1" class="radio-example-2 mage-error" /> <div class="mage-error">This is a required field.</div></textarea> -</div><div class="code"><pre><code>input, -textarea, -select { - .form-validation-note(); -} - </code></pre></div></article><article id="form-validation-variables-pre" class="section"><div class="docs"><a href="#form-validation-variables-pre" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="form-validation-variables-pre">Form validation variables// <pre></h1> +</div><div class="code"><pre><code>input, +textarea, +select { + .form-validation-note(); +} + +</code></pre></div></article><article id="form-validation-variables-pre" class="section"><div class="docs"><a href="#form-validation-variables-pre" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="form-validation-variables-pre">Form validation variables// <pre></h1> <textarea class="preview-code" spellcheck="false"><table> <tr> <th class="vars_head">Mixin variable</th> diff --git a/lib/web/css/docs/icons.html b/lib/web/css/docs/icons.html index c20166dc31e9f29cd1ba8e5d4a9c434d1c5ff13d..7058b1369e74c6a133659d934dbb7ea2b9c0b96c 100644 --- a/lib/web/css/docs/icons.html +++ b/lib/web/css/docs/icons.html @@ -1,12 +1,12 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> - +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> + <!DOCTYPE html><html><head><title>icons | Magento UI Library -</title><meta charset="utf-8"><style>*{-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;border:0}body{padding:60px 0 40px;background-color:hsl(207,10%,90%);color:hsl(207,5%,30%)}.container{max-width:1300px;margin:0 auto;padding:0 20px}.section{position:relative;margin-bottom:20px}.docs{position:relative;z-index:2;width:68%;min-height:200px;background-color:hsl(207,0%,100%);background-clip:padding-box;border:1px solid hsla(207,5%,5%,.1);border-radius:5px;box-shadow:0 0 3px hsla(207,5%,5%,.1)}.code{position:absolute;top:5px;bottom:5px;right:0;z-index:1;width:33%;padding:10px 10px 10px 20px;border-radius:0 5px 5px 0;border:1px solid hsla(207,20%,10%,.1);background-color:hsla(207,20%,95%,.9);background-clip:padding-box;opacity:.5;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.code:hover{opacity:1}.preview{background:hsl(207,0%,100%);border-top:1px solid hsl(207,30%,95%);position:relative;z-index:1}.preview-code+.preview{margin-top:0;border-top:0}.preview iframe{display:block;width:100%;height:100%;overflow:hidden}.preview-code{position:relative;z-index:2;display:block;width:100%;color:hsl(207,9%,37%);max-height:200px;padding:10px 20px;overflow-y:auto;background:hsl(207,30%,95%);border:1px solid hsl(207,30%,85%);border-left:0;border-right;box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1);line-height:1.1!important;resize:none}.preview-code:focus{outline:0;background:hsl(207,30%,97%);box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1),0 0 5px hsla(207,75%,75%,.9)}.preview-code:last-child{border-bottom:0;border-radius:0 0 5px 5px}.resizeable{padding:15px;overflow:auto;background:hsl(207,0%,100%);box-shadow:0 0 2px hsla(207,10%,20%,.2);resize:both}.preview-code,pre{white-space:pre-wrap;word-wrap:break-word;overflow-y:auto}.code pre{height:100%;margin-top:0}.bar{position:fixed;left:0;right:0;z-index:1010;min-height:40px;line-height:40px;background-image:-webkit-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-moz-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-o-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92))}.bar.top{top:0;box-shadow:0 1px 2px hsla(207,5%,0%,.2)}.bar.bottom{bottom:0;box-shadow:0 -1px 2px hsla(207,5%,0%,.2)}.bar ul{margin:0!important}.bar li{display:block;list-style:none}.bar .icon path{fill:hsla(27,10%,75%,.75)}.docs .icon path{fill:hsla(207,10%,75%,.5)}.docs .permalink:hover .icon path{fill:hsl(207,10%,75%)}.bar button{color:hsla(27,10%,75%,.75)}.bar button:hover .icon path,.bar button.is-active .icon path{fill:hsl(27,10%,85%)}.bar button:hover,.bar button.is-active{color:hsl(27,10%,85%)}.bar .icon{vertical-align:middle;display:inline-block}.bar,.bar a,.bar a:visited{color:hsl(27,10%,85%);text-shadow:1px 1px 0 hsla(27,5%,0%,.5)}.bar a:hover,.bar a.is-active{color:hsl(27,10%,95%);text-shadow:1px 1px 0 hsla(27,5%,0%,1);text-decoration:none}.brand{float:left;margin-right:20px;font-weight:700;font-size:16px;text-decoration:none}.brand,a.brand,a.brand:visited{color:hsl(27,5%,5%);text-shadow:1px 1px 0 hsla(27,5%,100%,.2)}.brand:hover,a.brand:hover{color:hsl(27,5%,0%);text-shadow:1px 1px 0 hsla(27,5%,100%,.3);text-decoration:none}.menu{font-size:12px}.menu>li{float:left;position:relative}.menu a{display:block;margin-right:15px}.dropdown-toggle{position:relative;padding-right:15px}.dropdown-toggle:after{display:block;position:absolute;right:0;top:18px;content:'';border:4px solid;border-left-color:transparent;border-right-color:transparent;border-bottom-color:transparent}.nav-results,.dropdown{position:absolute;z-index:1020;top:32px;left:-16px;width:175px;max-height:500px;padding:10px 0;overflow-y:auto;word-wrap:break-word;font-size:11px;line-height:20px;background-color:hsla(207,10%,25%,.97);border:1px solid hsla(207,5%,70%,.3);border-radius:3px;box-shadow:0 0 3px hsla(207,5%,0%,.2)}.toc-list{width:200px}.nav-results{right:0;width:200px;left:auto;padding:5px 0}.nav-results-filename{display:block;font-size:10px;opacity:.75}.nav-results a{display:block;line-height:15px;padding:5px 10px}.nav-results li:not([hidden])~li a{border-top:1px solid hsla(27,10%,90%,.1)}.dropdown a{padding:0 15px}.dropdown li:hover{background-color:hsl(207,10%,22%)}.nav{float:right;position:relative}.nav input[type="search"]{padding:2px 4px;color:#fff;width:150px;border:1px solid hsla(207,5%,0%,.3);background:hsla(207,12%,40%,.9);box-shadow:inset 1px 1px 3px hsla(207,5%,0%,.05),1px 1px 0 hsla(207,5%,100%,.05);border-radius:10px;-webkit-appearance:textfield}.nav input[type="search"]:focus{outline:0;background:hsla(207,7%,45%,.9)}.settings{text-align:center}.bar button{display:inline-block;vertical-align:middle;padding:0 5px;margin:0 3px;background:transparent}.bar button:first-child{margin-left:0}.settings .auto{line-height:32px;font-size:11px;font-weight:700;letter-spacing:-1px;text-shadow:none;text-transform:uppercase}body{font-family:sans-serif;font-size:14px;line-height:1.618}.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-left:20px;margin-right:20px}.preview,.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-top:10px}ul ul,ol ol,ul ol,ol ul,blockquote p:last-child{margin-top:0}ul,ol{padding-left:1.5em}p:last-child,ol:last-child,ul:last-child,dl:last-child{margin-bottom:20px}hr,h1,h2,h3,h4,h5,h6{margin:1em 20px .5em}h1:first-of-type{margin-top:20px}h1,h2,h3,h4,h5,h6{line-height:1.2;color:hsl(207,10%,50%)}h1 a,h1 a:hover,h1 a:visited{color:inherit;text-decoration:inherit}h1{font-size:3.052em;font-weight:400;color:hsl(207,10%,45%)}h2{font-size:1.953em}h3{font-size:1.536em}h1,h2,h3{letter-spacing:-.025em}h4{font-size:1.25em}h5{font-size:1em;text-transform:uppercase}h6{font-size:1em}.permalink{position:absolute;top:15px;right:15px}a{color:hsl(207,90%,50%);text-decoration:none}a:hover{color:hsl(207,95%,40%);text-decoration:underline}a:visited{color:hsl(207,100%,35%)}.preview-code,pre,code,var{font-style:normal;font-family:"Ubuntu Mono","Andale Mono","DejaVu Sans Mono","Monaco","Bitstream Vera Sans Mono","Consolas","Lucida Console",monospace;font-size:12px}.docs pre,code,var{padding:.1em 3px;background:hsla(207,5%,0%,.025);border:1px solid hsla(207,5%,0%,.05);border-radius:3px}.code pre{line-height:1.1!important}pre code{padding:0;background:transparent;border:0}.cf:before,.cf:after{content:'';display:table}.cf:after{clear:both}[unselectable="on"]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[hidden]{display:none!important}small{font-size:85%;opacity:.9}.docs .vars_list{width:100%}.docs .vars_list th,.docs .vars_list td{width:33%}.docs pre th{text-align:left}.docs pre table{border-collapse:collapse;margin:0}.docs th,.docs td{border:0;padding:9px 10px 9px 0;vertical-align:top}.docs tr th:last-child,.docs tr td:last-child{padding-right:0}.docs pre th{font-weight:400}.docs pre th.vars_head{border-bottom:1px solid #e5e5e5;color:#707070;white-space:nowrap}.docs pre th.vars_section{border-bottom:1px solid #e5e5e5;color:#333;font-size:18px;padding-top:30px}.vars_value{color:#338bb8}.docs li p{margin:0 0 20px}.dropdown a{text-transform:capitalize}#default-button #default-button-big+.preview+.preview-code{display:block}#actions-toolbar-alignment .preview-code,#reverse-primary-and-secondary-blocks .preview-code,#actions-toolbar-indents-customizations .preview-code,#actionstoolbarclearfloats-mixin .preview-code,#responsive-actions-toolbar .preview-code,#button-with-gradient-background .preview-code,#primary-button .preview-code,#button-as-an-icon .preview-code,#button-with-an-icon-on-the-left-or-right-side-of-the-text .preview-code,#button-with-fixed-width .preview-code,#button-as-a-link .preview-code,#link-as-a-button .preview-code,#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol .preview-code,#breadcrumbs-with-solid-background .preview-code,#pagination-without-label-with-solid-background .preview-code,#pagination-with-label-and-text-previousnext-links .preview-code,#pagination-with-label-and-gradient-background-on-links .preview-code,#fixed-height-popup .preview-code,#fixed-content-height-popup .preview-code,#margins-for-header-content-and-footer-block-in-popup .preview-code,#popup-titles-with-styled-as-theme-headings .preview-code,#popup-action-toolbar .preview-code,#popup-close-button-without-an-icon .preview-code,#modify-icon-of-popup-close-button .preview-code,#modify-overlay-styles .preview-code,#rating-summary-multiple-ratings .preview-code,#rating-summary-hide-label .preview-code,#rating-summary-icons-symbol .preview-code,#rating-summary-icons-color .preview-code,#rating-summary-set-number-of-icons .preview-code,#rating-summary .preview-code,#rating-with-vote-icon-symbol .preview-code,#rating-with-vote-setup-icons-colors .preview-code,#rating-with-vote-setup-number-of-icons .preview-code,#tabs-with-content-top-border .preview-code,#accordion-mixin-variables .preview-code,#tabs-base .preview-code,#accordion-base .preview-code,#warning-message .preview-code,#error-message .preview-code,#success-message .preview-code,#notice-message .preview-code,#message-with-inner-icon .preview-code,#message-with-lateral-icon .preview-code,#custom-message-style .preview-code,#modify-dropdown-list-styles .preview-code,#dropdown-with-icon-customization .preview-code,#split-button-button-styling .preview-code,#split-button-icon-customization .preview-code,#split-button-dropdown-list-customization .preview-code,#table-cells-resize .preview-code,#table-caption .preview-code,#table-typography .preview-code,#table-background-customization .preview-code,#table-borders-customization .preview-code,#table-without-borders .preview-code,#table-with-horizontal-borders .preview-code,#table-with-vertical-borders .preview-code,#striped-table .preview-code,#responsive-table-technics-1 .preview-code,#responsive-table-technics-2 .preview-code,#fontsize-mixin .preview-code,#word-breaking-mixin .preview-code,#word-breaking-mixin .preview-code,#text-overflow-mixin .preview-code,#text-hide .preview-code,#hyphens .preview-code,#font-style-and-color .preview-code,#reset-list-styles .preview-code,#inlineblock-list-item-styling .preview-code,#link-styling-mixin .preview-code,#heading-styling-mixin .preview-code,#icon-with-image-or-sprite .preview-code,#change-the-size-of-font-icon .preview-code,#sprite-and-font-icons-for-blank-theme .preview-code,#icon-position-for-an-icon-with-image-or-sprite .preview-code{display:none}article[id$="-variables"] .docs,#resets .docs,#ratings .docs,#tabs-and-accordions .docs,#messages .docs,#dropdown-and-split-buttons-mixins .docs,#font-face-mixin .docs,#layout .docs,#forms-mixins .docs,#including-magento-ui-library-to-your-theme .docs,#global-forms-elements-customization .docs,#mobile-off-canvas-navigation .docs,#desktop-navigation .docs,#layout-width .docs{width:100%}article[id$="-variables"] .code{display:none}article[id$="-variables"] .docs pre{background:#fff;border:0;margin-top:0}</style><script type="text/preview">(function(){"use strict";var a=function(a){return Array.prototype.slice.call(a)},b=document.getElementsByTagName("body")[0],c=["link","visited","hover","active","focus","target","enabled","disabled","checked"],d=new RegExp(":(("+c.join(")|(")+"))","gi"),e=a(document.styleSheets).map(function(b){return a(b.cssRules).filter(function(a){return a.selectorText&&a.selectorText.match(d)}).map(function(a){return a.cssText.replace(d,".\\3A $1")}).join("")}).join("");if(e.length){var f=document.createElement("style");f.innerText=e;var g=document.getElementsByTagName("style")[0];g.parentNode.insertBefore(f,g)}var h=function(){var a=window.getComputedStyle(b,null);return function(){if(b.childElementCount===0)return b.offsetHeight;var c=b.getElementsByTagName("*"),d=[];for(var e=0,f=c.length;e<f;e++)d.push(c[e].offsetTop+c[e].offsetHeight+parseInt(window.getComputedStyle(c[e],null).getPropertyValue("margin-bottom")));var g=Math.max.apply(Math,d);return g+=parseInt(a.getPropertyValue("padding-bottom"),10),Math.max(g,b.offsetHeight)}}(),i={getHeight:function(){window.parent.postMessage({height:h()},"*")}};window.addEventListener("message",function(a){if(a.data==null)return;typeof a.data=="string"&&i[a.data]()},!1)})()</script><style type="text/preview">.actions-toolbar:before,.actions-toolbar:after{content:"";display:table}.actions-toolbar:after{clear:both}.actions-toolbar .primary{float:left}.actions-toolbar .secondary{float:right}.actions-toolbar .primary,.actions-toolbar .secondary{display:inline-block}.actions-toolbar .primary a.action,.actions-toolbar .secondary a.action{display:inline-block}.actions-toolbar .primary .action{margin:0 5px 0 0}.actions-toolbar .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-2:before,.example-actions-toolbar-2:after{content:"";display:table}.example-actions-toolbar-2:after{clear:both}.example-actions-toolbar-2 .primary{float:left}.example-actions-toolbar-2 .secondary{float:right}.example-actions-toolbar-2 .primary,.example-actions-toolbar-2 .secondary{display:inline-block}.example-actions-toolbar-2 .primary a.action,.example-actions-toolbar-2 .secondary a.action{display:inline-block}.example-actions-toolbar-2 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-2 .secondary a.action{margin-top:6px}.example-actions-toolbar-3{text-align:left}.example-actions-toolbar-3:before,.example-actions-toolbar-3:after{content:"";display:table}.example-actions-toolbar-3:after{clear:both}.example-actions-toolbar-3 .primary{float:left}.example-actions-toolbar-3 .primary,.example-actions-toolbar-3 .secondary{display:inline-block}.example-actions-toolbar-3 .primary a.action,.example-actions-toolbar-3 .secondary a.action{display:inline-block}.example-actions-toolbar-3 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-3 .secondary a.action{margin-top:6px}.example-actions-toolbar-4{text-align:right}.example-actions-toolbar-4:before,.example-actions-toolbar-4:after{content:"";display:table}.example-actions-toolbar-4:after{clear:both}.example-actions-toolbar-4 .secondary{float:right}.example-actions-toolbar-4 .primary,.example-actions-toolbar-4 .secondary{display:inline-block}.example-actions-toolbar-4 .primary a.action,.example-actions-toolbar-4 .secondary a.action{display:inline-block}.example-actions-toolbar-4 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-4 .secondary a.action{margin-top:6px}.example-actions-toolbar-5{text-align:center}.example-actions-toolbar-5:before,.example-actions-toolbar-5:after{content:"";display:table}.example-actions-toolbar-5:after{clear:both}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{vertical-align:top}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{display:inline-block}.example-actions-toolbar-5 .primary a.action,.example-actions-toolbar-5 .secondary a.action{display:inline-block}.example-actions-toolbar-5 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-5 .secondary a.action{margin-top:6px}.example-actions-toolbar-6:before,.example-actions-toolbar-6:after{content:"";display:table}.example-actions-toolbar-6:after{clear:both}.example-actions-toolbar-6 .primary{float:right}.example-actions-toolbar-6 .secondary{float:left}.example-actions-toolbar-6 .primary,.example-actions-toolbar-6 .secondary{display:inline-block}.example-actions-toolbar-6 .primary a.action,.example-actions-toolbar-6 .secondary a.action{display:inline-block}.example-actions-toolbar-6 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-6 .secondary a.action{margin-top:6px}.example-actions-toolbar-7{text-align:left}.example-actions-toolbar-7:before,.example-actions-toolbar-7:after{content:"";display:table}.example-actions-toolbar-7:after{clear:both}.example-actions-toolbar-7 .secondary{float:left}.example-actions-toolbar-7 .primary,.example-actions-toolbar-7 .secondary{display:inline-block}.example-actions-toolbar-7 .primary a.action,.example-actions-toolbar-7 .secondary a.action{display:inline-block}.example-actions-toolbar-7 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-7 .secondary a.action{margin-top:6px}.example-actions-toolbar-8{text-align:right}.example-actions-toolbar-8:before,.example-actions-toolbar-8:after{content:"";display:table}.example-actions-toolbar-8:after{clear:both}.example-actions-toolbar-8 .primary{float:right}.example-actions-toolbar-8 .primary,.example-actions-toolbar-8 .secondary{display:inline-block}.example-actions-toolbar-8 .primary a.action,.example-actions-toolbar-8 .secondary a.action{display:inline-block}.example-actions-toolbar-8 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-8 .secondary a.action{margin-top:6px}.example-actions-toolbar-9{margin:10px;padding:10px}.example-actions-toolbar-9:before,.example-actions-toolbar-9:after{content:"";display:table}.example-actions-toolbar-9:after{clear:both}.example-actions-toolbar-9 .primary{float:left}.example-actions-toolbar-9 .secondary{float:right}.example-actions-toolbar-9 .primary,.example-actions-toolbar-9 .secondary{display:inline-block}.example-actions-toolbar-9 .primary a.action,.example-actions-toolbar-9 .secondary a.action{display:inline-block}.example-actions-toolbar-9 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-9 .secondary a.action{margin-top:6px}.example-actions-toolbar-10{text-align:left}.example-actions-toolbar-10:before,.example-actions-toolbar-10:after{content:"";display:table}.example-actions-toolbar-10:after{clear:both}.example-actions-toolbar-10 .primary{float:left}.example-actions-toolbar-10 .primary,.example-actions-toolbar-10 .secondary{display:inline-block}.example-actions-toolbar-10 .primary a.action,.example-actions-toolbar-10 .secondary a.action{display:inline-block}.example-actions-toolbar-10 .primary .action{margin:0 50px 0 0}.example-actions-toolbar-10 .secondary a.action{margin-top:6px}.example-actions-toolbar-11{text-align:left}.example-actions-toolbar-11:before,.example-actions-toolbar-11:after{content:"";display:table}.example-actions-toolbar-11:after{clear:both}.example-actions-toolbar-11 .primary{float:left}.example-actions-toolbar-11 .primary,.example-actions-toolbar-11 .secondary{display:inline-block}.example-actions-toolbar-11 .primary a.action,.example-actions-toolbar-11 .secondary a.action{display:inline-block}.example-actions-toolbar-11 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-11 .secondary .action{margin:0 50px 0 0}.example-actions-toolbar-11 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}@media only screen and (max-width: 768px){.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{ display:block;float:none}}.example-breadcrumbs-1{margin:0 0 20px}.example-breadcrumbs-1 .items{font-size:1.2rem;color:#a3a3a3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-1 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-1 .item{margin:0}.example-breadcrumbs-1 a{color:#333;text-decoration:none}.example-breadcrumbs-1 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-1 a:hover{color:#333;text-decoration:underline}.example-breadcrumbs-1 a:active{color:#333;text-decoration:none}.example-breadcrumbs-1 strong{font-weight:400}.example-breadcrumbs-1 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-1 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-2{margin:0 0 20px}.example-breadcrumbs-2 .items{font-size:1.2rem;color:#1979c3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-2 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-2 .item{margin:0}.example-breadcrumbs-2 a{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #ccc;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-2 a:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 strong{background-color:#ff5501;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f7b32e 0, #ff5501 100%);background-image:linear-gradient(to bottom, #f7b32e 0, #ff5501 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7b32e', endColorstr='#ff5501', GradientType=0);border:1px solid #d04b0a;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-2 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-2 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3{margin:0 0 20px}.example-breadcrumbs-3 .items{font-size:1.2rem;color:#333;margin:0;padding:0;list-style:none none}.example-breadcrumbs-3 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-3 .item{margin:0}.example-breadcrumbs-3 a{background:#f4f4f4;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-3 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-3 a:hover{background:#ccc;color:#333;text-decoration:none}.example-breadcrumbs-3 a:active{color:#333;text-decoration:none}.example-breadcrumbs-3 strong{background:#e7e7e7;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-3 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-3 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3 .item a{position:relative;margin:0 11px 0 0}.example-breadcrumbs-3 .item a:after{border:12px solid transparent;height:0;width:0;border-left-color:#f4f4f4;content:"";position:absolute;display:block;top:0;right:-23px}.example-breadcrumbs-3 .item a:hover:after{border-color:transparent transparent transparent #ccc}button{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}button:focus,button:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}button:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}button.disabled,button[disabled],fieldset[disabled] button{cursor:default;pointer-events:none;opacity:.5}button:active,button:focus{box-shadow:inset 0 2px 1px rgba(0,0,0,.12)}.example-button-1.example-button-2{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-button-1.example-button-3{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;border-radius:0;color:#000}.example-button-1.example-button-3:hover,.example-button-1.example-button-3.active{color:#000}.example-button-10{background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-10>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-button-10:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-10:hover:before{color:inherit}.example-button-10:active:before{color:inherit}.example-button-10:focus,.example-button-10:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-10:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:default;pointer-events:none;opacity:.5}.example-button-10:focus,.example-button-10:active{background:0;border:0}.example-button-10:hover{background:0;border:0}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-11{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-11:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-11:hover:before{color:inherit}.example-button-11:active:before{color:inherit}.example-button-11:focus,.example-button-11:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-11:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-11.disabled,.example-button-11[disabled],fieldset[disabled] .example-button-11{cursor:default;pointer-events:none;opacity:.5}.example-button-12{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-12:after{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-12:hover:after{color:inherit}.example-button-12:active:after{color:inherit}.example-button-12:focus,.example-button-12:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-12:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-12.disabled,.example-button-12[disabled],fieldset[disabled] .example-button-12{cursor:default;pointer-events:none;opacity:.5}.example-button-13{background-image:none;background:#f2f2f2;padding:7px 15px;width:100px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-13:focus,.example-button-13:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-13:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-13.disabled,.example-button-13[disabled],fieldset[disabled] .example-button-13{cursor:default;pointer-events:none;opacity:.5}.example-button-4{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-4:focus,.example-button-4:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4.disabled,.example-button-4[disabled],fieldset[disabled] .example-button-4{cursor:default;pointer-events:none;opacity:.5}.example-button-4:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-4.example-button-5{line-height:2.2rem;padding:7px 35px;font-size:1.8rem}.example-button-4.example-button-6{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;color:#fff}.example-button-4.example-button-6:hover,.example-button-4.example-button-6.active{color:#fff}.example-button-7{background-image:none;background:#f2f2f2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #1979c3 0, #006bb4 100%);background-image:linear-gradient(to bottom, #1979c3 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1979c3', endColorstr='#006bb4', GradientType=0);padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}.example-button-7:focus,.example-button-7:active{background:#e2e2e2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #006bb4 100%);background-image:linear-gradient(to bottom, #006bb4 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#006bb4', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7:hover{background:#e2e2e2;background-color:#1979c3;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #1979c3 100%);background-image:linear-gradient(to bottom, #006bb4 0, #1979c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#1979c3', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7.disabled,.example-button-7[disabled],fieldset[disabled] .example-button-7{cursor:default;pointer-events:none;opacity:.5}.example-button-7:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-8{background:0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;font-weight:400}.example-button-8:visited{color:#1979c3;text-decoration:none}.example-button-8:hover{color:#006bb4;text-decoration:underline}.example-button-8:active{color:#ff5501;text-decoration:underline}.example-button-8:hover{color:#006bb4}.example-button-8:hover,.example-button-8:active,.example-button-8:focus{background:0;border:0}.example-button-8.disabled,.example-button-8[disabled],fieldset[disabled] .example-button-8{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.example-button-8:active{box-shadow:none}.example-button-9{text-decoration:none;background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:0;vertical-align:middle;margin:3px;border-radius:3px;font-weight:700}.example-button-9:hover,.example-button-9:active,.example-button-9:focus{text-decoration:none}.example-button-9:focus,.example-button-9:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-9:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-9.disabled,.example-button-9[disabled],fieldset[disabled] .example-button-9{cursor:default;pointer-events:none;opacity:.5}.example-button-9:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-14{background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-14:focus,.example-button-14:active{background:0;border:0}.example-button-14:hover{background:0;border:0}.example-button-14.disabled,.example-button-14[disabled],fieldset[disabled] .example-button-14{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-15{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;vertical-align:middle;background:#f2f2f2;color:#333;border:1px solid #cdcdcd}.example-button-15:focus,.example-button-15:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15.disabled,.example-button-15[disabled],fieldset[disabled] .example-button-15{cursor:default;pointer-events:none;opacity:.5}.example-button-15:focus,.example-button-15:active{background:#e2e2e2;color:#333;border:1px solid #cdcdcd}.example-button-15:hover{background:#e2e2e2;color:#555;border:1px solid #cdcdcd}.example-button-17{line-height:2.2rem;padding:14px 17px;font-size:1.8rem;font-size:1.4rem;line-height:1.6rem;padding:7px 15px}.example-button-18{font-size:1rem;line-height:1.2rem;padding:4px 10px}.example-dropdown-1{display:inline-block;position:relative}.example-dropdown-1:before,.example-dropdown-1:after{content:"";display:table}.example-dropdown-1:after{clear:both}.example-dropdown-1 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle:hover:after{color:inherit}.example-dropdown-1 .action.toggle:active:after{color:inherit}.example-dropdown-1 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle.active:hover:after{color:inherit}.example-dropdown-1 .action.toggle.active:active:after{color:inherit}.example-dropdown-1 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-1 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-1 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-1 ul.dropdown:before,.example-dropdown-1 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-1 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-1 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-1 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-1 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-1.active{overflow:visible}.example-dropdown-1.active ul.dropdown{display:block}.example-dropdown-2{display:inline-block;position:relative}.example-dropdown-2:before,.example-dropdown-2:after{content:"";display:table}.example-dropdown-2:after{clear:both}.example-dropdown-2 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle:hover:after{color:inherit}.example-dropdown-2 .action.toggle:active:after{color:inherit}.example-dropdown-2 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle.active:hover:after{color:inherit}.example-dropdown-2 .action.toggle.active:active:after{color:inherit}.example-dropdown-2 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-2 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-2 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-2 ul.dropdown:before,.example-dropdown-2 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-2 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-2 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-2 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-2 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-2.active{overflow:visible}.example-dropdown-2.active ul.dropdown{display:block}.example-dropdown-3{display:inline-block;position:relative}.example-dropdown-3:before,.example-dropdown-3:after{content:"";display:table}.example-dropdown-3:after{clear:both}.example-dropdown-3 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle:hover:before{color:red}.example-dropdown-3 .action.toggle:active:before{color:inherit}.example-dropdown-3 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle.active:hover:before{color:red}.example-dropdown-3 .action.toggle.active:active:before{color:inherit}.example-dropdown-3 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-3 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-3 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-3 ul.dropdown:before,.example-dropdown-3 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-3 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-3 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-3 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-3 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-3.active{overflow:visible}.example-dropdown-3.active ul.dropdown{display:block}.example-dropdown-5{display:inline-block;position:relative}.example-dropdown-5:before,.example-dropdown-5:after{content:"";display:table}.example-dropdown-5:after{clear:both}.example-dropdown-5 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle:hover:after{color:inherit}.example-dropdown-5 .action.toggle:active:after{color:inherit}.example-dropdown-5 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle.active:hover:after{color:inherit}.example-dropdown-5 .action.toggle.active:active:after{color:inherit}.example-dropdown-5 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-5 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-5 ul.dropdown li:first-child{border:0}.example-dropdown-5 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-5.active{overflow:visible}.example-dropdown-5.active ul.dropdown{display:block}.example-dropdown-6{display:inline-block;position:relative}.example-dropdown-6:before,.example-dropdown-6:after{content:"";display:table}.example-dropdown-6:after{clear:both}.example-dropdown-6 .action.split{float:left;margin:0}.example-dropdown-6 .action.toggle{float:right;margin:0}.example-dropdown-6 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-6 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-6 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle:hover:after{color:inherit}.example-dropdown-6 .action.toggle:active:after{color:inherit}.example-dropdown-6 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle.active:hover:after{color:inherit}.example-dropdown-6 .action.toggle.active:active:after{color:inherit}.example-dropdown-6 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-6 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-6 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-6 ul.dropdown:before,.example-dropdown-6 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-6 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-6 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-6 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-6 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-6.active{overflow:visible}.example-dropdown-6.active ul.dropdown{display:block}.split.example-dropdown-7{display:inline-block;position:relative}.split.example-dropdown-7:before,.split.example-dropdown-7:after{content:"";display:table}.split.example-dropdown-7:after{clear:both}.split.example-dropdown-7 .action.split{float:left;margin:0}.split.example-dropdown-7 .action.toggle{float:right;margin:0}.split.example-dropdown-7 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle:active:after{color:inherit}.split.example-dropdown-7 .action.toggle.active{display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle.active:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle.active:active:after{color:inherit}.split.example-dropdown-7 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.split.example-dropdown-7 ul.dropdown li{margin:0;padding:3px 5px}.split.example-dropdown-7 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.split.example-dropdown-7 ul.dropdown:before,.split.example-dropdown-7 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.split.example-dropdown-7 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.split.example-dropdown-7 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.split.example-dropdown-7 ul.dropdown:before{top:-12px;right:10px}.split.example-dropdown-7 ul.dropdown:after{top:-14px;right:9px}.split.example-dropdown-7.active{overflow:visible}.split.example-dropdown-7.active ul.dropdown{display:block}.example-dropdown-8{display:inline-block;position:relative}.example-dropdown-8:before,.example-dropdown-8:after{content:"";display:table}.example-dropdown-8:after{clear:both}.example-dropdown-8 .action.split{float:left;margin:0}.example-dropdown-8 .action.toggle{float:right;margin:0}.example-dropdown-8 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-8 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-8 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle:hover:after{color:inherit}.example-dropdown-8 .action.toggle:active:after{color:inherit}.example-dropdown-8 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle.active:hover:after{color:inherit}.example-dropdown-8 .action.toggle.active:active:after{color:inherit}.example-dropdown-8 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-8 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-8 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-8 ul.dropdown:before,.example-dropdown-8 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-8 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-8 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-8 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-8 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-8.active{overflow:visible}.example-dropdown-8.active ul.dropdown{display:block}.example-dropdown-9{display:inline-block;position:relative}.example-dropdown-9 .action.split,.example-dropdown-9 .action.toggle{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-dropdown-9:before,.example-dropdown-9:after{content:"";display:table}.example-dropdown-9:after{clear:both}.example-dropdown-9 .action.split{float:left;margin:0}.example-dropdown-9 .action.toggle{float:right;margin:0}.example-dropdown-9 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-9 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-9 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle:hover:after{color:inherit}.example-dropdown-9 .action.toggle:active:after{color:inherit}.example-dropdown-9 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle.active:hover:after{color:inherit}.example-dropdown-9 .action.toggle.active:active:after{color:inherit}.example-dropdown-9 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-9 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-9 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-9 ul.dropdown:before,.example-dropdown-9 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-9 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-9 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-9 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-9 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-9.active{overflow:visible}.example-dropdown-9.active ul.dropdown{display:block}.example-dropdown-10{display:inline-block;position:relative}.example-dropdown-10 .action.split,.example-dropdown-10 .action.toggle{line-height:1.2rem;padding:5px 8px;font-size:1.1rem}.example-dropdown-10:before,.example-dropdown-10:after{content:"";display:table}.example-dropdown-10:after{clear:both}.example-dropdown-10 .action.split{float:left;margin:0}.example-dropdown-10 .action.toggle{float:right;margin:0}.example-dropdown-10 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-10 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-10 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle:hover:after{color:inherit}.example-dropdown-10 .action.toggle:active:after{color:inherit}.example-dropdown-10 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle.active:hover:after{color:inherit}.example-dropdown-10 .action.toggle.active:active:after{color:inherit}.example-dropdown-10 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-10 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-10 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-10 ul.dropdown:before,.example-dropdown-10 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-10 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-10 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-10 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-10 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-10.active{overflow:visible}.example-dropdown-10.active ul.dropdown{display:block}.example-dropdown-11{display:inline-block;position:relative}.example-dropdown-11:before,.example-dropdown-11:after{content:"";display:table}.example-dropdown-11:after{clear:both}.example-dropdown-11 .action.split{float:right;margin:0}.example-dropdown-11 .action.toggle{float:left;margin:0}.example-dropdown-11 button.action.split{border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-11 button+.action.toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-11 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle:hover:before{color:red}.example-dropdown-11 .action.toggle:active:before{color:inherit}.example-dropdown-11 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle.active:hover:before{color:red}.example-dropdown-11 .action.toggle.active:active:before{color:inherit}.example-dropdown-11 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-11 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-11 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-11 ul.dropdown:before,.example-dropdown-11 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-11 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-11 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-11 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-11 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-11.active{overflow:visible}.example-dropdown-11.active ul.dropdown{display:block}.example-dropdown-12{display:inline-block;position:relative}.example-dropdown-12:before,.example-dropdown-12:after{content:"";display:table}.example-dropdown-12:after{clear:both}.example-dropdown-12 .action.split{float:left;margin:0}.example-dropdown-12 .action.toggle{float:right;margin:0}.example-dropdown-12 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-12 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-12 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle:hover:after{color:inherit}.example-dropdown-12 .action.toggle:active:after{color:inherit}.example-dropdown-12 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle.active:hover:after{color:inherit}.example-dropdown-12 .action.toggle.active:active:after{color:inherit}.example-dropdown-12 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-12 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-12 ul.dropdown li:first-child{border:0}.example-dropdown-12 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-12.active{overflow:visible}.example-dropdown-12.active ul.dropdown{display:block}.example-form-1 .example-form-1-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-1 .example-form-1-fieldset>*{letter-spacing:normal}.example-form-1 .example-form-1-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-1 .example-form-1-fieldset:after{content:attr(data-hasrequired);display:block;font-size:1.2rem;color:#e02b27;margin:10px 0 0;letter-spacing:normal;word-spacing:normal}.example-form-1 .example-form-1-fieldset>.field{margin:0 0 20px}.example-form-1 .example-form-1-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-1 .example-form-1-fieldset>.field:last-child{margin-bottom:0}.example-form-1 .example-form-1-fieldset>.field>.label{font-weight:700}.example-form-1 .example-form-1-fieldset>.field>.label+br{display:none}.example-form-1 .example-form-1-fieldset>.field .choice input{vertical-align:top}.example-form-1 .example-form-1-fieldset>.field .fields.group:before,.example-form-1 .example-form-1-fieldset>.field .fields.group:after{content:"";display:table}.example-form-1 .example-form-1-fieldset>.field .fields.group:after{clear:both}.example-form-1 .example-form-1-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-1 .example-form-1-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-1 .example-form-1-fieldset>.field .addon textarea,.example-form-1 .example-form-1-fieldset>.field .addon select,.example-form-1 .example-form-1-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;box-shadow:none;display:inline-block;margin:0;width:auto}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore,.example-form-1 .example-form-1-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:disabled,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-1 .example-form-1-fieldset>.field .additional{margin-top:10px}.example-form-1 .example-form-1-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-1 .example-form-1-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-1 .example-form-1-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-form-2 .example-form-2-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-2 .example-form-2-fieldset>*{letter-spacing:normal}.example-form-2 .example-form-2-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-2 .example-form-2-fieldset>.field{margin:0 0 20px;box-sizing:border-box;display:inline-block;padding:0 12px 0 0;width:50%;vertical-align:top}.example-form-2 .example-form-2-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-2 .example-form-2-fieldset>.field:last-child{margin-bottom:0}.example-form-2 .example-form-2-fieldset>.field+.fieldset{clear:both}.example-form-2 .example-form-2-fieldset>.field>.label{font-weight:700}.example-form-2 .example-form-2-fieldset>.field>.label+br{display:none}.example-form-2 .example-form-2-fieldset>.field .choice input{vertical-align:top}.example-form-2 .example-form-2-fieldset>.field .fields.group:before,.example-form-2 .example-form-2-fieldset>.field .fields.group:after{content:"";display:table}.example-form-2 .example-form-2-fieldset>.field .fields.group:after{clear:both}.example-form-2 .example-form-2-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-2 .example-form-2-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-2 .example-form-2-fieldset>.field .addon textarea,.example-form-2 .example-form-2-fieldset>.field .addon select,.example-form-2 .example-form-2-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;box-shadow:none;display:inline-block;margin:0;width:auto}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore,.example-form-2 .example-form-2-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:disabled,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-2 .example-form-2-fieldset>.field .additional{margin-top:10px}.example-form-2 .example-form-2-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-2 .example-form-2-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-2 .example-form-2-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}input[type="text"],input[type="password"],input[type="url"],input[type="tel"],input[type="search"],input[type="number"],input[type="datetime"],input[type="email"]{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}input[type="text"]:disabled,input[type="password"]:disabled,input[type="url"]:disabled,input[type="tel"]:disabled,input[type="search"]:disabled,input[type="number"]:disabled,input[type="datetime"]:disabled,input[type="email"]:disabled{opacity:.5}input[type="text"]::-moz-placeholder,input[type="password"]::-moz-placeholder,input[type="url"]::-moz-placeholder,input[type="tel"]::-moz-placeholder,input[type="search"]::-moz-placeholder,input[type="number"]::-moz-placeholder,input[type="datetime"]::-moz-placeholder,input[type="email"]::-moz-placeholder{color:#c2c2c2}input[type="text"]::-webkit-input-placeholder,input[type="password"]::-webkit-input-placeholder,input[type="url"]::-webkit-input-placeholder,input[type="tel"]::-webkit-input-placeholder,input[type="search"]::-webkit-input-placeholder,input[type="number"]::-webkit-input-placeholder,input[type="datetime"]::-webkit-input-placeholder,input[type="email"]::-webkit-input-placeholder{color:#c2c2c2}input[type="text"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder,input[type="url"]:-ms-input-placeholder,input[type="tel"]:-ms-input-placeholder,input[type="search"]:-ms-input-placeholder,input[type="number"]:-ms-input-placeholder,input[type="datetime"]:-ms-input-placeholder,input[type="email"]:-ms-input-placeholder{color:#c2c2c2}select{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:5px 10px 4px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}select:disabled{opacity:.5}select[multiple="multiple"]{height:auto;margin-bottom:20px}textarea{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:auto;width:100%;padding:10px;margin:0;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;resize:vertical}textarea:disabled{opacity:.5}textarea::-moz-placeholder{color:#c2c2c2}textarea::-webkit-input-placeholder{color:#c2c2c2}textarea:-ms-input-placeholder{color:#c2c2c2}input[type="checkbox"]{margin:2px 5px 0 0}input[type="checkbox"]:disabled{opacity:.5}input[type="radio"]{margin:2px 5px 0 0}input[type="radio"]:disabled{opacity:.5}input.text-example-1,select.select-example-1,textarea.textarea-example-1{background:#fdf0d5;border-color:#fc0;color:#b30000}input.text-example-1:focus,select.select-example-1:focus,textarea.textarea-example-1:focus{border-color:#cff;color:#060}input.text-example-1:disabled,select.select-example-1:disabled,textarea.textarea-example-1:disabled{color:#fcc}input.text-example-1::-moz-placeholder,textarea.textarea-example-1::-moz-placeholder{color:#ccc}input.text-example-1::-webkit-input-placeholder,textarea.textarea-example-1::-webkit-input-placeholder{color:#ccc}input.text-example-1:-ms-input-placeholder,textarea.textarea-example-1:-ms-input-placeholder{color:#ccc}.number-example{-moz-appearance:textfield}.number-example::-webkit-inner-spin-button,.number-example::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.search-example{-webkit-appearance:none}.search-example::-webkit-search-cancel-button,.search-example::-webkit-search-decoration,.search-example::-webkit-search-results-button,.search-example::-webkit-search-results-decoration{-webkit-appearance:none}input,textarea,select{font-size:1.2rem;color:#e02b27}.example-icon-1{display:inline-block}.example-icon-1:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-2{display:inline-block}.example-icon-2:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -26px 0}.example-icon-3{display:inline-block}.example-icon-3>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-3:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -156px -52px}.example-icon-4{display:inline-block;text-decoration:none}.example-icon-4:before{font-family:'icons-blank-theme';content:'\e606';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-5{display:inline-block;text-decoration:none}.example-icon-5:after{font-family:'icons-blank-theme';content:'\e605';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-6{display:inline-block;text-decoration:none}.example-icon-6>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-6:before{font-family:'icons-blank-theme';content:'\e61b';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-7{display:inline-block}.example-icon-7:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8{display:inline-block}.example-icon-8:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8:before{background-position:-182px 0}.example-icon-9{display:inline-block}.example-icon-9:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-9:after{background-position:-52px -26px}.example-icon-10{display:inline-block}.example-icon-10:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-10:before{background-position:-104px 0}.example-icon-11{display:inline-block}.example-icon-11:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-11:before{width:30px;height:30px}.example-icon-11:after{width:30px;height:30px}.example-icon-11:before{background-color:#f1f1f1}.example-icon-12{display:inline-block;text-decoration:none}.example-icon-12:before{font-family:'icons-blank-theme';content:'\e612';font-size:28px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13{display:inline-block;text-decoration:none}.example-icon-13:before{font-family:'icons-blank-theme';content:'\e612';font-size:inherit;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13:before{font-size:26px;line-height:inherit}.example-icon-14{display:inline-block;text-decoration:none}.example-icon-14:before{font-family:'icons-blank-theme';content:'\e61d';font-size:26px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-14>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.icons-image-list{list-style:none;padding:0}.icons-image-list li{float:left;width:33%}.icons-image-list li>span{display:inline-block}.icons-image-list li>span:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.icons-image-list li .icon-search:before{background-position:0 0}.icons-image-list li .icon-cart:before{background-position:-26px 0}.icons-image-list li .icon-arrow-down:before{background-position:-52px 0}.icons-image-list li .icon-arrow-up:before{background-position:-78px 0}.icons-image-list li .icon-grid:before{background-position:-104px 0}.icons-image-list li .icon-list:before{background-position:-130px 0}.icons-image-list li .icon-remove:before{background-position:-156px 0}.icons-image-list li .icon-star:before{background-position:-182px 0}.icons-image-list li .icon-pointer-down:before{background-position:-208px 0}.icons-image-list li .icon-pointer-up:before{background-position:-234px 0}.icons-image-list li .icon-pointer-left:before{background-position:-260px 0}.icons-image-list li .icon-pointer-right:before{background-position:-286px 0}.icons-image-list li .icon-compare-empty:before{background-position:0 -26px}.icons-image-list li .icon-compare-full:before{background-position:-26px -26px}.icons-image-list li .icon-wishlist-empty:before{background-position:-52px -26px}.icons-image-list li .icon-wishlist-full:before{background-position:-78px -26px}.icons-image-list li .icon-update:before{background-position:-104px -26px}.icons-image-list li .icon-collapse:before{background-position:-130px -26px}.icons-image-list li .icon-expand:before{background-position:-156px -26px}.icons-image-list li .icon-menu:before{background-position:-182px -26px}.icons-image-list li .icon-prev:before{background-position:-208px -26px}.icons-image-list li .icon-next:before{background-position:-234px -26px}.icons-image-list li .icon-settings:before{background-position:-260px -26px}.icons-image-list li .icon-info:before{background-position:-286px -26px}.icons-image-list li .icon-checkmark:before{background-position:0 -52px}.icons-image-list li .icon-calendar:before{background-position:-26px -52px}.icons-image-list li .icon-comment:before{background-position:-52px -52px}.icons-image-list li .icon-comment-reflected:before{background-position:-78px -52px}.icons-image-list li .icon-envelope:before{background-position:-104px -52px}.icons-image-list li .icon-warning:before{background-position:-130px -52px}.icons-image-list li .icon-trash:before{background-position:-156px -52px}.icons-image-list li .icon-flag:before{background-position:-182px -52px}.icons-image-list li .icon-location:before{background-position:-208px -52px}.icons-image-list li .icon-up:before{background-position:-234px -52px}.icons-image-list li .icon-down:before{background-position:-260px -52px}.icons-font-list{list-style:none;padding:0}.icons-font-list li{float:left;width:25%;margin-bottom:35px;text-align:center}.icons-font-list li>span{display:inline-block;text-decoration:none}.icons-font-list li>span:before{font-family:'icons-blank-theme';font-size:34px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.icons-font-list li>span:before{content:attr(data-icon);margin:0 auto;display:block}.loader{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.5);z-index:9999}.loader:before{border-radius:5px;background:transparent url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%;box-sizing:border-box;content:'';position:absolute;top:0;right:0;left:0;bottom:0;margin:auto;width:160px;height:160px}.loading{position:relative}.loading:before{content:'';position:absolute;left:0;top:0;right:0;bottom:0;background:rgba(255,255,255,.5) url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%}.example-message-info{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-info a{color:#1979c3}.example-message-info a:hover{color:#006bb4}.example-message-info a:active{color:#006bb4}.example-message-warning{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-warning a{color:#1979c3}.example-message-warning a:hover{color:#006bb4}.example-message-warning a:active{color:#006bb4}.example-message-error{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27}.example-message-error a{color:#1979c3}.example-message-error a:hover{color:#006bb4}.example-message-error a:active{color:#006bb4}.example-message-success{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400}.example-message-success a{color:#1979c3}.example-message-success a:hover{color:#006bb4}.example-message-success a:active{color:#006bb4}.example-message-notice{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-notice a{color:#1979c3}.example-message-notice a:hover{color:#006bb4}.example-message-notice a:active{color:#006bb4}.example-message-1{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400;position:relative;padding-left:40px}.example-message-1 a{color:#1979c3}.example-message-1 a:hover{color:#006bb4}.example-message-1 a:active{color:#006bb4}.example-message-1>:first-child:before{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#c07600;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:40px}.example-message-2{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27;position:relative;padding-right:40px}.example-message-2 a{color:#1979c3}.example-message-2 a:hover{color:#006bb4}.example-message-2 a:active{color:#006bb4}.example-message-2:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#b30000}.example-message-2>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-2>:first-child:after{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-2:before{right:0}.example-message-2>:first-child:before{border:5px solid transparent;height:0;width:0;border-right-color:#b30000;right:30px}.example-message-2>:first-child:after{right:0}.example-message-3{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400;position:relative;padding-left:40px}.example-message-3 a{color:#1979c3}.example-message-3 a:hover{color:#006bb4}.example-message-3 a:active{color:#006bb4}.example-message-3:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#006400}.example-message-3>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-3>:first-child:after{font-family:'icons-blank-theme';content:'\e610';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-3:before{left:0}.example-message-3>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#006400;left:30px}.example-message-3>:first-child:after{left:0}.example-message-4{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fc0;border-color:#ffa500;color:#000;position:relative;padding-left:40px;border-width:4px;border-radius:10px}.example-message-4 a{color:#00f}.example-message-4 a:hover{color:#009}.example-message-4 a:active{color:#006}.example-message-4:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#green}.example-message-4>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-4>:first-child:after{font-family:'icons-blank-theme';content:'\e606';font-size:28px;line-height:28px;color:#000;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:15px;left:0;text-align:center;width:30px}.example-message-4:before{left:0}.example-message-4>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#green;left:30px}.example-message-4>:first-child:after{left:0}header.header{background-color:rgba(255,0,0,.2)}.column.main{background-color:rgba(255,255,0,.2)}.column.left{background-color:rgba(0,255,255,.2)}.column.right{background-color:rgba(0,0,255,.2)}footer.footer{background-color:rgba(0,0,0,.2)}.columns{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.columns:after{content:" ";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.columns>.column{padding-bottom:40px}@media (min-width: 600px){.page-layout-1column .column.main{ width:100%;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-3columns .column.main{width:66.66666667%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-left .column.main{width:83.33333333%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.main{width:83.33333333%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-left .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-right .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.right{width:16.66666667%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.page-layout-2columns-left .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}}.layout-example-3 .column.main{width:60%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3 .column.left{width:20%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.layout-example-3-1 .column.main{width:60%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3-1 .column.left{width:20%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3-1 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.pages>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.pages .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.pages .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.pages a.page:visited{color:#1979c3}.pages a.page:hover{color:#006bb4;text-decoration:none}.pages a.page:active{color:#ff5501}.pages strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.pages .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.pages .action:visited{color:#7d7d7d}.pages .action:hover{color:#7d7d7d;text-decoration:none}.pages .action:active{color:#7d7d7d}.pages .action.next{display:inline-block;text-decoration:none}.pages .action.next:visited:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.next:hover:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.previous{display:inline-block;text-decoration:none}.pages .action.previous:visited:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.pages .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.previous:hover:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.example-pages-1>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-1>.label:after{content:':'}.example-pages-1 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-1 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 3px;display:inline-block}.example-pages-1 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 a.page{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #b3b3b3;color:#333;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-1 a.page:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#1979c3}.example-pages-1 a.page:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);border:1px solid #999;color:#333;text-decoration:none}.example-pages-1 a.page:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#ff5501}.example-pages-1 strong.page{background:#1979c3;border:1px solid #135d96;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#f7b32e;display:inline-block;font-weight:700;padding:0 4px}.example-pages-1 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-1 .action:visited{color:#7d7d7d}.example-pages-1 .action:hover{color:#ff5501;text-decoration:none}.example-pages-1 .action:active{color:#7d7d7d}.example-pages-1 .action.next{display:inline-block;text-decoration:none}.example-pages-1 .action.next:visited:before{color:#7d7d7d}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.next:hover:before{color:#ff5501}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.previous{display:inline-block;text-decoration:none}.example-pages-1 .action.previous:visited:before{color:#7d7d7d}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-1 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.previous:hover:before{color:#ff5501}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-2>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-2>.label:after{content:':'}.example-pages-2 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-2 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-2 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-2 a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-2 a.page:visited{color:#1979c3}.example-pages-2 a.page:hover{color:#006bb4;text-decoration:none}.example-pages-2 a.page:active{color:#ff5501}.example-pages-2 strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.example-pages-2 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-2 .action:visited{color:#7d7d7d}.example-pages-2 .action:hover{color:#7d7d7d;text-decoration:none}.example-pages-2 .action:active{color:#7d7d7d}.example-pages-3>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-3 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-3 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 a.page{background:#1979c3;color:#fff;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-3 a.page:visited{background:#1979c3;color:#fff}.example-pages-3 a.page:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 a.page:active{background:#ff5501;color:#fff}.example-pages-3 strong.page{background:#1979c3;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#fff;display:inline-block;font-weight:700;padding:0 4px}.example-pages-3 .action{background:#1979c3;border:1px solid #d1d1d1;color:#fff;display:inline-block;padding:0;text-decoration:none}.example-pages-3 .action:visited{background:#1979c3;color:#7d7d7d}.example-pages-3 .action:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 .action:active{background:#ff5501;color:#fff}.example-pages-3 .action.next{display:inline-block;text-decoration:none}.example-pages-3 .action.next:visited:before{color:#7d7d7d}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.next:hover:before{color:#fff}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.previous{display:inline-block;text-decoration:none}.example-pages-3 .action.previous:visited:before{color:#7d7d7d}.example-pages-3 .action.previous:active:before{color:#fff}.example-pages-3 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.previous:hover:before{color:#fff}.example-pages-3 .action.previous:active:before{color:#fff}.window.popup.popup-example{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:focus,.window.popup.popup-example .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example .popup-actions .action.close.disabled,.window.popup.popup-example .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example.active{opacity:1}.window.popup.popup-example-1{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-1 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-1 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-1 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-1 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-1 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-1 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:focus,.window.popup.popup-example-1 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close.disabled,.window.popup.popup-example-1 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-1 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-1.active{opacity:1}.window.overlay{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#000;z-index:1000;opacity:0}.window.overlay.active{opacity:.5;filter:alpha(opacity=50)}.window.popup.popup-example-2{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;overflow-y:auto;max-height:200px;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-2 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-2 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-2 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-2 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-2 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-2 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:focus,.window.popup.popup-example-2 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close.disabled,.window.popup.popup-example-2 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-2 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-2.active{opacity:1}.window.popup.popup-example-3{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-3 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-3 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-3 .popup-content{overflow-y:auto;max-height:200px}.window.popup.popup-example-3 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-3 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-3 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-3 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:focus,.window.popup.popup-example-3 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close.disabled,.window.popup.popup-example-3 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-3 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-3.active{opacity:1}.window.popup.popup-example-4{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-4 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-4 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-4 .popup-content{margin:0 0 20px}.window.popup.popup-example-4 .popup-footer{margin:0 20px}.window.popup.popup-example-4 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-4 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-4 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-4 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:focus,.window.popup.popup-example-4 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close.disabled,.window.popup.popup-example-4 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-4 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-4.active{opacity:1}.window.popup.popup-example-5{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-5 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-5 .popup-header .title{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.window.popup.popup-example-5 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-5 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-5 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-5 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:focus,.window.popup.popup-example-5 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close.disabled,.window.popup.popup-example-5 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-5 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-5.active{opacity:1}.window.popup.popup-example-6{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-6 .popup-footer .actions.toolbar{text-align:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar:before,.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{content:"";display:table}.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{clear:both}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{float:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary a.action,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary .action{margin:0 5px 0 0}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{margin-top:6px}.window.popup.popup-example-6 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-6 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-6 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-6 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-6 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-6 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:focus,.window.popup.popup-example-6 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close.disabled,.window.popup.popup-example-6 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-6 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-6.active{opacity:1}.window.popup.popup-example-7{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-7 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-7 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-7 .popup-actions .action.close{position:absolute;top:10px;right:10px}.window.popup.popup-example-7.active{opacity:1}.window.popup.popup-example-8{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-8 .popup-header{margin:0 0 25px;padding-right:30px}.window.popup.popup-example-8 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-8 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-8 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e613';font-size:30px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:0}.window.popup.popup-example-8 .popup-actions .action.close:hover:before{color:#090}.window.popup.popup-example-8 .popup-actions .action.close:active:before{color:#00f}.window.popup.popup-example-8 .popup-actions .action.close:focus,.window.popup.popup-example-8 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close.disabled,.window.popup.popup-example-8 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-8 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-8.active{opacity:1}.window.popup.popup-example-9{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-9 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-9 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-9 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-9 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-9 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-9 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:focus,.window.popup.popup-example-9 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close.disabled,.window.popup.popup-example-9 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-9 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-9.active{opacity:1}.window.overlay.example-overlay-1.active{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#0f5293;z-index:1000;opacity:0}.window.overlay.example-overlay-1.active.active{opacity:.8;filter:alpha(opacity=80)}.example-ratings-1{overflow:hidden}.example-ratings-1:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-1 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 input[type="radio"]:focus+label:before,.example-ratings-1 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-1 label{position:absolute;display:block;cursor:pointer}.example-ratings-1 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-1 label:hover:before{opacity:1}.example-ratings-1 label:hover~label:before{opacity:0}.example-ratings-1 .rating-5{z-index:2}.example-ratings-1 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-4{z-index:3}.example-ratings-1 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-3{z-index:4}.example-ratings-1 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-1 .rating-2{z-index:5}.example-ratings-1 .rating-2:before{content:'\e605' '\e605'}.example-ratings-1 .rating-1{z-index:6}.example-ratings-1 .rating-1:before{content:'\e605'}.example-ratings-2{overflow:hidden}.example-ratings-2:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-2 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 input[type="radio"]:focus+label:before,.example-ratings-2 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-2 label{position:absolute;display:block;cursor:pointer}.example-ratings-2 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-2 label:hover:before{opacity:1}.example-ratings-2 label:hover~label:before{opacity:0}.example-ratings-2 .rating-8{z-index:2}.example-ratings-2 .rating-8:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-7{z-index:3}.example-ratings-2 .rating-7:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-6{z-index:4}.example-ratings-2 .rating-6:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-5{z-index:5}.example-ratings-2 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-4{z-index:6}.example-ratings-2 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-3{z-index:7}.example-ratings-2 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-2 .rating-2{z-index:8}.example-ratings-2 .rating-2:before{content:'\e605' '\e605'}.example-ratings-2 .rating-1{z-index:9}.example-ratings-2 .rating-1:before{content:'\e605'}.example-ratings-3{overflow:hidden}.example-ratings-3:before{color:#aff5e3;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-3 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 input[type="radio"]:focus+label:before,.example-ratings-3 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-3 label{position:absolute;display:block;cursor:pointer}.example-ratings-3 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 label:before{color:#0a6767;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-3 label:hover:before{opacity:1}.example-ratings-3 label:hover~label:before{opacity:0}.example-ratings-3 .rating-5{z-index:2}.example-ratings-3 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-4{z-index:3}.example-ratings-3 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-3{z-index:4}.example-ratings-3 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-3 .rating-2{z-index:5}.example-ratings-3 .rating-2:before{content:'\e605' '\e605'}.example-ratings-3 .rating-1{z-index:6}.example-ratings-3 .rating-1:before{content:'\e605'}.example-ratings-4{overflow:hidden}.example-ratings-4:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e600' '\e600' '\e600' '\e600' '\e600';position:absolute;z-index:1;display:block}.example-ratings-4 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 input[type="radio"]:focus+label:before,.example-ratings-4 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-4 label{position:absolute;display:block;cursor:pointer}.example-ratings-4 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-4 label:hover:before{opacity:1}.example-ratings-4 label:hover~label:before{opacity:0}.example-ratings-4 .rating-5{z-index:2}.example-ratings-4 .rating-5:before{content:'\e600' '\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-4{z-index:3}.example-ratings-4 .rating-4:before{content:'\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-3{z-index:4}.example-ratings-4 .rating-3:before{content:'\e600' '\e600' '\e600'}.example-ratings-4 .rating-2{z-index:5}.example-ratings-4 .rating-2:before{content:'\e600' '\e600'}.example-ratings-4 .rating-1{z-index:6}.example-ratings-4 .rating-1:before{content:'\e600'}.exapmle-ratings-5 .control.rating.vote{overflow:hidden}.exapmle-ratings-5 .control.rating.vote:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.exapmle-ratings-5 .control.rating.vote input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote input[type="radio"]:focus+label:before,.exapmle-ratings-5 .control.rating.vote input[type="radio"]:checked+label:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label{position:absolute;display:block;cursor:pointer}.exapmle-ratings-5 .control.rating.vote label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.exapmle-ratings-5 .control.rating.vote label:hover:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label:hover~label:before{opacity:0}.exapmle-ratings-5 .control.rating.vote .rating-5{z-index:2}.exapmle-ratings-5 .control.rating.vote .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-4{z-index:3}.exapmle-ratings-5 .control.rating.vote .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-3{z-index:4}.exapmle-ratings-5 .control.rating.vote .rating-3:before{content:'\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-2{z-index:5}.exapmle-ratings-5 .control.rating.vote .rating-2:before{content:'\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-1{z-index:6}.exapmle-ratings-5 .control.rating.vote .rating-1:before{content:'\e605'}.example-rating-summary-1{white-space:nowrap;overflow:hidden}.example-rating-summary-1 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-1 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-1 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-2{white-space:nowrap;overflow:hidden}.example-rating-summary-2 .rating-result{width:154px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-2 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-2 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-3{white-space:nowrap;overflow:hidden}.example-rating-summary-3 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-3 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#aff5e3;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-3 .rating-result>span:before{position:relative;z-index:2;color:#0a6767;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-4{white-space:nowrap;overflow:hidden}.example-rating-summary-4 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-4 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-4 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5{white-space:nowrap;overflow:hidden}.example-rating-summary-5 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-5 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-5 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-6 .rating-summary{white-space:nowrap;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-6 .rating-summary .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span{display:block;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7{white-space:nowrap;overflow:hidden}.example-rating-summary-7 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-7 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-7 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-responsive-block{padding:10px}.example-sections-1{position:relative;z-index:1}.example-sections-1:before,.example-sections-1:after{content:"";display:table}.example-sections-1:after{clear:both}.example-sections-1>.item.title{float:left;width:auto}.example-sections-1>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-1>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-1>.item.content:before,.example-sections-1>.item.content:after{content:"";display:table}.example-sections-1>.item.content:after{clear:both}.example-sections-1>.item.content.active{display:block}.example-sections-1>.item.title{margin:0 5px 0 0}.example-sections-1>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-1>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-1>.item.title:not(.disabled)>.switch:focus,.example-sections-1>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-1>.item.title:not(.disabled)>.switch:active,.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-1>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}.example-sections-2{position:relative;z-index:1}.example-sections-2:before,.example-sections-2:after{content:"";display:table}.example-sections-2:after{clear:both}.example-sections-2>.item.title{float:left;width:auto}.example-sections-2>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-2>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-2>.item.content:before,.example-sections-2>.item.content:after{content:"";display:table}.example-sections-2>.item.content:after{clear:both}.example-sections-2>.item.content.active{display:block}.example-sections-2>.item.title{margin:0 5px 0 0}.example-sections-2>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-2>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-2>.item.title:not(.disabled)>.switch:focus,.example-sections-2>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-2>.item.title:not(.disabled)>.switch:active,.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-2>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:0;border-top:1px solid #d1d1d1}.example-sections-3{margin:0;padding:0}.example-sections-3>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-3>.item.title>.switch{display:block}.example-sections-3>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-3>.item.content:before,.example-sections-3>.item.content:after{content:"";display:table}.example-sections-3>.item.content:after{clear:both}.example-sections-3>.item.content.active{display:block}.example-sections-3>.item.title{margin:0 0 5px}.example-sections-3>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-3>.item.title:not(.disabled)>.switch:focus,.example-sections-3>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-3>.item.title:not(.disabled)>.switch:active,.example-sections-3>.item.title.active>.switch,.example-sections-3>.item.title.active>.switch:focus,.example-sections-3>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-3>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}@media only screen and (max-width: 99999px){.example-sections-4{ position:relative;z-index:1}.example-sections-4:before,.example-sections-4:after{content:"";display:table}.example-sections-4:after{clear:both}.example-sections-4>.item.title{float:left;width:auto}.example-sections-4>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-4>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 5px 0 0}.example-sections-4>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-4>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}}@media only screen and (max-width: 768px){.example-sections-4{ margin:0;padding:0}.example-sections-4>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-4>.item.title>.switch{display:block}.example-sections-4>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 0 5px}.example-sections-4>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-4>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}}.example-sections-5{position:relative;z-index:1}.example-sections-5:before,.example-sections-5:after{content:"";display:table}.example-sections-5:after{clear:both}.example-sections-5>.item.title{float:left;width:auto}.example-sections-5>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-5>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-5>.item.content:before,.example-sections-5>.item.content:after{content:"";display:table}.example-sections-5>.item.content:after{clear:both}.example-sections-5>.item.content.active{display:block}.example-sections-6{margin:0;padding:0}.example-sections-6>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-6>.item.title>.switch{display:block}.example-sections-6>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-6>.item.content:before,.example-sections-6>.item.content:after{content:"";display:table}.example-sections-6>.item.content:after{clear:both}.example-sections-6>.item.content.active{display:block}.example-table-1{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-1 th{text-align:left}.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{vertical-align:top}.example-table-1>thead>tr>th,.example-table-1>thead>tr>td{vertical-align:bottom}.example-table-1>thead>tr>th,.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>thead>tr>td,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{padding:8px 10px}.example-table-2>thead>tr>th,.example-table-2>tbody>tr>th,.example-table-2>tfoot>tr>th{color:#111;font-weight:700}.example-table-3{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-3 th{text-align:left}.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{vertical-align:top}.example-table-3>thead>tr>th,.example-table-3>thead>tr>td{vertical-align:bottom}.example-table-3>thead>tr>th,.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>thead>tr>td,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{padding:8px 10px}.example-table-3>caption{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-table-4{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-4 th{text-align:left}.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{vertical-align:top}.example-table-4>thead>tr>th,.example-table-4>thead>tr>td{vertical-align:bottom}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:8px 10px}.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:15px 25px 5px 0}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th{padding:15px 25px 10px 0}.example-table-5{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;background:#fff}.example-table-5 th{text-align:left}.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{vertical-align:top}.example-table-5>thead>tr>th,.example-table-5>thead>tr>td{vertical-align:bottom}.example-table-5>thead>tr>th,.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>thead>tr>td,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{padding:8px 10px}.example-table-5>thead{background:#ccf}.example-table-5>tfoot{background:#cff}.example-table-5>tbody>tr>td{background:#fcc}.example-table-5>tbody>tr>th{background:#ffc}.example-table-6{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-6 th{text-align:left}.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{vertical-align:top}.example-table-6>thead>tr>th,.example-table-6>thead>tr>td{vertical-align:bottom}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{padding:8px 10px}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-7{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-7 th{text-align:left}.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{vertical-align:top}.example-table-7>thead>tr>th,.example-table-7>thead>tr>td{vertical-align:bottom}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{padding:8px 10px}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{border-top:1px solid #d1d1d1}.example-table-7>caption+thead>tr:first-child>th,.example-table-7>colgroup+thead>tr:first-child>th,.example-table-7>thead:first-child>tr:first-child>th,.example-table-7>caption+thead>tr:first-child>td,.example-table-7>colgroup+thead>tr:first-child>td,.example-table-7>thead:first-child>tr:first-child>td{border-top:0}.example-table-7>tbody+tbody{border-top:1px solid #d1d1d1}.example-table-8{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-8 th{text-align:left}.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{vertical-align:top}.example-table-8>thead>tr>th,.example-table-8>thead>tr>td{vertical-align:bottom}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{padding:8px 10px}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{border-left:1px solid #d1d1d1}.example-table-8>thead>tr>th:first-child,.example-table-8>tbody>tr>th:first-child,.example-table-8>tfoot>tr>th:first-child,.example-table-8>thead>tr>td:first-child,.example-table-8>tbody>tr>td:first-child,.example-table-8>tfoot>tr>td:first-child{border-left:0}.example-table-9{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-9 th{text-align:left}.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{vertical-align:top}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{vertical-align:bottom}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{padding:8px 10px}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{border:0}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{border-bottom:1px solid #d1d1d1}.example-table-10{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-10 th{text-align:left}.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{vertical-align:top}.example-table-10>thead>tr>th,.example-table-10>thead>tr>td{vertical-align:bottom}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{padding:8px 10px}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{border:0}.example-table-11{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-11 th{text-align:left}.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{vertical-align:top}.example-table-11>thead>tr>th,.example-table-11>thead>tr>td{vertical-align:bottom}.example-table-11>thead>tr>th,.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>thead>tr>td,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{padding:8px 10px}.example-table-11>tbody>tr:nth-child(even)>td,.example-table-11>tbody>tr:nth-child(even)>th{background:#ffc;color:#000}.example-table-12{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-12 th{text-align:left}.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{vertical-align:top}.example-table-12>thead>tr>th,.example-table-12>thead>tr>td{vertical-align:bottom}.example-table-12>thead>tr>th,.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>thead>tr>td,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{padding:8px 10px}.example-table-12>tbody>tr:nth-child(even):hover>td,.example-table-12>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-12>tbody>tr:nth-child(odd):hover>td,.example-table-12>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}.example-table-13{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-13 th{text-align:left}.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{vertical-align:top}.example-table-13>thead>tr>th,.example-table-13>thead>tr>td{vertical-align:bottom}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{padding:8px 10px}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-13>tbody>tr:nth-child(odd)>td,.example-table-13>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-13>tbody>tr:nth-child(even):hover>td,.example-table-13>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-13>tbody>tr:nth-child(odd):hover>td,.example-table-13>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-14{ width:100%;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}}.example-table-15{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-15 th{text-align:left}.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{vertical-align:top}.example-table-15>thead>tr>th,.example-table-15>thead>tr>td{vertical-align:bottom}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{padding:8px 10px}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-15{ border:0;display:block;background:#cff}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#cff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#cff}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#cff}.example-table-15>thead>tr>th{display:none}.example-table-15>tbody{display:block}.example-table-15>tbody>tr{display:block}.example-table-15>tbody>tr td,.example-table-15>tbody>tr th{border-bottom:0;display:block;padding:5px 0}.example-table-15>tbody>tr td:before,.example-table-15>tbody>tr th:before{content:attr(data-th) ":";display:inline-block;padding-right:10px;color:#111;font-weight:700}.example-table-15>tbody>tr td{background:#cff}.example-table-15>tbody>tr>th{background-color:#ffc!important}}.example-tooltip-bottom{position:relative}.example-tooltip-bottom .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;top:100%;left:0;margin-top:5px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-bottom .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-bottom .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{bottom:100%}.example-tooltip-bottom .tooltip-content:after{border-bottom-color:#fff;margin-left:-5px;left:15px}.example-tooltip-bottom .tooltip-content:before{border-bottom-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-bottom .tooltip-toggle{cursor:help}.example-tooltip-bottom .tooltip-toggle:hover+.tooltip-content,.example-tooltip-bottom .tooltip-toggle:focus+.tooltip-content,.example-tooltip-bottom:hover .tooltip-content{display:block}.example-tooltip-left{position:relative}.example-tooltip-left .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;right:100%;top:0;margin-right:5px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-left .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-left .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{left:100%}.example-tooltip-left .tooltip-content:after{border-left-color:#fff;margin-top:-5px;top:15px}.example-tooltip-left .tooltip-content:before{border-left-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-left .tooltip-toggle{cursor:help}.example-tooltip-left .tooltip-toggle:hover+.tooltip-content,.example-tooltip-left .tooltip-toggle:focus+.tooltip-content,.example-tooltip-left:hover .tooltip-content{display:block}.example-tooltip-right{position:relative}.example-tooltip-right .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;left:100%;top:0;margin-left:5px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-right .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-right .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{right:100%}.example-tooltip-right .tooltip-content:after{border-right-color:#fff;margin-top:-5px;top:15px}.example-tooltip-right .tooltip-content:before{border-right-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-right .tooltip-toggle{cursor:help}.example-tooltip-right .tooltip-toggle:hover+.tooltip-content,.example-tooltip-right .tooltip-toggle:focus+.tooltip-content,.example-tooltip-right:hover .tooltip-content{display:block}.example-tooltip-top{position:relative}.example-tooltip-top .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;bottom:100%;left:0;margin-bottom:5px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-top .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-top .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{top:100%}.example-tooltip-top .tooltip-content:after{border-top-color:#fff;margin-left:-5px;left:15px}.example-tooltip-top .tooltip-content:before{border-top-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-top .tooltip-toggle{cursor:help}.example-tooltip-top .tooltip-toggle:hover+.tooltip-content,.example-tooltip-top .tooltip-toggle:focus+.tooltip-content,.example-tooltip-top:hover .tooltip-content{display:block}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{font-size:71.42857143%;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-break:break-all;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-line-height{line-height:3rem}.example-word-wrap{word-break:break-all;word-break:break-word;word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;background:#ccc;width:120px}.example-text-overflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:#ccc;width:120px}.example-text-hide{background-color:transparent;border:0;font:0/0 a;color:transparent;text-shadow:none}.example-hyphens{word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.example-hyphens-none{word-wrap:break-word;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.example-typography{color:#fc0;font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-weight:500;font-style:italic;line-height:1.2}.example-list-reset-styles{margin:0;padding:0;list-style:none none}.example-list-inline{margin:0;padding:0;list-style:none none}.example-list-inline>li{display:inline-block;vertical-align:top}.example-link-default{color:#1979c3;text-decoration:none}.example-link-default:visited{color:#1979c3;text-decoration:none}.example-link-default:hover{color:#006bb4;text-decoration:underline}.example-link-default:active{color:#ff5501;text-decoration:underline}.example-link{color:#008000;text-decoration:none}.example-link:visited{color:#1979c3;text-decoration:none}.example-link:hover{color:#ffa500;text-decoration:none}.example-link:active{color:#ff5501;text-decoration:underline}.example-heading{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.example-heading-2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{font-size:71.42857143%;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-break:break-all;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-clearfix-container-1{border:1px solid red}.example-clearfix-container-2{border:1px solid #0f0}.example-clearfix-container-2:before,.example-clearfix-container-2:after{content:"";display:table}.example-clearfix-container-2:after{clear:both}.example-clearfix-item.left{float:left}.example-clearfix-item.right{float:right}.example-visibility-hidden{height:0;visibility:hidden}.example-visually-hidden-1{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{background:#fdf0d5;padding:5px;border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.example-css-container{padding:20px;background:#e8e8e8}.example-rotate{background:red;position:absolute;height:20px;width:40px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.example-placeholder::-webkit-input-placeholder{color:#808080;font-weight:700}.example-placeholder:-moz-placeholder{color:#808080;font-weight:700}.example-placeholder::-moz-placeholder{color:#808080;font-weight:700}.example-placeholder:-ms-input-placeholder{color:#808080;font-weight:700}.example-background-gradient-1{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #cff 0, #ccf 100%);background-image:linear-gradient(to bottom, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=0)}.example-background-gradient-2{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop( #cff 0),color-stop( #ccf 100%));background-image:linear-gradient(to right, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=1)}.example-background-gradient-3-wrapper{background:#ffc;padding:10px}.example-background-gradient-3{background-color:rgba(255,255,255,0);background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(rgba(255,255,255,0) 0),color-stop( #ccf 100%));background-image:linear-gradient(to right,rgba(255,255,255,0) 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='rgba(255, 255, 255, 0)',endColorstr='#ccccff',GradientType=1)}body{padding:15px;background-image:none}</style></head><body><nav class="bar top cf"><div class="container"><a href="index.html" class="brand">Magento UI Library</a><ul class="menu"><li><a href="#" data-toggle="dropdown-1" unselectable="on" class="dropdown-toggle">files</a><ul id="dropdown-1" hidden class="dropdown"><li><a href="actions-toolbar.html">actions-toolbar</a></li><li><a href="breadcrumbs.html">breadcrumbs</a></li><li><a href="buttons.html">buttons</a></li><li><a href="docs.html">docs</a></li><li><a href="dropdowns.html">dropdowns</a></li><li><a href="forms.html">forms</a></li><li><a href="icons.html">icons</a></li><li><a href="layout.html">layout</a></li><li><a href="lib.html">lib</a></li><li><a href="loaders.html">loaders</a></li><li><a href="messages.html">messages</a></li><li><a href="pages.html">pages</a></li><li><a href="popups.html">popups</a></li><li><a href="rating.html">rating</a></li><li><a href="resets.html">resets</a></li><li><a href="responsive.html">responsive</a></li><li><a href="sections.html">sections</a></li><li><a href="tables.html">tables</a></li><li><a href="tooltips.html">tooltips</a></li><li><a href="typography.html">typography</a></li><li><a href="utilities.html">utilities</a></li><li><a href="variables.html">variables</a></li></ul></li></ul><div class="nav"><button title="Table of Contents" data-toggle="nav-toc"><svg viewBox="0 0 512 512" height="22" width="22" class="icon"><path d="M108.9,403.1V462H50v-58.9H108.9z M108.9,285.4H50v58.9h58.9V285.4zM108.9,50H50v58.9h58.9V50z M108.9,167.7H50v58.9h58.9V167.7z M167.7,344.3H462v-58.9H167.7V344.3zM167.7,50v58.9H462V50H167.7z M167.7,462H462v-58.9H167.7V462z M167.7,226.6H462v-58.9H167.7V226.6z"></path></svg></button><input type="search" placeholder="Search" class="search"></div></div></nav><section class="container"><article id="icons" class="section"><div class="docs"><a href="#icons" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icons">Icons</h1> +</title><meta charset="utf-8"><style>*{-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;border:0}body{padding:60px 0 40px;background-color:hsl(207,10%,90%);color:hsl(207,5%,30%)}.container{max-width:1300px;margin:0 auto;padding:0 20px}.section{position:relative;margin-bottom:20px}.docs{position:relative;z-index:2;width:68%;min-height:200px;background-color:hsl(207,0%,100%);background-clip:padding-box;border:1px solid hsla(207,5%,5%,.1);border-radius:5px;box-shadow:0 0 3px hsla(207,5%,5%,.1)}.code{position:absolute;top:5px;bottom:5px;right:0;z-index:1;width:33%;padding:10px 10px 10px 20px;border-radius:0 5px 5px 0;border:1px solid hsla(207,20%,10%,.1);background-color:hsla(207,20%,95%,.9);background-clip:padding-box;opacity:.5;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.code:hover{opacity:1}.preview{background:hsl(207,0%,100%);border-top:1px solid hsl(207,30%,95%);position:relative;z-index:1}.preview-code+.preview{margin-top:0;border-top:0}.preview iframe{display:block;width:100%;height:100%;overflow:hidden}.preview-code{position:relative;z-index:2;display:block;width:100%;color:hsl(207,9%,37%);max-height:200px;padding:10px 20px;overflow-y:auto;background:hsl(207,30%,95%);border:1px solid hsl(207,30%,85%);border-left:0;border-right;box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1);line-height:1.1!important;resize:none}.preview-code:focus{outline:0;background:hsl(207,30%,97%);box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1),0 0 5px hsla(207,75%,75%,.9)}.preview-code:last-child{border-bottom:0;border-radius:0 0 5px 5px}.resizeable{padding:15px;overflow:auto;background:hsl(207,0%,100%);box-shadow:0 0 2px hsla(207,10%,20%,.2);resize:both}.preview-code,pre{white-space:pre-wrap;word-wrap:break-word;overflow-y:auto}.code pre{height:100%;margin-top:0}.bar{position:fixed;left:0;right:0;z-index:1010;min-height:40px;line-height:40px;background-image:-webkit-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-moz-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-o-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92))}.bar.top{top:0;box-shadow:0 1px 2px hsla(207,5%,0%,.2)}.bar.bottom{bottom:0;box-shadow:0 -1px 2px hsla(207,5%,0%,.2)}.bar ul{margin:0!important}.bar li{display:block;list-style:none}.bar .icon path{fill:hsla(27,10%,75%,.75)}.docs .icon path{fill:hsla(207,10%,75%,.5)}.docs .permalink:hover .icon path{fill:hsl(207,10%,75%)}.bar button{color:hsla(27,10%,75%,.75)}.bar button:hover .icon path,.bar button.is-active .icon path{fill:hsl(27,10%,85%)}.bar button:hover,.bar button.is-active{color:hsl(27,10%,85%)}.bar .icon{vertical-align:middle;display:inline-block}.bar,.bar a,.bar a:visited{color:hsl(27,10%,85%);text-shadow:1px 1px 0 hsla(27,5%,0%,.5)}.bar a:hover,.bar a.is-active{color:hsl(27,10%,95%);text-shadow:1px 1px 0 hsla(27,5%,0%,1);text-decoration:none}.brand{float:left;margin-right:20px;font-weight:700;font-size:16px;text-decoration:none}.brand,a.brand,a.brand:visited{color:hsl(27,5%,5%);text-shadow:1px 1px 0 hsla(27,5%,100%,.2)}.brand:hover,a.brand:hover{color:hsl(27,5%,0%);text-shadow:1px 1px 0 hsla(27,5%,100%,.3);text-decoration:none}.menu{font-size:12px}.menu>li{float:left;position:relative}.menu a{display:block;margin-right:15px}.dropdown-toggle{position:relative;padding-right:15px}.dropdown-toggle:after{display:block;position:absolute;right:0;top:18px;content:'';border:4px solid;border-left-color:transparent;border-right-color:transparent;border-bottom-color:transparent}.nav-results,.dropdown{position:absolute;z-index:1020;top:32px;left:-16px;width:175px;max-height:500px;padding:10px 0;overflow-y:auto;word-wrap:break-word;font-size:11px;line-height:20px;background-color:hsla(207,10%,25%,.97);border:1px solid hsla(207,5%,70%,.3);border-radius:3px;box-shadow:0 0 3px hsla(207,5%,0%,.2)}.toc-list{width:200px}.nav-results{right:0;width:200px;left:auto;padding:5px 0}.nav-results-filename{display:block;font-size:10px;opacity:.75}.nav-results a{display:block;line-height:15px;padding:5px 10px}.nav-results li:not([hidden])~li a{border-top:1px solid hsla(27,10%,90%,.1)}.dropdown a{padding:0 15px}.dropdown li:hover{background-color:hsl(207,10%,22%)}.nav{float:right;position:relative}.nav input[type="search"]{padding:2px 4px;color:#fff;width:150px;border:1px solid hsla(207,5%,0%,.3);background:hsla(207,12%,40%,.9);box-shadow:inset 1px 1px 3px hsla(207,5%,0%,.05),1px 1px 0 hsla(207,5%,100%,.05);border-radius:10px;-webkit-appearance:textfield}.nav input[type="search"]:focus{outline:0;background:hsla(207,7%,45%,.9)}.settings{text-align:center}.bar button{display:inline-block;vertical-align:middle;padding:0 5px;margin:0 3px;background:transparent}.bar button:first-child{margin-left:0}.settings .auto{line-height:32px;font-size:11px;font-weight:700;letter-spacing:-1px;text-shadow:none;text-transform:uppercase}body{font-family:sans-serif;font-size:14px;line-height:1.618}.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-left:20px;margin-right:20px}.preview,.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-top:10px}ul ul,ol ol,ul ol,ol ul,blockquote p:last-child{margin-top:0}ul,ol{padding-left:1.5em}p:last-child,ol:last-child,ul:last-child,dl:last-child{margin-bottom:20px}hr,h1,h2,h3,h4,h5,h6{margin:1em 20px .5em}h1:first-of-type{margin-top:20px}h1,h2,h3,h4,h5,h6{line-height:1.2;color:hsl(207,10%,50%)}h1 a,h1 a:hover,h1 a:visited{color:inherit;text-decoration:inherit}h1{font-size:3.052em;font-weight:400;color:hsl(207,10%,45%)}h2{font-size:1.953em}h3{font-size:1.536em}h1,h2,h3{letter-spacing:-.025em}h4{font-size:1.25em}h5{font-size:1em;text-transform:uppercase}h6{font-size:1em}.permalink{position:absolute;top:15px;right:15px}a{color:hsl(207,90%,50%);text-decoration:none}a:hover{color:hsl(207,95%,40%);text-decoration:underline}a:visited{color:hsl(207,100%,35%)}.preview-code,pre,code,var{font-style:normal;font-family:"Ubuntu Mono","Andale Mono","DejaVu Sans Mono","Monaco","Bitstream Vera Sans Mono","Consolas","Lucida Console",monospace;font-size:12px}.docs pre,code,var{padding:.1em 3px;background:hsla(207,5%,0%,.025);border:1px solid hsla(207,5%,0%,.05);border-radius:3px}.code pre{line-height:1.1!important}pre code{padding:0;background:transparent;border:0}.cf:before,.cf:after{content:'';display:table}.cf:after{clear:both}[unselectable="on"]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[hidden]{display:none!important}small{font-size:85%;opacity:.9}.docs .vars_list{width:100%}.docs .vars_list th,.docs .vars_list td{width:33%}.docs pre th{text-align:left}.docs pre table{border-collapse:collapse;margin:0}.docs th,.docs td{border:0;padding:9px 10px 9px 0;vertical-align:top}.docs tr th:last-child,.docs tr td:last-child{padding-right:0}.docs pre th{font-weight:400}.docs pre th.vars_head{border-bottom:1px solid #e5e5e5;color:#707070;white-space:nowrap}.docs pre th.vars_section{border-bottom:1px solid #e5e5e5;color:#333;font-size:18px;padding-top:30px}.vars_value{color:#338bb8}.docs li p{margin:0 0 20px}.dropdown a{text-transform:capitalize}#default-button #default-button-big+.preview+.preview-code{display:block}#actions-toolbar-alignment .preview-code,#reverse-primary-and-secondary-blocks .preview-code,#actions-toolbar-indents-customizations .preview-code,#actionstoolbarclearfloats-mixin .preview-code,#responsive-actions-toolbar .preview-code,#button-with-gradient-background .preview-code,#primary-button .preview-code,#button-as-an-icon .preview-code,#button-with-an-icon-on-the-left-or-right-side-of-the-text .preview-code,#button-with-fixed-width .preview-code,#button-as-a-link .preview-code,#link-as-a-button .preview-code,#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol .preview-code,#breadcrumbs-with-solid-background .preview-code,#pagination-without-label-with-solid-background .preview-code,#pagination-with-label-and-text-previousnext-links .preview-code,#pagination-with-label-and-gradient-background-on-links .preview-code,#fixed-height-popup .preview-code,#fixed-content-height-popup .preview-code,#margins-for-header-content-and-footer-block-in-popup .preview-code,#popup-titles-with-styled-as-theme-headings .preview-code,#popup-action-toolbar .preview-code,#popup-close-button-without-an-icon .preview-code,#modify-icon-of-popup-close-button .preview-code,#modify-overlay-styles .preview-code,#rating-summary-multiple-ratings .preview-code,#rating-summary-hide-label .preview-code,#rating-summary-icons-symbol .preview-code,#rating-summary-icons-color .preview-code,#rating-summary-set-number-of-icons .preview-code,#rating-summary .preview-code,#rating-with-vote-icon-symbol .preview-code,#rating-with-vote-setup-icons-colors .preview-code,#rating-with-vote-setup-number-of-icons .preview-code,#tabs-with-content-top-border .preview-code,#accordion-mixin-variables .preview-code,#tabs-base .preview-code,#accordion-base .preview-code,#warning-message .preview-code,#error-message .preview-code,#success-message .preview-code,#notice-message .preview-code,#message-with-inner-icon .preview-code,#message-with-lateral-icon .preview-code,#custom-message-style .preview-code,#modify-dropdown-list-styles .preview-code,#dropdown-with-icon-customization .preview-code,#split-button-button-styling .preview-code,#split-button-icon-customization .preview-code,#split-button-dropdown-list-customization .preview-code,#table-cells-resize .preview-code,#table-caption .preview-code,#table-typography .preview-code,#table-background-customization .preview-code,#table-borders-customization .preview-code,#table-without-borders .preview-code,#table-with-horizontal-borders .preview-code,#table-with-vertical-borders .preview-code,#striped-table .preview-code,#responsive-table-technics-1 .preview-code,#responsive-table-technics-2 .preview-code,#fontsize-mixin .preview-code,#word-breaking-mixin .preview-code,#word-breaking-mixin .preview-code,#text-overflow-mixin .preview-code,#text-hide .preview-code,#hyphens .preview-code,#font-style-and-color .preview-code,#reset-list-styles .preview-code,#inlineblock-list-item-styling .preview-code,#link-styling-mixin .preview-code,#heading-styling-mixin .preview-code,#icon-with-image-or-sprite .preview-code,#change-the-size-of-font-icon .preview-code,#sprite-and-font-icons-for-blank-theme .preview-code,#icon-position-for-an-icon-with-image-or-sprite .preview-code{display:none}article[id$="-variables"] .docs,#resets .docs,#ratings .docs,#tabs-and-accordions .docs,#messages .docs,#dropdown-and-split-buttons-mixins .docs,#font-face-mixin .docs,#layout .docs,#forms-mixins .docs,#including-magento-ui-library-to-your-theme .docs,#global-forms-elements-customization .docs,#mobile-off-canvas-navigation .docs,#desktop-navigation .docs,#utilities .docs,#layout-width .docs,#responsive-breakpoints .docs,#responsive-mixins-usage .docs{width:100%}article[id$="-variables"] .code{display:none}article[id$="-variables"] .docs pre{background:#fff;border:0;margin-top:0}</style><script type="text/preview">(function(){"use strict";var a=function(a){return Array.prototype.slice.call(a)},b=document.getElementsByTagName("body")[0],c=["link","visited","hover","active","focus","target","enabled","disabled","checked"],d=new RegExp(":(("+c.join(")|(")+"))","gi"),e=a(document.styleSheets).map(function(b){return a(b.cssRules).filter(function(a){return a.selectorText&&a.selectorText.match(d)}).map(function(a){return a.cssText.replace(d,".\\3A $1")}).join("")}).join("");if(e.length){var f=document.createElement("style");f.innerText=e;var g=document.getElementsByTagName("style")[0];g.parentNode.insertBefore(f,g)}var h=function(){var a=window.getComputedStyle(b,null);return function(){if(b.childElementCount===0)return b.offsetHeight;var c=b.getElementsByTagName("*"),d=[];for(var e=0,f=c.length;e<f;e++)d.push(c[e].offsetTop+c[e].offsetHeight+parseInt(window.getComputedStyle(c[e],null).getPropertyValue("margin-bottom")));var g=Math.max.apply(Math,d);return g+=parseInt(a.getPropertyValue("padding-bottom"),10),Math.max(g,b.offsetHeight)}}(),i={getHeight:function(){window.parent.postMessage({height:h()},"*")}};window.addEventListener("message",function(a){if(a.data==null)return;typeof a.data=="string"&&i[a.data]()},!1)})()</script><style type="text/preview">.actions-toolbar:before,.actions-toolbar:after{content:"";display:table}.actions-toolbar:after{clear:both}.actions-toolbar .primary{float:left}.actions-toolbar .secondary{float:right}.actions-toolbar .primary,.actions-toolbar .secondary{display:inline-block}.actions-toolbar .primary a.action,.actions-toolbar .secondary a.action{display:inline-block}.actions-toolbar .primary .action{margin:0 5px 0 0}.actions-toolbar .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-2:before,.example-actions-toolbar-2:after{content:"";display:table}.example-actions-toolbar-2:after{clear:both}.example-actions-toolbar-2 .primary{float:left}.example-actions-toolbar-2 .secondary{float:right}.example-actions-toolbar-2 .primary,.example-actions-toolbar-2 .secondary{display:inline-block}.example-actions-toolbar-2 .primary a.action,.example-actions-toolbar-2 .secondary a.action{display:inline-block}.example-actions-toolbar-2 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-2 .secondary a.action{margin-top:6px}.example-actions-toolbar-3{text-align:left}.example-actions-toolbar-3:before,.example-actions-toolbar-3:after{content:"";display:table}.example-actions-toolbar-3:after{clear:both}.example-actions-toolbar-3 .primary{float:left}.example-actions-toolbar-3 .primary,.example-actions-toolbar-3 .secondary{display:inline-block}.example-actions-toolbar-3 .primary a.action,.example-actions-toolbar-3 .secondary a.action{display:inline-block}.example-actions-toolbar-3 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-3 .secondary a.action{margin-top:6px}.example-actions-toolbar-4{text-align:right}.example-actions-toolbar-4:before,.example-actions-toolbar-4:after{content:"";display:table}.example-actions-toolbar-4:after{clear:both}.example-actions-toolbar-4 .secondary{float:right}.example-actions-toolbar-4 .primary,.example-actions-toolbar-4 .secondary{display:inline-block}.example-actions-toolbar-4 .primary a.action,.example-actions-toolbar-4 .secondary a.action{display:inline-block}.example-actions-toolbar-4 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-4 .secondary a.action{margin-top:6px}.example-actions-toolbar-5{text-align:center}.example-actions-toolbar-5:before,.example-actions-toolbar-5:after{content:"";display:table}.example-actions-toolbar-5:after{clear:both}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{vertical-align:top}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{display:inline-block}.example-actions-toolbar-5 .primary a.action,.example-actions-toolbar-5 .secondary a.action{display:inline-block}.example-actions-toolbar-5 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-5 .secondary a.action{margin-top:6px}.example-actions-toolbar-6:before,.example-actions-toolbar-6:after{content:"";display:table}.example-actions-toolbar-6:after{clear:both}.example-actions-toolbar-6 .primary{float:right}.example-actions-toolbar-6 .secondary{float:left}.example-actions-toolbar-6 .primary,.example-actions-toolbar-6 .secondary{display:inline-block}.example-actions-toolbar-6 .primary a.action,.example-actions-toolbar-6 .secondary a.action{display:inline-block}.example-actions-toolbar-6 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-6 .secondary a.action{margin-top:6px}.example-actions-toolbar-7{text-align:left}.example-actions-toolbar-7:before,.example-actions-toolbar-7:after{content:"";display:table}.example-actions-toolbar-7:after{clear:both}.example-actions-toolbar-7 .secondary{float:left}.example-actions-toolbar-7 .primary,.example-actions-toolbar-7 .secondary{display:inline-block}.example-actions-toolbar-7 .primary a.action,.example-actions-toolbar-7 .secondary a.action{display:inline-block}.example-actions-toolbar-7 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-7 .secondary a.action{margin-top:6px}.example-actions-toolbar-8{text-align:right}.example-actions-toolbar-8:before,.example-actions-toolbar-8:after{content:"";display:table}.example-actions-toolbar-8:after{clear:both}.example-actions-toolbar-8 .primary{float:right}.example-actions-toolbar-8 .primary,.example-actions-toolbar-8 .secondary{display:inline-block}.example-actions-toolbar-8 .primary a.action,.example-actions-toolbar-8 .secondary a.action{display:inline-block}.example-actions-toolbar-8 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-8 .secondary a.action{margin-top:6px}.example-actions-toolbar-9{margin:10px;padding:10px}.example-actions-toolbar-9:before,.example-actions-toolbar-9:after{content:"";display:table}.example-actions-toolbar-9:after{clear:both}.example-actions-toolbar-9 .primary{float:left}.example-actions-toolbar-9 .secondary{float:right}.example-actions-toolbar-9 .primary,.example-actions-toolbar-9 .secondary{display:inline-block}.example-actions-toolbar-9 .primary a.action,.example-actions-toolbar-9 .secondary a.action{display:inline-block}.example-actions-toolbar-9 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-9 .secondary a.action{margin-top:6px}.example-actions-toolbar-10{text-align:left}.example-actions-toolbar-10:before,.example-actions-toolbar-10:after{content:"";display:table}.example-actions-toolbar-10:after{clear:both}.example-actions-toolbar-10 .primary{float:left}.example-actions-toolbar-10 .primary,.example-actions-toolbar-10 .secondary{display:inline-block}.example-actions-toolbar-10 .primary a.action,.example-actions-toolbar-10 .secondary a.action{display:inline-block}.example-actions-toolbar-10 .primary .action{margin:0 50px 0 0}.example-actions-toolbar-10 .secondary a.action{margin-top:6px}.example-actions-toolbar-11{text-align:left}.example-actions-toolbar-11:before,.example-actions-toolbar-11:after{content:"";display:table}.example-actions-toolbar-11:after{clear:both}.example-actions-toolbar-11 .primary{float:left}.example-actions-toolbar-11 .primary,.example-actions-toolbar-11 .secondary{display:inline-block}.example-actions-toolbar-11 .primary a.action,.example-actions-toolbar-11 .secondary a.action{display:inline-block}.example-actions-toolbar-11 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-11 .secondary .action{margin:0 50px 0 0}.example-actions-toolbar-11 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}@media only screen and (max-width: 768px){.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{ display:block;float:none}}.example-breadcrumbs-1{margin:0 0 20px}.example-breadcrumbs-1 .items{font-size:1.2rem;color:#a3a3a3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-1 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-1 .item{margin:0}.example-breadcrumbs-1 a{color:#333;text-decoration:none}.example-breadcrumbs-1 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-1 a:hover{color:#333;text-decoration:underline}.example-breadcrumbs-1 a:active{color:#333;text-decoration:none}.example-breadcrumbs-1 strong{font-weight:400}.example-breadcrumbs-1 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-1 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-2{margin:0 0 20px}.example-breadcrumbs-2 .items{font-size:1.2rem;color:#1979c3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-2 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-2 .item{margin:0}.example-breadcrumbs-2 a{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #ccc;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-2 a:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 strong{background-color:#ff5501;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f7b32e 0, #ff5501 100%);background-image:linear-gradient(to bottom, #f7b32e 0, #ff5501 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7b32e', endColorstr='#ff5501', GradientType=0);border:1px solid #d04b0a;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-2 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-2 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3{margin:0 0 20px}.example-breadcrumbs-3 .items{font-size:1.2rem;color:#333;margin:0;padding:0;list-style:none none}.example-breadcrumbs-3 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-3 .item{margin:0}.example-breadcrumbs-3 a{background:#f4f4f4;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-3 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-3 a:hover{background:#ccc;color:#333;text-decoration:none}.example-breadcrumbs-3 a:active{color:#333;text-decoration:none}.example-breadcrumbs-3 strong{background:#e7e7e7;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-3 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-3 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3 .item a{position:relative;margin:0 11px 0 0}.example-breadcrumbs-3 .item a:after{border:12px solid transparent;height:0;width:0;border-left-color:#f4f4f4;content:"";position:absolute;display:block;top:0;right:-23px}.example-breadcrumbs-3 .item a:hover:after{border-color:transparent transparent transparent #ccc}button{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}button:focus,button:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}button:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}button.disabled,button[disabled],fieldset[disabled] button{cursor:default;pointer-events:none;opacity:.5}button:active,button:focus{box-shadow:inset 0 2px 1px rgba(0,0,0,.12)}.example-button-1.example-button-2{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-button-1.example-button-3{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;border-radius:0;color:#000}.example-button-1.example-button-3:hover,.example-button-1.example-button-3.active{color:#000}.example-button-10{background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-10>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-button-10:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-10:hover:before{color:inherit}.example-button-10:active:before{color:inherit}.example-button-10:focus,.example-button-10:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-10:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:default;pointer-events:none;opacity:.5}.example-button-10:focus,.example-button-10:active{background:0;border:0}.example-button-10:hover{background:0;border:0}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-11{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-11:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-11:hover:before{color:inherit}.example-button-11:active:before{color:inherit}.example-button-11:focus,.example-button-11:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-11:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-11.disabled,.example-button-11[disabled],fieldset[disabled] .example-button-11{cursor:default;pointer-events:none;opacity:.5}.example-button-12{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-12:after{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-12:hover:after{color:inherit}.example-button-12:active:after{color:inherit}.example-button-12:focus,.example-button-12:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-12:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-12.disabled,.example-button-12[disabled],fieldset[disabled] .example-button-12{cursor:default;pointer-events:none;opacity:.5}.example-button-13{background-image:none;background:#f2f2f2;padding:7px 15px;width:100px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-13:focus,.example-button-13:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-13:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-13.disabled,.example-button-13[disabled],fieldset[disabled] .example-button-13{cursor:default;pointer-events:none;opacity:.5}.example-button-4{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-4:focus,.example-button-4:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4.disabled,.example-button-4[disabled],fieldset[disabled] .example-button-4{cursor:default;pointer-events:none;opacity:.5}.example-button-4:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-4.example-button-5{line-height:2.2rem;padding:7px 35px;font-size:1.8rem}.example-button-4.example-button-6{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;color:#fff}.example-button-4.example-button-6:hover,.example-button-4.example-button-6.active{color:#fff}.example-button-7{background-image:none;background:#f2f2f2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #1979c3 0, #006bb4 100%);background-image:linear-gradient(to bottom, #1979c3 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1979c3', endColorstr='#006bb4', GradientType=0);padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}.example-button-7:focus,.example-button-7:active{background:#e2e2e2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #006bb4 100%);background-image:linear-gradient(to bottom, #006bb4 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#006bb4', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7:hover{background:#e2e2e2;background-color:#1979c3;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #1979c3 100%);background-image:linear-gradient(to bottom, #006bb4 0, #1979c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#1979c3', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7.disabled,.example-button-7[disabled],fieldset[disabled] .example-button-7{cursor:default;pointer-events:none;opacity:.5}.example-button-7:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-8{background:0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;font-weight:400}.example-button-8:visited{color:#1979c3;text-decoration:none}.example-button-8:hover{color:#006bb4;text-decoration:underline}.example-button-8:active{color:#ff5501;text-decoration:underline}.example-button-8:hover{color:#006bb4}.example-button-8:hover,.example-button-8:active,.example-button-8:focus{background:0;border:0}.example-button-8.disabled,.example-button-8[disabled],fieldset[disabled] .example-button-8{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.example-button-8:active{box-shadow:none}.example-button-9{text-decoration:none;background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:0;vertical-align:middle;margin:3px;border-radius:3px;font-weight:700}.example-button-9:hover,.example-button-9:active,.example-button-9:focus{text-decoration:none}.example-button-9:focus,.example-button-9:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-9:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-9.disabled,.example-button-9[disabled],fieldset[disabled] .example-button-9{cursor:default;pointer-events:none;opacity:.5}.example-button-9:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-14{background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-14:focus,.example-button-14:active{background:0;border:0}.example-button-14:hover{background:0;border:0}.example-button-14.disabled,.example-button-14[disabled],fieldset[disabled] .example-button-14{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-15{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;vertical-align:middle;background:#f2f2f2;color:#333;border:1px solid #cdcdcd}.example-button-15:focus,.example-button-15:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15.disabled,.example-button-15[disabled],fieldset[disabled] .example-button-15{cursor:default;pointer-events:none;opacity:.5}.example-button-15:focus,.example-button-15:active{background:#e2e2e2;color:#333;border:1px solid #cdcdcd}.example-button-15:hover{background:#e2e2e2;color:#555;border:1px solid #cdcdcd}.example-button-17{line-height:2.2rem;padding:14px 17px;font-size:1.8rem;font-size:1.4rem;line-height:1.6rem;padding:7px 15px}.example-button-18{font-size:1rem;line-height:1.2rem;padding:4px 10px}.example-dropdown-1{display:inline-block;position:relative}.example-dropdown-1:before,.example-dropdown-1:after{content:"";display:table}.example-dropdown-1:after{clear:both}.example-dropdown-1 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle:hover:after{color:inherit}.example-dropdown-1 .action.toggle:active:after{color:inherit}.example-dropdown-1 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle.active:hover:after{color:inherit}.example-dropdown-1 .action.toggle.active:active:after{color:inherit}.example-dropdown-1 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-1 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-1 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-1 ul.dropdown:before,.example-dropdown-1 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-1 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-1 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-1 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-1 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-1.active{overflow:visible}.example-dropdown-1.active ul.dropdown{display:block}.example-dropdown-2{display:inline-block;position:relative}.example-dropdown-2:before,.example-dropdown-2:after{content:"";display:table}.example-dropdown-2:after{clear:both}.example-dropdown-2 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle:hover:after{color:inherit}.example-dropdown-2 .action.toggle:active:after{color:inherit}.example-dropdown-2 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle.active:hover:after{color:inherit}.example-dropdown-2 .action.toggle.active:active:after{color:inherit}.example-dropdown-2 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-2 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-2 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-2 ul.dropdown:before,.example-dropdown-2 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-2 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-2 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-2 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-2 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-2.active{overflow:visible}.example-dropdown-2.active ul.dropdown{display:block}.example-dropdown-3{display:inline-block;position:relative}.example-dropdown-3:before,.example-dropdown-3:after{content:"";display:table}.example-dropdown-3:after{clear:both}.example-dropdown-3 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle:hover:before{color:red}.example-dropdown-3 .action.toggle:active:before{color:inherit}.example-dropdown-3 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle.active:hover:before{color:red}.example-dropdown-3 .action.toggle.active:active:before{color:inherit}.example-dropdown-3 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-3 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-3 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-3 ul.dropdown:before,.example-dropdown-3 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-3 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-3 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-3 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-3 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-3.active{overflow:visible}.example-dropdown-3.active ul.dropdown{display:block}.example-dropdown-5{display:inline-block;position:relative}.example-dropdown-5:before,.example-dropdown-5:after{content:"";display:table}.example-dropdown-5:after{clear:both}.example-dropdown-5 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle:hover:after{color:inherit}.example-dropdown-5 .action.toggle:active:after{color:inherit}.example-dropdown-5 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle.active:hover:after{color:inherit}.example-dropdown-5 .action.toggle.active:active:after{color:inherit}.example-dropdown-5 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-5 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-5 ul.dropdown li:first-child{border:0}.example-dropdown-5 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-5.active{overflow:visible}.example-dropdown-5.active ul.dropdown{display:block}.example-dropdown-6{display:inline-block;position:relative}.example-dropdown-6:before,.example-dropdown-6:after{content:"";display:table}.example-dropdown-6:after{clear:both}.example-dropdown-6 .action.split{float:left;margin:0}.example-dropdown-6 .action.toggle{float:right;margin:0}.example-dropdown-6 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-6 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-6 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle:hover:after{color:inherit}.example-dropdown-6 .action.toggle:active:after{color:inherit}.example-dropdown-6 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle.active:hover:after{color:inherit}.example-dropdown-6 .action.toggle.active:active:after{color:inherit}.example-dropdown-6 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-6 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-6 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-6 ul.dropdown:before,.example-dropdown-6 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-6 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-6 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-6 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-6 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-6.active{overflow:visible}.example-dropdown-6.active ul.dropdown{display:block}.split.example-dropdown-7{display:inline-block;position:relative}.split.example-dropdown-7:before,.split.example-dropdown-7:after{content:"";display:table}.split.example-dropdown-7:after{clear:both}.split.example-dropdown-7 .action.split{float:left;margin:0}.split.example-dropdown-7 .action.toggle{float:right;margin:0}.split.example-dropdown-7 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle:active:after{color:inherit}.split.example-dropdown-7 .action.toggle.active{display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle.active:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle.active:active:after{color:inherit}.split.example-dropdown-7 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.split.example-dropdown-7 ul.dropdown li{margin:0;padding:3px 5px}.split.example-dropdown-7 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.split.example-dropdown-7 ul.dropdown:before,.split.example-dropdown-7 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.split.example-dropdown-7 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.split.example-dropdown-7 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.split.example-dropdown-7 ul.dropdown:before{top:-12px;right:10px}.split.example-dropdown-7 ul.dropdown:after{top:-14px;right:9px}.split.example-dropdown-7.active{overflow:visible}.split.example-dropdown-7.active ul.dropdown{display:block}.example-dropdown-8{display:inline-block;position:relative}.example-dropdown-8:before,.example-dropdown-8:after{content:"";display:table}.example-dropdown-8:after{clear:both}.example-dropdown-8 .action.split{float:left;margin:0}.example-dropdown-8 .action.toggle{float:right;margin:0}.example-dropdown-8 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-8 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-8 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle:hover:after{color:inherit}.example-dropdown-8 .action.toggle:active:after{color:inherit}.example-dropdown-8 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle.active:hover:after{color:inherit}.example-dropdown-8 .action.toggle.active:active:after{color:inherit}.example-dropdown-8 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-8 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-8 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-8 ul.dropdown:before,.example-dropdown-8 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-8 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-8 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-8 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-8 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-8.active{overflow:visible}.example-dropdown-8.active ul.dropdown{display:block}.example-dropdown-9{display:inline-block;position:relative}.example-dropdown-9 .action.split,.example-dropdown-9 .action.toggle{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-dropdown-9:before,.example-dropdown-9:after{content:"";display:table}.example-dropdown-9:after{clear:both}.example-dropdown-9 .action.split{float:left;margin:0}.example-dropdown-9 .action.toggle{float:right;margin:0}.example-dropdown-9 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-9 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-9 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle:hover:after{color:inherit}.example-dropdown-9 .action.toggle:active:after{color:inherit}.example-dropdown-9 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle.active:hover:after{color:inherit}.example-dropdown-9 .action.toggle.active:active:after{color:inherit}.example-dropdown-9 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-9 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-9 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-9 ul.dropdown:before,.example-dropdown-9 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-9 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-9 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-9 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-9 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-9.active{overflow:visible}.example-dropdown-9.active ul.dropdown{display:block}.example-dropdown-10{display:inline-block;position:relative}.example-dropdown-10 .action.split,.example-dropdown-10 .action.toggle{line-height:1.2rem;padding:5px 8px;font-size:1.1rem}.example-dropdown-10:before,.example-dropdown-10:after{content:"";display:table}.example-dropdown-10:after{clear:both}.example-dropdown-10 .action.split{float:left;margin:0}.example-dropdown-10 .action.toggle{float:right;margin:0}.example-dropdown-10 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-10 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-10 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle:hover:after{color:inherit}.example-dropdown-10 .action.toggle:active:after{color:inherit}.example-dropdown-10 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle.active:hover:after{color:inherit}.example-dropdown-10 .action.toggle.active:active:after{color:inherit}.example-dropdown-10 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-10 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-10 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-10 ul.dropdown:before,.example-dropdown-10 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-10 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-10 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-10 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-10 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-10.active{overflow:visible}.example-dropdown-10.active ul.dropdown{display:block}.example-dropdown-11{display:inline-block;position:relative}.example-dropdown-11:before,.example-dropdown-11:after{content:"";display:table}.example-dropdown-11:after{clear:both}.example-dropdown-11 .action.split{float:right;margin:0}.example-dropdown-11 .action.toggle{float:left;margin:0}.example-dropdown-11 button.action.split{border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-11 button+.action.toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-11 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle:hover:before{color:red}.example-dropdown-11 .action.toggle:active:before{color:inherit}.example-dropdown-11 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle.active:hover:before{color:red}.example-dropdown-11 .action.toggle.active:active:before{color:inherit}.example-dropdown-11 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-11 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-11 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-11 ul.dropdown:before,.example-dropdown-11 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-11 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-11 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-11 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-11 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-11.active{overflow:visible}.example-dropdown-11.active ul.dropdown{display:block}.example-dropdown-12{display:inline-block;position:relative}.example-dropdown-12:before,.example-dropdown-12:after{content:"";display:table}.example-dropdown-12:after{clear:both}.example-dropdown-12 .action.split{float:left;margin:0}.example-dropdown-12 .action.toggle{float:right;margin:0}.example-dropdown-12 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-12 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-12 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle:hover:after{color:inherit}.example-dropdown-12 .action.toggle:active:after{color:inherit}.example-dropdown-12 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle.active:hover:after{color:inherit}.example-dropdown-12 .action.toggle.active:active:after{color:inherit}.example-dropdown-12 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-12 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-12 ul.dropdown li:first-child{border:0}.example-dropdown-12 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-12.active{overflow:visible}.example-dropdown-12.active ul.dropdown{display:block}.example-form-1 .example-form-1-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-1 .example-form-1-fieldset>*{letter-spacing:normal}.example-form-1 .example-form-1-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-1 .example-form-1-fieldset:after{content:attr(data-hasrequired);display:block;font-size:1.2rem;color:#e02b27;margin:10px 0 0;letter-spacing:normal;word-spacing:normal}.example-form-1 .example-form-1-fieldset>.field{margin:0 0 20px}.example-form-1 .example-form-1-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-1 .example-form-1-fieldset>.field:last-child{margin-bottom:0}.example-form-1 .example-form-1-fieldset>.field>.label{font-weight:700}.example-form-1 .example-form-1-fieldset>.field>.label+br{display:none}.example-form-1 .example-form-1-fieldset>.field .choice input{vertical-align:top}.example-form-1 .example-form-1-fieldset>.field .fields.group:before,.example-form-1 .example-form-1-fieldset>.field .fields.group:after{content:"";display:table}.example-form-1 .example-form-1-fieldset>.field .fields.group:after{clear:both}.example-form-1 .example-form-1-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-1 .example-form-1-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-1 .example-form-1-fieldset>.field .addon textarea,.example-form-1 .example-form-1-fieldset>.field .addon select,.example-form-1 .example-form-1-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;display:inline-block;margin:0;width:auto}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore,.example-form-1 .example-form-1-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:disabled,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-1 .example-form-1-fieldset>.field .additional{margin-top:10px}.example-form-1 .example-form-1-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-1 .example-form-1-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-1 .example-form-1-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-form-2 .example-form-2-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-2 .example-form-2-fieldset>*{letter-spacing:normal}.example-form-2 .example-form-2-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-2 .example-form-2-fieldset>.field{margin:0 0 20px;box-sizing:border-box;display:inline-block;padding:0 12px 0 0;width:50%;vertical-align:top}.example-form-2 .example-form-2-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-2 .example-form-2-fieldset>.field:last-child{margin-bottom:0}.example-form-2 .example-form-2-fieldset>.field+.fieldset{clear:both}.example-form-2 .example-form-2-fieldset>.field>.label{font-weight:700}.example-form-2 .example-form-2-fieldset>.field>.label+br{display:none}.example-form-2 .example-form-2-fieldset>.field .choice input{vertical-align:top}.example-form-2 .example-form-2-fieldset>.field .fields.group:before,.example-form-2 .example-form-2-fieldset>.field .fields.group:after{content:"";display:table}.example-form-2 .example-form-2-fieldset>.field .fields.group:after{clear:both}.example-form-2 .example-form-2-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-2 .example-form-2-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-2 .example-form-2-fieldset>.field .addon textarea,.example-form-2 .example-form-2-fieldset>.field .addon select,.example-form-2 .example-form-2-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;display:inline-block;margin:0;width:auto}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore,.example-form-2 .example-form-2-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:disabled,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-2 .example-form-2-fieldset>.field .additional{margin-top:10px}.example-form-2 .example-form-2-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-2 .example-form-2-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-2 .example-form-2-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}input[type="text"],input[type="password"],input[type="url"],input[type="tel"],input[type="search"],input[type="number"],input[type="datetime"],input[type="email"]{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}input[type="text"]:disabled,input[type="password"]:disabled,input[type="url"]:disabled,input[type="tel"]:disabled,input[type="search"]:disabled,input[type="number"]:disabled,input[type="datetime"]:disabled,input[type="email"]:disabled{opacity:.5}input[type="text"]::-moz-placeholder,input[type="password"]::-moz-placeholder,input[type="url"]::-moz-placeholder,input[type="tel"]::-moz-placeholder,input[type="search"]::-moz-placeholder,input[type="number"]::-moz-placeholder,input[type="datetime"]::-moz-placeholder,input[type="email"]::-moz-placeholder{color:#c2c2c2}input[type="text"]::-webkit-input-placeholder,input[type="password"]::-webkit-input-placeholder,input[type="url"]::-webkit-input-placeholder,input[type="tel"]::-webkit-input-placeholder,input[type="search"]::-webkit-input-placeholder,input[type="number"]::-webkit-input-placeholder,input[type="datetime"]::-webkit-input-placeholder,input[type="email"]::-webkit-input-placeholder{color:#c2c2c2}input[type="text"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder,input[type="url"]:-ms-input-placeholder,input[type="tel"]:-ms-input-placeholder,input[type="search"]:-ms-input-placeholder,input[type="number"]:-ms-input-placeholder,input[type="datetime"]:-ms-input-placeholder,input[type="email"]:-ms-input-placeholder{color:#c2c2c2}select{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:5px 10px 4px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}select:disabled{opacity:.5}select[multiple="multiple"]{height:auto;margin-bottom:20px}textarea{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:auto;width:100%;padding:10px;margin:0;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;resize:vertical}textarea:disabled{opacity:.5}textarea::-moz-placeholder{color:#c2c2c2}textarea::-webkit-input-placeholder{color:#c2c2c2}textarea:-ms-input-placeholder{color:#c2c2c2}input[type="checkbox"]{margin:2px 5px 0 0}input[type="checkbox"]:disabled{opacity:.5}input[type="radio"]{margin:2px 5px 0 0}input[type="radio"]:disabled{opacity:.5}input.text-example-1,select.select-example-1,textarea.textarea-example-1{background:#fdf0d5;border-color:#fc0;color:#b30000}input.text-example-1:focus,select.select-example-1:focus,textarea.textarea-example-1:focus{border-color:#cff;color:#060}input.text-example-1:disabled,select.select-example-1:disabled,textarea.textarea-example-1:disabled{color:#fcc}input.text-example-1::-moz-placeholder,textarea.textarea-example-1::-moz-placeholder{color:#ccc}input.text-example-1::-webkit-input-placeholder,textarea.textarea-example-1::-webkit-input-placeholder{color:#ccc}input.text-example-1:-ms-input-placeholder,textarea.textarea-example-1:-ms-input-placeholder{color:#ccc}.number-example{-moz-appearance:textfield}.number-example::-webkit-inner-spin-button,.number-example::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.search-example{-webkit-appearance:none}.search-example::-webkit-search-cancel-button,.search-example::-webkit-search-decoration,.search-example::-webkit-search-results-button,.search-example::-webkit-search-results-decoration{-webkit-appearance:none}input,textarea,select{font-size:1.2rem;color:#e02b27}.example-icon-1{display:inline-block}.example-icon-1:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-2{display:inline-block}.example-icon-2:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -26px 0}.example-icon-3{display:inline-block}.example-icon-3>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-3:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -156px -52px}.example-icon-4{display:inline-block;text-decoration:none}.example-icon-4:before{font-family:'icons-blank-theme';content:'\e606';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-5{display:inline-block;text-decoration:none}.example-icon-5:after{font-family:'icons-blank-theme';content:'\e605';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-6{display:inline-block;text-decoration:none}.example-icon-6>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-6:before{font-family:'icons-blank-theme';content:'\e61b';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-7{display:inline-block}.example-icon-7:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8{display:inline-block}.example-icon-8:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8:before{background-position:-182px 0}.example-icon-9{display:inline-block}.example-icon-9:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-9:after{background-position:-52px -26px}.example-icon-10{display:inline-block}.example-icon-10:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-10:before{background-position:-104px 0}.example-icon-11{display:inline-block}.example-icon-11:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-11:before{width:30px;height:30px}.example-icon-11:after{width:30px;height:30px}.example-icon-11:before{background-color:#f1f1f1}.example-icon-12{display:inline-block;text-decoration:none}.example-icon-12:before{font-family:'icons-blank-theme';content:'\e612';font-size:28px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13{display:inline-block;text-decoration:none}.example-icon-13:before{font-family:'icons-blank-theme';content:'\e612';font-size:inherit;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13:before{font-size:26px;line-height:inherit}.example-icon-14{display:inline-block;text-decoration:none}.example-icon-14:before{font-family:'icons-blank-theme';content:'\e61d';font-size:26px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-14>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.icons-image-list{list-style:none;padding:0}.icons-image-list li{float:left;width:33%}.icons-image-list li>span{display:inline-block}.icons-image-list li>span:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.icons-image-list li .icon-search:before{background-position:0 0}.icons-image-list li .icon-cart:before{background-position:-26px 0}.icons-image-list li .icon-arrow-down:before{background-position:-52px 0}.icons-image-list li .icon-arrow-up:before{background-position:-78px 0}.icons-image-list li .icon-grid:before{background-position:-104px 0}.icons-image-list li .icon-list:before{background-position:-130px 0}.icons-image-list li .icon-remove:before{background-position:-156px 0}.icons-image-list li .icon-star:before{background-position:-182px 0}.icons-image-list li .icon-pointer-down:before{background-position:-208px 0}.icons-image-list li .icon-pointer-up:before{background-position:-234px 0}.icons-image-list li .icon-pointer-left:before{background-position:-260px 0}.icons-image-list li .icon-pointer-right:before{background-position:-286px 0}.icons-image-list li .icon-compare-empty:before{background-position:0 -26px}.icons-image-list li .icon-compare-full:before{background-position:-26px -26px}.icons-image-list li .icon-wishlist-empty:before{background-position:-52px -26px}.icons-image-list li .icon-wishlist-full:before{background-position:-78px -26px}.icons-image-list li .icon-update:before{background-position:-104px -26px}.icons-image-list li .icon-collapse:before{background-position:-130px -26px}.icons-image-list li .icon-expand:before{background-position:-156px -26px}.icons-image-list li .icon-menu:before{background-position:-182px -26px}.icons-image-list li .icon-prev:before{background-position:-208px -26px}.icons-image-list li .icon-next:before{background-position:-234px -26px}.icons-image-list li .icon-settings:before{background-position:-260px -26px}.icons-image-list li .icon-info:before{background-position:-286px -26px}.icons-image-list li .icon-checkmark:before{background-position:0 -52px}.icons-image-list li .icon-calendar:before{background-position:-26px -52px}.icons-image-list li .icon-comment:before{background-position:-52px -52px}.icons-image-list li .icon-comment-reflected:before{background-position:-78px -52px}.icons-image-list li .icon-envelope:before{background-position:-104px -52px}.icons-image-list li .icon-warning:before{background-position:-130px -52px}.icons-image-list li .icon-trash:before{background-position:-156px -52px}.icons-image-list li .icon-flag:before{background-position:-182px -52px}.icons-image-list li .icon-location:before{background-position:-208px -52px}.icons-image-list li .icon-up:before{background-position:-234px -52px}.icons-image-list li .icon-down:before{background-position:-260px -52px}.icons-font-list{list-style:none;padding:0}.icons-font-list li{float:left;width:25%;margin-bottom:35px;text-align:center}.icons-font-list li>span{display:inline-block;text-decoration:none}.icons-font-list li>span:before{font-family:'icons-blank-theme';font-size:34px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.icons-font-list li>span:before{content:attr(data-icon);margin:0 auto;display:block}.loader{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.5);z-index:9999}.loader:before{border-radius:5px;background:transparent url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%;box-sizing:border-box;content:'';position:absolute;top:0;right:0;left:0;bottom:0;margin:auto;width:160px;height:160px}.loading{position:relative}.loading:before{content:'';position:absolute;left:0;top:0;right:0;bottom:0;background:rgba(255,255,255,.5) url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%}.example-message-info{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-info a{color:#1979c3}.example-message-info a:hover{color:#006bb4}.example-message-info a:active{color:#006bb4}.example-message-warning{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-warning a{color:#1979c3}.example-message-warning a:hover{color:#006bb4}.example-message-warning a:active{color:#006bb4}.example-message-error{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27}.example-message-error a{color:#1979c3}.example-message-error a:hover{color:#006bb4}.example-message-error a:active{color:#006bb4}.example-message-success{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400}.example-message-success a{color:#1979c3}.example-message-success a:hover{color:#006bb4}.example-message-success a:active{color:#006bb4}.example-message-notice{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-notice a{color:#1979c3}.example-message-notice a:hover{color:#006bb4}.example-message-notice a:active{color:#006bb4}.example-message-1{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400;position:relative;padding-left:40px}.example-message-1 a{color:#1979c3}.example-message-1 a:hover{color:#006bb4}.example-message-1 a:active{color:#006bb4}.example-message-1>:first-child:before{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#c07600;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:40px}.example-message-2{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27;position:relative;padding-right:40px}.example-message-2 a{color:#1979c3}.example-message-2 a:hover{color:#006bb4}.example-message-2 a:active{color:#006bb4}.example-message-2:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#b30000}.example-message-2>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-2>:first-child:after{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-2:before{right:0}.example-message-2>:first-child:before{border:5px solid transparent;height:0;width:0;border-right-color:#b30000;right:30px}.example-message-2>:first-child:after{right:0}.example-message-3{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400;position:relative;padding-left:40px}.example-message-3 a{color:#1979c3}.example-message-3 a:hover{color:#006bb4}.example-message-3 a:active{color:#006bb4}.example-message-3:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#006400}.example-message-3>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-3>:first-child:after{font-family:'icons-blank-theme';content:'\e610';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-3:before{left:0}.example-message-3>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#006400;left:30px}.example-message-3>:first-child:after{left:0}.example-message-4{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fc0;border-color:#ffa500;color:#000;position:relative;padding-left:40px;border-width:4px;border-radius:10px}.example-message-4 a{color:#00f}.example-message-4 a:hover{color:#009}.example-message-4 a:active{color:#006}.example-message-4:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#green}.example-message-4>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-4>:first-child:after{font-family:'icons-blank-theme';content:'\e606';font-size:28px;line-height:28px;color:#000;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:15px;left:0;text-align:center;width:30px}.example-message-4:before{left:0}.example-message-4>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#green;left:30px}.example-message-4>:first-child:after{left:0}header.header{background-color:rgba(255,0,0,.2)}.column.main{background-color:rgba(255,255,0,.2)}.column.left{background-color:rgba(0,255,255,.2)}.column.right{background-color:rgba(0,0,255,.2)}footer.footer{background-color:rgba(0,0,0,.2)}.columns{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.columns:after{content:" ";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.columns>.column{padding-bottom:40px}@media (min-width: 600px){.page-layout-1column .column.main{ width:100%;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-3columns .column.main{width:66.66666667%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-left .column.main{width:83.33333333%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.main{width:83.33333333%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-left .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-right .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.right{width:16.66666667%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.page-layout-2columns-left .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}}.layout-example-3 .column.main{width:60%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3 .column.left{width:20%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.layout-example-3-1 .column.main{width:60%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3-1 .column.left{width:20%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3-1 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.pages>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.pages .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.pages .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.pages a.page:visited{color:#1979c3}.pages a.page:hover{color:#006bb4;text-decoration:none}.pages a.page:active{color:#ff5501}.pages strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.pages .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.pages .action:visited{color:#7d7d7d}.pages .action:hover{color:#7d7d7d;text-decoration:none}.pages .action:active{color:#7d7d7d}.pages .action.next{display:inline-block;text-decoration:none}.pages .action.next:visited:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.next:hover:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.previous{display:inline-block;text-decoration:none}.pages .action.previous:visited:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.pages .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.previous:hover:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.example-pages-1>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-1>.label:after{content:':'}.example-pages-1 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-1 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 3px;display:inline-block}.example-pages-1 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 a.page{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #b3b3b3;color:#333;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-1 a.page:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#1979c3}.example-pages-1 a.page:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);border:1px solid #999;color:#333;text-decoration:none}.example-pages-1 a.page:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#ff5501}.example-pages-1 strong.page{background:#1979c3;border:1px solid #135d96;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#f7b32e;display:inline-block;font-weight:700;padding:0 4px}.example-pages-1 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-1 .action:visited{color:#7d7d7d}.example-pages-1 .action:hover{color:#ff5501;text-decoration:none}.example-pages-1 .action:active{color:#7d7d7d}.example-pages-1 .action.next{display:inline-block;text-decoration:none}.example-pages-1 .action.next:visited:before{color:#7d7d7d}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.next:hover:before{color:#ff5501}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.previous{display:inline-block;text-decoration:none}.example-pages-1 .action.previous:visited:before{color:#7d7d7d}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-1 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.previous:hover:before{color:#ff5501}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-2>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-2>.label:after{content:':'}.example-pages-2 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-2 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-2 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-2 a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-2 a.page:visited{color:#1979c3}.example-pages-2 a.page:hover{color:#006bb4;text-decoration:none}.example-pages-2 a.page:active{color:#ff5501}.example-pages-2 strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.example-pages-2 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-2 .action:visited{color:#7d7d7d}.example-pages-2 .action:hover{color:#7d7d7d;text-decoration:none}.example-pages-2 .action:active{color:#7d7d7d}.example-pages-3>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-3 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-3 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 a.page{background:#1979c3;color:#fff;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-3 a.page:visited{background:#1979c3;color:#fff}.example-pages-3 a.page:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 a.page:active{background:#ff5501;color:#fff}.example-pages-3 strong.page{background:#1979c3;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#fff;display:inline-block;font-weight:700;padding:0 4px}.example-pages-3 .action{background:#1979c3;border:1px solid #d1d1d1;color:#fff;display:inline-block;padding:0;text-decoration:none}.example-pages-3 .action:visited{background:#1979c3;color:#7d7d7d}.example-pages-3 .action:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 .action:active{background:#ff5501;color:#fff}.example-pages-3 .action.next{display:inline-block;text-decoration:none}.example-pages-3 .action.next:visited:before{color:#7d7d7d}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.next:hover:before{color:#fff}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.previous{display:inline-block;text-decoration:none}.example-pages-3 .action.previous:visited:before{color:#7d7d7d}.example-pages-3 .action.previous:active:before{color:#fff}.example-pages-3 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.previous:hover:before{color:#fff}.example-pages-3 .action.previous:active:before{color:#fff}.window.popup.popup-example{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:focus,.window.popup.popup-example .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example .popup-actions .action.close.disabled,.window.popup.popup-example .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example.active{opacity:1}.window.popup.popup-example-1{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-1 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-1 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-1 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-1 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-1 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-1 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:focus,.window.popup.popup-example-1 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close.disabled,.window.popup.popup-example-1 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-1 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-1.active{opacity:1}.window.overlay{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#000;z-index:1000;opacity:0}.window.overlay.active{opacity:.5;filter:alpha(opacity=50)}.window.popup.popup-example-2{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;overflow-y:auto;max-height:200px;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-2 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-2 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-2 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-2 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-2 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-2 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:focus,.window.popup.popup-example-2 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close.disabled,.window.popup.popup-example-2 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-2 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-2.active{opacity:1}.window.popup.popup-example-3{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-3 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-3 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-3 .popup-content{overflow-y:auto;max-height:200px}.window.popup.popup-example-3 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-3 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-3 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-3 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:focus,.window.popup.popup-example-3 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close.disabled,.window.popup.popup-example-3 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-3 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-3.active{opacity:1}.window.popup.popup-example-4{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-4 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-4 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-4 .popup-content{margin:0 0 20px}.window.popup.popup-example-4 .popup-footer{margin:0 20px}.window.popup.popup-example-4 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-4 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-4 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-4 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:focus,.window.popup.popup-example-4 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close.disabled,.window.popup.popup-example-4 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-4 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-4.active{opacity:1}.window.popup.popup-example-5{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-5 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-5 .popup-header .title{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.window.popup.popup-example-5 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-5 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-5 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-5 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:focus,.window.popup.popup-example-5 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close.disabled,.window.popup.popup-example-5 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-5 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-5.active{opacity:1}.window.popup.popup-example-6{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-6 .popup-footer .actions.toolbar{text-align:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar:before,.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{content:"";display:table}.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{clear:both}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{float:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary a.action,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary .action{margin:0 5px 0 0}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{margin-top:6px}.window.popup.popup-example-6 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-6 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-6 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-6 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-6 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-6 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:focus,.window.popup.popup-example-6 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close.disabled,.window.popup.popup-example-6 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-6 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-6.active{opacity:1}.window.popup.popup-example-7{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-7 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-7 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-7 .popup-actions .action.close{position:absolute;top:10px;right:10px}.window.popup.popup-example-7.active{opacity:1}.window.popup.popup-example-8{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-8 .popup-header{margin:0 0 25px;padding-right:30px}.window.popup.popup-example-8 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-8 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-8 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e613';font-size:30px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:0}.window.popup.popup-example-8 .popup-actions .action.close:hover:before{color:#090}.window.popup.popup-example-8 .popup-actions .action.close:active:before{color:#00f}.window.popup.popup-example-8 .popup-actions .action.close:focus,.window.popup.popup-example-8 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close.disabled,.window.popup.popup-example-8 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-8 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-8.active{opacity:1}.window.popup.popup-example-9{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-9 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-9 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-9 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-9 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-9 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-9 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:focus,.window.popup.popup-example-9 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close.disabled,.window.popup.popup-example-9 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-9 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-9.active{opacity:1}.window.overlay.example-overlay-1.active{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#0f5293;z-index:1000;opacity:0}.window.overlay.example-overlay-1.active.active{opacity:.8;filter:alpha(opacity=80)}.example-ratings-1{overflow:hidden}.example-ratings-1:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-1 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 input[type="radio"]:focus+label:before,.example-ratings-1 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-1 label{position:absolute;display:block;cursor:pointer}.example-ratings-1 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-1 label:hover:before{opacity:1}.example-ratings-1 label:hover~label:before{opacity:0}.example-ratings-1 .rating-5{z-index:2}.example-ratings-1 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-4{z-index:3}.example-ratings-1 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-3{z-index:4}.example-ratings-1 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-1 .rating-2{z-index:5}.example-ratings-1 .rating-2:before{content:'\e605' '\e605'}.example-ratings-1 .rating-1{z-index:6}.example-ratings-1 .rating-1:before{content:'\e605'}.example-ratings-2{overflow:hidden}.example-ratings-2:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-2 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 input[type="radio"]:focus+label:before,.example-ratings-2 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-2 label{position:absolute;display:block;cursor:pointer}.example-ratings-2 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-2 label:hover:before{opacity:1}.example-ratings-2 label:hover~label:before{opacity:0}.example-ratings-2 .rating-8{z-index:2}.example-ratings-2 .rating-8:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-7{z-index:3}.example-ratings-2 .rating-7:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-6{z-index:4}.example-ratings-2 .rating-6:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-5{z-index:5}.example-ratings-2 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-4{z-index:6}.example-ratings-2 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-3{z-index:7}.example-ratings-2 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-2 .rating-2{z-index:8}.example-ratings-2 .rating-2:before{content:'\e605' '\e605'}.example-ratings-2 .rating-1{z-index:9}.example-ratings-2 .rating-1:before{content:'\e605'}.example-ratings-3{overflow:hidden}.example-ratings-3:before{color:#aff5e3;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-3 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 input[type="radio"]:focus+label:before,.example-ratings-3 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-3 label{position:absolute;display:block;cursor:pointer}.example-ratings-3 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 label:before{color:#0a6767;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-3 label:hover:before{opacity:1}.example-ratings-3 label:hover~label:before{opacity:0}.example-ratings-3 .rating-5{z-index:2}.example-ratings-3 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-4{z-index:3}.example-ratings-3 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-3{z-index:4}.example-ratings-3 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-3 .rating-2{z-index:5}.example-ratings-3 .rating-2:before{content:'\e605' '\e605'}.example-ratings-3 .rating-1{z-index:6}.example-ratings-3 .rating-1:before{content:'\e605'}.example-ratings-4{overflow:hidden}.example-ratings-4:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e600' '\e600' '\e600' '\e600' '\e600';position:absolute;z-index:1;display:block}.example-ratings-4 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 input[type="radio"]:focus+label:before,.example-ratings-4 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-4 label{position:absolute;display:block;cursor:pointer}.example-ratings-4 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-4 label:hover:before{opacity:1}.example-ratings-4 label:hover~label:before{opacity:0}.example-ratings-4 .rating-5{z-index:2}.example-ratings-4 .rating-5:before{content:'\e600' '\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-4{z-index:3}.example-ratings-4 .rating-4:before{content:'\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-3{z-index:4}.example-ratings-4 .rating-3:before{content:'\e600' '\e600' '\e600'}.example-ratings-4 .rating-2{z-index:5}.example-ratings-4 .rating-2:before{content:'\e600' '\e600'}.example-ratings-4 .rating-1{z-index:6}.example-ratings-4 .rating-1:before{content:'\e600'}.exapmle-ratings-5 .control.rating.vote{overflow:hidden}.exapmle-ratings-5 .control.rating.vote:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.exapmle-ratings-5 .control.rating.vote input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote input[type="radio"]:focus+label:before,.exapmle-ratings-5 .control.rating.vote input[type="radio"]:checked+label:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label{position:absolute;display:block;cursor:pointer}.exapmle-ratings-5 .control.rating.vote label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.exapmle-ratings-5 .control.rating.vote label:hover:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label:hover~label:before{opacity:0}.exapmle-ratings-5 .control.rating.vote .rating-5{z-index:2}.exapmle-ratings-5 .control.rating.vote .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-4{z-index:3}.exapmle-ratings-5 .control.rating.vote .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-3{z-index:4}.exapmle-ratings-5 .control.rating.vote .rating-3:before{content:'\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-2{z-index:5}.exapmle-ratings-5 .control.rating.vote .rating-2:before{content:'\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-1{z-index:6}.exapmle-ratings-5 .control.rating.vote .rating-1:before{content:'\e605'}.example-rating-summary-1{white-space:nowrap;overflow:hidden}.example-rating-summary-1 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-1 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-1 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-2{white-space:nowrap;overflow:hidden}.example-rating-summary-2 .rating-result{width:154px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-2 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-2 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-3{white-space:nowrap;overflow:hidden}.example-rating-summary-3 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-3 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#aff5e3;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-3 .rating-result>span:before{position:relative;z-index:2;color:#0a6767;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-4{white-space:nowrap;overflow:hidden}.example-rating-summary-4 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-4 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-4 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5{white-space:nowrap;overflow:hidden}.example-rating-summary-5 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-5 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-5 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-6 .rating-summary{white-space:nowrap;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-6 .rating-summary .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span{display:block;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7{white-space:nowrap;overflow:hidden}.example-rating-summary-7 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-7 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-7 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-responsive-block{padding:10px}.example-sections-1{position:relative;z-index:1}.example-sections-1:before,.example-sections-1:after{content:"";display:table}.example-sections-1:after{clear:both}.example-sections-1>.item.title{float:left;width:auto}.example-sections-1>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-1>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-1>.item.content:before,.example-sections-1>.item.content:after{content:"";display:table}.example-sections-1>.item.content:after{clear:both}.example-sections-1>.item.content.active{display:block}.example-sections-1>.item.title{margin:0 5px 0 0}.example-sections-1>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-1>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-1>.item.title:not(.disabled)>.switch:focus,.example-sections-1>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-1>.item.title:not(.disabled)>.switch:active,.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-1>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}.example-sections-2{position:relative;z-index:1}.example-sections-2:before,.example-sections-2:after{content:"";display:table}.example-sections-2:after{clear:both}.example-sections-2>.item.title{float:left;width:auto}.example-sections-2>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-2>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-2>.item.content:before,.example-sections-2>.item.content:after{content:"";display:table}.example-sections-2>.item.content:after{clear:both}.example-sections-2>.item.content.active{display:block}.example-sections-2>.item.title{margin:0 5px 0 0}.example-sections-2>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-2>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-2>.item.title:not(.disabled)>.switch:focus,.example-sections-2>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-2>.item.title:not(.disabled)>.switch:active,.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-2>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:0;border-top:1px solid #d1d1d1}.example-sections-3{margin:0;padding:0}.example-sections-3>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-3>.item.title>.switch{display:block}.example-sections-3>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-3>.item.content:before,.example-sections-3>.item.content:after{content:"";display:table}.example-sections-3>.item.content:after{clear:both}.example-sections-3>.item.content.active{display:block}.example-sections-3>.item.title{margin:0 0 5px}.example-sections-3>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-3>.item.title:not(.disabled)>.switch:focus,.example-sections-3>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-3>.item.title:not(.disabled)>.switch:active,.example-sections-3>.item.title.active>.switch,.example-sections-3>.item.title.active>.switch:focus,.example-sections-3>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-3>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}@media only screen and (max-width: 99999px){.example-sections-4{ position:relative;z-index:1}.example-sections-4:before,.example-sections-4:after{content:"";display:table}.example-sections-4:after{clear:both}.example-sections-4>.item.title{float:left;width:auto}.example-sections-4>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-4>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 5px 0 0}.example-sections-4>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-4>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}}@media only screen and (max-width: 768px){.example-sections-4{ margin:0;padding:0}.example-sections-4>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-4>.item.title>.switch{display:block}.example-sections-4>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 0 5px}.example-sections-4>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-4>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}}.example-sections-5{position:relative;z-index:1}.example-sections-5:before,.example-sections-5:after{content:"";display:table}.example-sections-5:after{clear:both}.example-sections-5>.item.title{float:left;width:auto}.example-sections-5>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-5>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-5>.item.content:before,.example-sections-5>.item.content:after{content:"";display:table}.example-sections-5>.item.content:after{clear:both}.example-sections-5>.item.content.active{display:block}.example-sections-6{margin:0;padding:0}.example-sections-6>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-6>.item.title>.switch{display:block}.example-sections-6>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-6>.item.content:before,.example-sections-6>.item.content:after{content:"";display:table}.example-sections-6>.item.content:after{clear:both}.example-sections-6>.item.content.active{display:block}.example-table-1{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-1 th{text-align:left}.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{vertical-align:top}.example-table-1>thead>tr>th,.example-table-1>thead>tr>td{vertical-align:bottom}.example-table-1>thead>tr>th,.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>thead>tr>td,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{padding:8px 10px}.example-table-2>thead>tr>th,.example-table-2>tbody>tr>th,.example-table-2>tfoot>tr>th{color:#111;font-weight:700}.example-table-3{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-3 th{text-align:left}.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{vertical-align:top}.example-table-3>thead>tr>th,.example-table-3>thead>tr>td{vertical-align:bottom}.example-table-3>thead>tr>th,.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>thead>tr>td,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{padding:8px 10px}.example-table-3>caption{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-table-4{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-4 th{text-align:left}.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{vertical-align:top}.example-table-4>thead>tr>th,.example-table-4>thead>tr>td{vertical-align:bottom}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:8px 10px}.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:15px 25px 5px 0}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th{padding:15px 25px 10px 0}.example-table-5{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;background:#fff}.example-table-5 th{text-align:left}.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{vertical-align:top}.example-table-5>thead>tr>th,.example-table-5>thead>tr>td{vertical-align:bottom}.example-table-5>thead>tr>th,.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>thead>tr>td,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{padding:8px 10px}.example-table-5>thead{background:#ccf}.example-table-5>tfoot{background:#cff}.example-table-5>tbody>tr>td{background:#fcc}.example-table-5>tbody>tr>th{background:#ffc}.example-table-6{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-6 th{text-align:left}.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{vertical-align:top}.example-table-6>thead>tr>th,.example-table-6>thead>tr>td{vertical-align:bottom}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{padding:8px 10px}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-7{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-7 th{text-align:left}.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{vertical-align:top}.example-table-7>thead>tr>th,.example-table-7>thead>tr>td{vertical-align:bottom}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{padding:8px 10px}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{border-top:1px solid #d1d1d1}.example-table-7>caption+thead>tr:first-child>th,.example-table-7>colgroup+thead>tr:first-child>th,.example-table-7>thead:first-child>tr:first-child>th,.example-table-7>caption+thead>tr:first-child>td,.example-table-7>colgroup+thead>tr:first-child>td,.example-table-7>thead:first-child>tr:first-child>td{border-top:0}.example-table-7>tbody+tbody{border-top:1px solid #d1d1d1}.example-table-8{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-8 th{text-align:left}.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{vertical-align:top}.example-table-8>thead>tr>th,.example-table-8>thead>tr>td{vertical-align:bottom}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{padding:8px 10px}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{border-left:1px solid #d1d1d1}.example-table-8>thead>tr>th:first-child,.example-table-8>tbody>tr>th:first-child,.example-table-8>tfoot>tr>th:first-child,.example-table-8>thead>tr>td:first-child,.example-table-8>tbody>tr>td:first-child,.example-table-8>tfoot>tr>td:first-child{border-left:0}.example-table-9{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-9 th{text-align:left}.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{vertical-align:top}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{vertical-align:bottom}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{padding:8px 10px}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{border:0}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{border-bottom:1px solid #d1d1d1}.example-table-10{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-10 th{text-align:left}.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{vertical-align:top}.example-table-10>thead>tr>th,.example-table-10>thead>tr>td{vertical-align:bottom}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{padding:8px 10px}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{border:0}.example-table-11{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-11 th{text-align:left}.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{vertical-align:top}.example-table-11>thead>tr>th,.example-table-11>thead>tr>td{vertical-align:bottom}.example-table-11>thead>tr>th,.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>thead>tr>td,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{padding:8px 10px}.example-table-11>tbody>tr:nth-child(even)>td,.example-table-11>tbody>tr:nth-child(even)>th{background:#ffc;color:#000}.example-table-12{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-12 th{text-align:left}.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{vertical-align:top}.example-table-12>thead>tr>th,.example-table-12>thead>tr>td{vertical-align:bottom}.example-table-12>thead>tr>th,.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>thead>tr>td,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{padding:8px 10px}.example-table-12>tbody>tr:nth-child(even):hover>td,.example-table-12>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-12>tbody>tr:nth-child(odd):hover>td,.example-table-12>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}.example-table-13{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-13 th{text-align:left}.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{vertical-align:top}.example-table-13>thead>tr>th,.example-table-13>thead>tr>td{vertical-align:bottom}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{padding:8px 10px}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-13>tbody>tr:nth-child(odd)>td,.example-table-13>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-13>tbody>tr:nth-child(even):hover>td,.example-table-13>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-13>tbody>tr:nth-child(odd):hover>td,.example-table-13>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-14{ width:100%;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}}.example-table-15{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-15 th{text-align:left}.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{vertical-align:top}.example-table-15>thead>tr>th,.example-table-15>thead>tr>td{vertical-align:bottom}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{padding:8px 10px}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-15{ border:0;display:block;background:#cff}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#cff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#cff}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#cff}.example-table-15>thead>tr>th{display:none}.example-table-15>tbody{display:block}.example-table-15>tbody>tr{display:block}.example-table-15>tbody>tr td,.example-table-15>tbody>tr th{border-bottom:0;display:block;padding:5px 0}.example-table-15>tbody>tr td:before,.example-table-15>tbody>tr th:before{content:attr(data-th) ":";display:inline-block;padding-right:10px;color:#111;font-weight:700}.example-table-15>tbody>tr td{background:#cff}.example-table-15>tbody>tr>th{background-color:#ffc!important}}.example-tooltip-bottom{position:relative}.example-tooltip-bottom .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;top:100%;left:0;margin-top:5px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-bottom .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-bottom .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{bottom:100%}.example-tooltip-bottom .tooltip-content:after{border-bottom-color:#fff;margin-left:-5px;left:15px}.example-tooltip-bottom .tooltip-content:before{border-bottom-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-bottom .tooltip-toggle{cursor:help}.example-tooltip-bottom .tooltip-toggle:hover+.tooltip-content,.example-tooltip-bottom .tooltip-toggle:focus+.tooltip-content,.example-tooltip-bottom:hover .tooltip-content{display:block}.example-tooltip-left{position:relative}.example-tooltip-left .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;right:100%;top:0;margin-right:5px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-left .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-left .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{left:100%}.example-tooltip-left .tooltip-content:after{border-left-color:#fff;margin-top:-5px;top:15px}.example-tooltip-left .tooltip-content:before{border-left-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-left .tooltip-toggle{cursor:help}.example-tooltip-left .tooltip-toggle:hover+.tooltip-content,.example-tooltip-left .tooltip-toggle:focus+.tooltip-content,.example-tooltip-left:hover .tooltip-content{display:block}.example-tooltip-right{position:relative}.example-tooltip-right .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;left:100%;top:0;margin-left:5px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-right .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-right .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{right:100%}.example-tooltip-right .tooltip-content:after{border-right-color:#fff;margin-top:-5px;top:15px}.example-tooltip-right .tooltip-content:before{border-right-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-right .tooltip-toggle{cursor:help}.example-tooltip-right .tooltip-toggle:hover+.tooltip-content,.example-tooltip-right .tooltip-toggle:focus+.tooltip-content,.example-tooltip-right:hover .tooltip-content{display:block}.example-tooltip-top{position:relative}.example-tooltip-top .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;bottom:100%;left:0;margin-bottom:5px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-top .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-top .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{top:100%}.example-tooltip-top .tooltip-content:after{border-top-color:#fff;margin-left:-5px;left:15px}.example-tooltip-top .tooltip-content:before{border-top-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-top .tooltip-toggle{cursor:help}.example-tooltip-top .tooltip-toggle:hover+.tooltip-content,.example-tooltip-top .tooltip-toggle:focus+.tooltip-content,.example-tooltip-top:hover .tooltip-content{display:block}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example{font-size:2.5rem}.example-line-height{line-height:3rem}.example-word-wrap{word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;background:#ccc;width:120px}.example-text-overflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:#ccc;width:120px}.example-text-hide{background-color:transparent;border:0;font:0/0 a;color:transparent;text-shadow:none}.example-hyphens{word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.example-hyphens-none{word-wrap:break-word;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.example-typography{font-size:3rem;color:#fc0;font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-weight:500;font-style:italic;line-height:1.2}.example-list-reset-styles{margin:0;padding:0;list-style:none none}.example-list-inline{margin:0;padding:0;list-style:none none}.example-list-inline>li{display:inline-block;vertical-align:top}.example-link-default{color:#1979c3;text-decoration:none}.example-link-default:visited{color:#1979c3;text-decoration:none}.example-link-default:hover{color:#006bb4;text-decoration:underline}.example-link-default:active{color:#ff5501;text-decoration:underline}.example-link{color:#008000;text-decoration:none}.example-link:visited{color:#1979c3;text-decoration:none}.example-link:hover{color:#ffa500;text-decoration:none}.example-link:active{color:#ff5501;text-decoration:underline}.example-heading{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.example-heading-2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-clearfix-container-1{border:1px solid red}.example-clearfix-container-2{border:1px solid #0f0}.example-clearfix-container-2:before,.example-clearfix-container-2:after{content:"";display:table}.example-clearfix-container-2:after{clear:both}.example-clearfix-item.left{float:left}.example-clearfix-item.right{float:right}.example-visibility-hidden{height:0;visibility:hidden}.example-visually-hidden-1{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{background:#fdf0d5;padding:5px;border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.example-css-container{padding:20px;background:#e8e8e8}.example-rotate{background:red;position:absolute;height:20px;width:40px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.example-placeholder::-webkit-input-placeholder{color:#808080;font-weight:700}.example-placeholder:-moz-placeholder{color:#808080;font-weight:700}.example-placeholder::-moz-placeholder{color:#808080;font-weight:700}.example-placeholder:-ms-input-placeholder{color:#808080;font-weight:700}.example-background-gradient-1{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #cff 0, #ccf 100%);background-image:linear-gradient(to bottom, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=0)}.example-background-gradient-2{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop( #cff 0),color-stop( #ccf 100%));background-image:linear-gradient(to right, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=1)}.example-background-gradient-3-wrapper{background:#ffc;padding:10px}.example-background-gradient-3{background-color:rgba(255,255,255,0);background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(rgba(255,255,255,0) 0),color-stop( #ccf 100%));background-image:linear-gradient(to right,rgba(255,255,255,0) 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='rgba(255, 255, 255, 0)',endColorstr='#ccccff',GradientType=1)}body{padding:15px;background-image:none}</style></head><body><nav class="bar top cf"><div class="container"><a href="index.html" class="brand">Magento UI Library</a><ul class="menu"><li><a href="#" data-toggle="dropdown-1" unselectable="on" class="dropdown-toggle">files</a><ul id="dropdown-1" hidden class="dropdown"><li><a href="actions-toolbar.html">actions-toolbar</a></li><li><a href="breadcrumbs.html">breadcrumbs</a></li><li><a href="buttons.html">buttons</a></li><li><a href="docs.html">docs</a></li><li><a href="dropdowns.html">dropdowns</a></li><li><a href="forms.html">forms</a></li><li><a href="icons.html">icons</a></li><li><a href="layout.html">layout</a></li><li><a href="lib.html">lib</a></li><li><a href="loaders.html">loaders</a></li><li><a href="messages.html">messages</a></li><li><a href="pages.html">pages</a></li><li><a href="popups.html">popups</a></li><li><a href="rating.html">rating</a></li><li><a href="resets.html">resets</a></li><li><a href="responsive.html">responsive</a></li><li><a href="sections.html">sections</a></li><li><a href="tables.html">tables</a></li><li><a href="tooltips.html">tooltips</a></li><li><a href="typography.html">typography</a></li><li><a href="utilities.html">utilities</a></li><li><a href="variables.html">variables</a></li></ul></li></ul><div class="nav"><button title="Table of Contents" data-toggle="nav-toc"><svg viewBox="0 0 512 512" height="22" width="22" class="icon"><path d="M108.9,403.1V462H50v-58.9H108.9z M108.9,285.4H50v58.9h58.9V285.4zM108.9,50H50v58.9h58.9V50z M108.9,167.7H50v58.9h58.9V167.7z M167.7,344.3H462v-58.9H167.7V344.3zM167.7,50v58.9H462V50H167.7z M167.7,462H462v-58.9H167.7V462z M167.7,226.6H462v-58.9H167.7V226.6z"></path></svg></button><input type="search" placeholder="Search" class="search"></div></div></nav><section class="container"><article id="icons" class="section"><div class="docs"><a href="#icons" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icons">Icons</h1> <p> Icons can be represented by using the fonts, images, or sprites.</p> <p> An icon can be added to any HTML tag. For this purpose you need to use additional <code><span></code> tag within your tag. This additional tag serves for displaying an icon without visible text, thus following the <strong>accessibility requirements</strong>. Then you need to apply appropriate <code>icon</code> mixin for this tag's class. Icon can be added both before and after element's text. Also, icon can be displayed instead of element's text (in this case the text is hidden).</p> <p> There are two ways to insert icon: first you can use <strong>sprite or image</strong>, second you can use <strong>an icon font</strong>. Magento UI library provides mixins for both of them.</p> @@ -21,59 +21,55 @@ <a href="#" class="example-icon-5"><span>font icon after the text</span></a> <br> <a href="#" class="example-icon-6" title="font icon instead of the text"><span>icon instead of the text</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-1 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); -} - -.example-icon-2 { - .icon-image( - @_icon-image: '@{baseDir}images/blank-theme-icons.png', - @_icon-image-position-x: -26px, - @_icon-image-position-y: 0, - @_icon-image-position: after - ); -} - -.example-icon-3 { - .icon-image( - @_icon-image: '@{baseDir}images/blank-theme-icons.png', - @_icon-image-position-x: -156px, - @_icon-image-position-y: -52px, - @_icon-image-text-hide: true - ); -} - -.example-icon-4 { - .icon-font( - @_icon-font-content: @icon-settings, - @_icon-font-size: 24px - ); -} - -.example-icon-5 { - .icon-font( - @_icon-font-content: @icon-star, - @_icon-font-size: 24px, - @_icon-font-position: after - ); -} - -.example-icon-6 { - .icon-font( - @_icon-font-content: @icon-flag, - @_icon-font-size: 24px, - @_icon-font-text-hide: true - ); -} - </code></pre></div></article><article id="icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite">Icon with image or sprite</h1> +</div><div class="code"><pre><code>.example-icon-1 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); +} + +.example-icon-2 { + .icon-image( + @_icon-image: '@{baseDir}images/blank-theme-icons.png', + @_icon-image-position-x: -26px, + @_icon-image-position-y: 0, + @_icon-image-position: after + ); +} + +.example-icon-3 { + .icon-image( + @_icon-image: '@{baseDir}images/blank-theme-icons.png', + @_icon-image-position-x: -156px, + @_icon-image-position-y: -52px, + @_icon-image-text-hide: true + ); +} + +.example-icon-4 { + .icon-font( + @_icon-font-content: @icon-settings, + @_icon-font-size: 24px + ); +} + +.example-icon-5 { + .icon-font( + @_icon-font-content: @icon-star, + @_icon-font-size: 24px, + @_icon-font-position: after + ); +} + +.example-icon-6 { + .icon-font( + @_icon-font-content: @icon-flag, + @_icon-font-size: 24px, + @_icon-font-text-hide: true + ); +}</code></pre></div></article><article id="icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite">Icon with image or sprite</h1> <p> the <code>.icon-image()</code> mixin is used to create icons using single image or sprite. It has one mandatory parameter - <code>@_icon-image</code>. This parameter accepts the path to an image or sprite.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-7"><span>icon-search</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-7 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); -} - </code></pre></div></article><article id="icon-with-image-or-sprite-variables" class="section"><div class="docs"><a href="#icon-with-image-or-sprite-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite-variables">Icon with image or sprite variables</h1> +</div><div class="code"><pre><code>.example-icon-7 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); +}</code></pre></div></article><article id="icon-with-image-or-sprite-variables" class="section"><div class="docs"><a href="#icon-with-image-or-sprite-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite-variables">Icon with image or sprite variables</h1> <pre> <table> <tr> @@ -138,28 +134,26 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="icon-position-for-an-icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-position-for-an-icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-position-for-an-icon-with-image-or-sprite">Icon position for an icon with image or sprite</h1> +</div></article><article id="icon-position-for-an-icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-position-for-an-icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-position-for-an-icon-with-image-or-sprite">Icon position for an icon with image or sprite</h1> <p> To change the position for icons with image the <code>.icon-image-position()</code> mixin is used. By managing its <code>@_icon-image-position-x</code> and <code>@_icon-image-position-y</code> variables you can move the image on element's background. The <code>@_icon-image-position</code> variable is used to define the position of icon (before or after the element).</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-8"><span>icon-star</span></a> <br> <a href="#" class="example-icon-9"><span>icon-heart</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-8 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - .icon-image-position( - @_icon-image-position-x: -182px - ); -} - -.example-icon-9 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png', @_icon-image-position: after); - .icon-image-position( - @_icon-image-position-x: -52px, - @_icon-image-position-y: -26px, - @_icon-image-position: after - ); -} - </code></pre></div></article><article id="position-for-icon-with-image-or-sprite-mixin-variables" class="section"><div class="docs"><a href="#position-for-icon-with-image-or-sprite-mixin-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="position-for-icon-with-image-or-sprite-mixin-variables">Position for icon with image or sprite mixin variables</h1> +</div><div class="code"><pre><code>.example-icon-8 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + .icon-image-position( + @_icon-image-position-x: -182px + ); +} + +.example-icon-9 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png', @_icon-image-position: after); + .icon-image-position( + @_icon-image-position-x: -52px, + @_icon-image-position-y: -26px, + @_icon-image-position: after + ); +}</code></pre></div></article><article id="position-for-icon-with-image-or-sprite-mixin-variables" class="section"><div class="docs"><a href="#position-for-icon-with-image-or-sprite-mixin-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="position-for-icon-with-image-or-sprite-mixin-variables">Position for icon with image or sprite mixin variables</h1> <pre> <table> <tr> @@ -188,15 +182,13 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="icon-sprite-position-with-grid" class="section"><div class="docs"><a href="#icon-sprite-position-with-grid" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-with-grid">Icon sprite position (with grid)</h1> +</div></article><article id="icon-sprite-position-with-grid" class="section"><div class="docs"><a href="#icon-sprite-position-with-grid" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-with-grid">Icon sprite position (with grid)</h1> <p> Mixin <code>.icon-sprite-position()</code> is used to manage the position of sprite background image. It assumes the use of a single sprite image with individual images <strong>placed on a regular grid</strong>.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-10"><span>icon text</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-10 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - .icon-sprite-position(4, 0); -} - </code></pre></div></article><article id="icon-sprite-position-variables" class="section"><div class="docs"><a href="#icon-sprite-position-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-variables">Icon sprite position variables</h1> +</div><div class="code"><pre><code>.example-icon-10 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + .icon-sprite-position(4, 0); +}</code></pre></div></article><article id="icon-sprite-position-variables" class="section"><div class="docs"><a href="#icon-sprite-position-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-variables">Icon sprite position variables</h1> <pre> <table> <tr> @@ -231,18 +223,16 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="imagesprite-icon-size" class="section"><div class="docs"><a href="#imagesprite-icon-size" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size">Image/sprite icon size</h1> +</div></article><article id="imagesprite-icon-size" class="section"><div class="docs"><a href="#imagesprite-icon-size" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size">Image/sprite icon size</h1> <p> Mixin <code>.icon-image-size()</code> is used to change the image/sprite icon size</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-11"><span>icon-search</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-11 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - .icon-image-size(30px, 30px); - &:before { - background-color: #f1f1f1; - } -} - </code></pre></div></article><article id="imagesprite-icon-size-variables" class="section"><div class="docs"><a href="#imagesprite-icon-size-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size-variables">Image/sprite icon size variables</h1> +</div><div class="code"><pre><code>.example-icon-11 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + .icon-image-size(30px, 30px); + &:before { + background-color: #f1f1f1; + } +}</code></pre></div></article><article id="imagesprite-icon-size-variables" class="section"><div class="docs"><a href="#imagesprite-icon-size-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size-variables">Image/sprite icon size variables</h1> <pre> <table> <tr> @@ -274,14 +264,12 @@ </div></article><article id="font-icon" class="section"><div class="docs"><a href="#font-icon" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="font-icon">Font icon</h1> <p> The <code>.icon-font()</code> mixin is used to create icons using font icons. It has one mandatory parameter - <code>@_icon-font-content</code>. This parameter accepts the font icon code.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-12"><span>icon-calendar</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-12 { - .icon-font( - @icon-calendar, - @_icon-font-size: 28px - ); -} - </code></pre></div></article><article id="font-icon-variables" class="section"><div class="docs"><a href="#font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="font-icon-variables">Font icon variables</h1> +</div><div class="code"><pre><code>.example-icon-12 { + .icon-font( + @icon-calendar, + @_icon-font-size: 28px + ); +}</code></pre></div></article><article id="font-icon-variables" class="section"><div class="docs"><a href="#font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="font-icon-variables">Font icon variables</h1> <pre> <table> <tr> @@ -364,17 +352,15 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="change-the-size-of-font-icon" class="section"><div class="docs"><a href="#change-the-size-of-font-icon" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon">Change the size of font icon</h1> +</div></article><article id="change-the-size-of-font-icon" class="section"><div class="docs"><a href="#change-the-size-of-font-icon" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon">Change the size of font icon</h1> <p> The <code>.icon-font-size()</code> mixin is used to change size of the font icon which is already defined. The mixin generates only new font size and line height without any other options. @_icon-font-position variable is used to define the position of icon (before or after the element) which we want to set font size of.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-13"><span>icon-calendar</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-13 { - .icon-font(@icon-calendar); - .icon-font-size( - @_icon-font-size: 26px - ); -} - </code></pre></div></article><article id="change-the-size-of-font-icon-variables" class="section"><div class="docs"><a href="#change-the-size-of-font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon-variables">Change the size of font icon variables</h1> +</div><div class="code"><pre><code>.example-icon-13 { + .icon-font(@icon-calendar); + .icon-font-size( + @_icon-font-size: 26px + ); +}</code></pre></div></article><article id="change-the-size-of-font-icon-variables" class="section"><div class="docs"><a href="#change-the-size-of-font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon-variables">Change the size of font icon variables</h1> <pre> <table> <tr> @@ -406,15 +392,13 @@ </div></article><article id="hide-icon-text" class="section"><div class="docs"><a href="#hide-icon-text" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="hide-icon-text">Hide icon text</h1> <p> The <code>.icon-text-hide()</code> mixin can be used separately to hide text of an element that has an icon text. This mixin accepts no variables.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-14"><span>icon-calendar</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-14 { - .icon-font( - @icon-envelope, - @_icon-font-size: 26px - ); - .icon-text-hide(); -} - </code></pre></div></article><article id="sprite-and-font-icons-for-blank-theme" class="section"><div class="docs"><a href="#sprite-and-font-icons-for-blank-theme" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="sprite-and-font-icons-for-blank-theme">Sprite and font icons for Blank theme</h1> +</div><div class="code"><pre><code>.example-icon-14 { + .icon-font( + @icon-envelope, + @_icon-font-size: 26px + ); + .icon-text-hide(); +}</code></pre></div></article><article id="sprite-and-font-icons-for-blank-theme" class="section"><div class="docs"><a href="#sprite-and-font-icons-for-blank-theme" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="sprite-and-font-icons-for-blank-theme">Sprite and font icons for Blank theme</h1> <p> You can use the icons designed to our Blank theme, which are also available in two variants: sprite and font</p> <h2 id="icons-using-sprite">Icons using sprite</h2> <textarea class="preview-code" spellcheck="false"> <ul class="icons-image-list"> @@ -642,180 +626,185 @@ <li> <span class="icon-arrow-down-thin" data-icon=""><span>@icon-arrow-down-thin</span></span> </li> + <li> + <span class="icon-arrow-left-thin" data-icon=""><span>@icon-gift-registry</span></span> + </li> + <li> + <span class="icon-arrow-down-thin" data-icon=""><span>@icon-present</span></span> + </li> </ul></textarea> -</div><div class="code"><pre><code> -.icons-image-list { - list-style: none; - padding: 0; - li { - float: left; - width: 33%; - > span { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - } - .icon-search { - .icon-sprite-position(0, 0); - } - .icon-cart { - .icon-sprite-position(1, 0); - } - .icon-arrow-down { - .icon-sprite-position(2, 0); - } - .icon-arrow-up { - .icon-sprite-position(3, 0); - } - .icon-grid { - .icon-sprite-position(4, 0); - } - .icon-list { - .icon-sprite-position(5, 0); - } - .icon-remove { - .icon-sprite-position(6, 0); - } - .icon-star { - .icon-sprite-position(7, 0); - } - .icon-pointer-down { - .icon-sprite-position(8, 0); - } - .icon-pointer-up { - .icon-sprite-position(9, 0); - } - .icon-pointer-left { - .icon-sprite-position(10, 0); - } - .icon-pointer-right { - .icon-sprite-position(11, 0); - } - .icon-compare-empty { - .icon-sprite-position(0, 1); - } - .icon-compare-full { - .icon-sprite-position(1, 1); - } - .icon-wishlist-empty { - .icon-sprite-position(2, 1); - } - .icon-wishlist-full { - .icon-sprite-position(3, 1); - } - .icon-update { - .icon-sprite-position(4, 1); - } - .icon-collapse { - .icon-sprite-position(5, 1); - } - .icon-expand { - .icon-sprite-position(6, 1); - } - .icon-menu { - .icon-sprite-position(7, 1); - } - .icon-prev { - .icon-sprite-position(8, 1); - } - .icon-next { - .icon-sprite-position(9, 1); - } - .icon-settings { - .icon-sprite-position(10, 1); - } - .icon-info { - .icon-sprite-position(11, 1); - } - .icon-checkmark { - .icon-sprite-position(0, 2); - } - .icon-calendar { - .icon-sprite-position(1, 2); - } - .icon-comment { - .icon-sprite-position(2, 2); - } - .icon-comment-reflected { - .icon-sprite-position(3, 2); - } - .icon-envelope { - .icon-sprite-position(4, 2); - } - .icon-warning { - .icon-sprite-position(5, 2); - } - .icon-trash { - .icon-sprite-position(6, 2); - } - .icon-flag { - .icon-sprite-position(7, 2); - } - .icon-location { - .icon-sprite-position(8, 2); - } - .icon-up { - .icon-sprite-position(9, 2); - } - .icon-down { - .icon-sprite-position(10, 2); - } - } -} - -@icon-wishlist-full: '\e600'; -@icon-wishlist-empty: '\e601'; -@icon-warning: '\e602'; -@icon-update: '\e603'; -@icon-trash: '\e604'; -@icon-star: '\e605'; -@icon-settings: '\e606'; -@icon-pointer-down: '\e607'; -@icon-next: '\e608'; -@icon-menu: '\e609'; -@icon-location: '\e60a'; -@icon-list: '\e60b'; -@icon-info: '\e60c'; -@icon-grid: '\e60d'; -@icon-comment-reflected: '\e60e'; -@icon-collapse: '\e60f'; -@icon-checkmark: '\e610'; -@icon-cart: '\e611'; -@icon-calendar: '\e612'; -@icon-arrow-up: '\e613'; -@icon-arrow-down: '\e614'; -@icon-search: '\e615'; -@icon-remove: '\e616'; -@icon-prev: '\e617'; -@icon-pointer-up: '\e618'; -@icon-pointer-right: '\e619'; -@icon-pointer-left: '\e61a'; -@icon-flag: '\e61b'; -@icon-expand: '\e61c'; -@icon-envelope: '\e61d'; -@icon-compare-full: '\e61e'; -@icon-compare-empty: '\e61f'; -@icon-comment: '\e620'; -@icon-up: '\e621'; -@icon-down: '\e622'; -@icon-arrow-up-thin: '\e623'; -@icon-arrow-right-thin: '\e624'; -@icon-arrow-left-thin: '\e625'; -@icon-arrow-down-thin: '\e626'; - -.icons-font-list { - list-style: none; - padding: 0; - li { - float: left; - width: 25%; - margin-bottom: 35px; - text-align: center; - > span { - .icon-font('', @_icon-font-size: 34px); - &:before { - content: attr(data-icon); - margin: 0 auto; - display: block; - } - } - } -} </code></pre></div></article></section><div class="bar bottom"><div hidden class="settings container"><!-- Icons from http://iconmonstr.com--><button title="Desktop (1280)" data-width='1280'><svg viewBox="0 0 412 386" height="24" width="26" class="icon"><path d="m147.6,343.9c-4.5,15.9-26.2,37.6-42.1,42.1h201c-15.3,-4-38.1,-26.8-42.1,-42.1H147.6zM387,0.5H25c-13.8,0-25,11.2-25,25V294c0,13.8 11.2,25 25,25h362c13.8,0 25,-11.2 25,-25V25.5C412,11.7 400.8,0.5 387,0.5zM369.9,238.2H42.1L42.1,42.6 369.9,42.6V238.2z"></path></svg></button><button title="Laptop (1024)" data-width='1024'><svg viewBox="0 0 384 312" height="23" width="28" class="icon"><path d="m349.2,20.5c0,-11-9,-20-20,-20H53.6c-11,0-20,9-20,20v194H349.2v-194zm-27,167H60.6V27.5H322.2v160zm28,42H32.6L2.6,282.1c-3.5,6.2-3.5,13.8 0.1,19.9 3.6,6.2 10.2,9.9 17.3,9.9H363.1c7.1,0 13.7,-3.8 17.3,-10 3.6,-6.2 3.6,-13.8 0,-20l-30.2,-52.5zm-196.9,54 8,-23.5h60.5l8,23.5h-76.5z"></path></svg></button><button title="Tablet (768)" data-width='768'><svg viewBox="0 0 317 412" height="24" width="18" class="icon"><path d="M 316.5,380 V 32 c 0,-17.7 -14.3,-32 -32,-32 H 32 C 14.3,0 0,14.3 0,32 v 348 c 0,17.7 14.3,32 32,32 h 252.5 c 17.7,0 32,-14.3 32,-32 z M 40,367 V 45 H 276.5 V 367 H 40 z m 109.8,22.7 c 0,-4.7 3.8,-8.5 8.5,-8.5 4.7,0 8.5,3.8 8.5,8.5 0,4.7 -3.8,8.5 -8.5,8.5 -4.7,0 -8.5,-3.8 -8.5,-8.5 z"></path></svg></button><button title="Smart phone (320)" data-width='320'><svg viewBox="0 0 224 412" height="24" width="13" class="icon"><path d="M 190.7,0 H 33 C 14.8,0 0,14.8 0,33 v 346 c 0,18.2 14.8,33 33,33 h 157.7 c 18.2,0 33,-14.8 33,-33 V 33 c 0,-18.2 -14.8,-33 -33,-33 z M 94.3,30.2 h 37 c 2.2,0 4,1.8 4,4 0,2.2 -1.8,4 -4,4 h -37 c -2.2,0 -4,-1.8 -4,-4 0,-2.2 1.8,-4 4,-4 z m 18.5,362.8 c -8.8,0 -16,-7.2 -16,-16 0,-8.8 7.2,-16 16,-16 8.8,0 16,7.2 16,16 0,8.8 -7.2,16 -16,16 z M 198.6,343.8 H 25.1 V 68.2 h 173.5 v 275.5 z"></path></svg></button><button title="Feature phone (240)" data-width='240'><svg viewBox="0 0 201 412" height="24" width="12" class="icon"><path d="M 165.5,0.2 V 45 H 25 c -13.8,0 -25,11.2 -25,25 V 387 c 0,13.8 11.2,25 25,25 h 150.5 c 13.8,0 25,-11.2 25,-25 V 0.2 h -35 z M 65.2,366.5 H 34.2 v -24.5 h 31 v 24.5 z m 0,-44.3 H 34.2 v -24.5 h 31 v 24.5 z m 50.5,44.3 H 84.7 v -24.5 h 31 v 24.5 z m 0,-44.3 H 84.7 v -24.5 h 31 v 24.5 z m 50.5,44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-59.3 h -132 V 95.4 h 132 V 262.9 z"></path></svg></button><button title="Auto (100%)" data-width="auto" class="auto is-active">Auto</button></div></div><script>(function(){var a=[{title:"actions-toolbar",filename:"actions-toolbar",url:"actions-toolbar.html"},{title:"Actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar"},{title:"Actions toolbar mixin variables",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-mixin-variables"},{title:"Actions toolbar alignment",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-alignment"},{title:"Reverse primary and secondary blocks",filename:"actions-toolbar",url:"actions-toolbar.html#reverse-primary-and-secondary-blocks"},{title:"Actions toolbar indents customizations",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-indents-customizations"},{title:"Responsive actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#responsive-actions-toolbar"},{title:"breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html"},{title:"Breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs"},{title:"Breadcrumbs variables",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-variables"},{title:"Button-styled breadcrumbs with gradient background, border, and no separating symbol",filename:"breadcrumbs",url:"breadcrumbs.html#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol"},{title:"Breadcrumbs with solid background",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-with-solid-background"},{title:"buttons",filename:"buttons",url:"buttons.html"},{title:"Default button",filename:"buttons",url:"buttons.html#default-button"},{title:"Button variables",filename:"buttons",url:"buttons.html#button-variables"},{title:"Button as an icon",filename:"buttons",url:"buttons.html#button-as-an-icon"},{title:"Button with an icon on the left or right side of the text",filename:"buttons",url:"buttons.html#button-with-an-icon-on-the-left-or-right-side-of-the-text"},{title:"Button with fixed width",filename:"buttons",url:"buttons.html#button-with-fixed-width"},{title:"Primary button",filename:"buttons",url:"buttons.html#primary-button"},{title:"Primary button variables",filename:"buttons",url:"buttons.html#primary-button-variables"},{title:"Button with gradient background",filename:"buttons",url:"buttons.html#button-with-gradient-background"},{title:"Button as a link",filename:"buttons",url:"buttons.html#button-as-a-link"},{title:"Link as a button",filename:"buttons",url:"buttons.html#link-as-a-button"},{title:"Button reset",filename:"buttons",url:"buttons.html#button-reset"},{title:"Button revert secondary color",filename:"buttons",url:"buttons.html#button-revert-secondary-color"},{title:"Button revert secondary color variables",filename:"buttons",url:"buttons.html#button-revert-secondary-color-variables"},{title:"Button revert secondary size",filename:"buttons",url:"buttons.html#button-revert-secondary-size"},{title:"Button revert secondary size variables",filename:"buttons",url:"buttons.html#button-revert-secondary-size-variables"},{title:"docs",filename:"docs",url:"docs.html"},{title:"Documentation",filename:"docs",url:"docs.html#documentation"},{title:"dropdowns",filename:"dropdowns",url:"dropdowns.html"},{title:"Drop-down and split buttons mixins",filename:"dropdowns",url:"dropdowns.html#dropdown-and-split-buttons-mixins"},{title:"Drop-down",filename:"dropdowns",url:"dropdowns.html#dropdown"},{title:"Drop-down variables",filename:"dropdowns",url:"dropdowns.html#dropdown-variables"},{title:"Drop-down with icon customization",filename:"dropdowns",url:"dropdowns.html#dropdown-with-icon-customization"},{title:"Modify dropdown list styles",filename:"dropdowns",url:"dropdowns.html#modify-dropdown-list-styles"},{title:"Split button",filename:"dropdowns",url:"dropdowns.html#split-button"},{title:"Split button variables",filename:"dropdowns",url:"dropdowns.html#split-button-variables"},{title:"Split button - button styling",filename:"dropdowns",url:"dropdowns.html#split-button-button-styling"},{title:"Split button icon customization",filename:"dropdowns",url:"dropdowns.html#split-button-icon-customization"},{title:"Split button drop-down list customization",filename:"dropdowns",url:"dropdowns.html#split-button-dropdown-list-customization"},{title:"forms",filename:"forms",url:"forms.html"},{title:"Forms mixins",filename:"forms",url:"forms.html#forms-mixins"},{title:"Global forms elements customization",filename:"forms",url:"forms.html#global-forms-elements-customization"},{title:"Fieldsets & fields customization",filename:"forms",url:"forms.html#fieldsets-fields-customization"},{title:"Fieldset and legend customization variables",filename:"forms",url:"forms.html#fieldset-and-legend-customization-variables"},{title:"Fields customization variables",filename:"forms",url:"forms.html#fields-customization-variables"},{title:"Required fields message customization variables",filename:"forms",url:"forms.html#required-fields-message-customization-variables"},{title:"Form element inputs customization",filename:"forms",url:"forms.html#form-element-inputs-customization"},{title:"Form element inputs customization variables",filename:"forms",url:"forms.html#form-element-inputs-customization-variables"},{title:"Form element choice",filename:"forms",url:"forms.html#form-element-choice"},{title:"Form element choice variables",filename:"forms",url:"forms.html#form-element-choice-variables"},{title:"Custom color",filename:"forms",url:"forms.html#custom-color"},{title:"Input number - input-text view",filename:"forms",url:"forms.html#input-number-inputtext-view"},{title:"Input search - input-text view",filename:"forms",url:"forms.html#input-search-inputtext-view"},{title:"Form validation",filename:"forms",url:"forms.html#form-validation"},{title:"Form validation variables// <pre>",filename:"forms",url:"forms.html#form-validation-variables-pre"},{title:"icons",filename:"icons",url:"icons.html"},{title:"Icons",filename:"icons",url:"icons.html#icons"},{title:"Icon with image or sprite",filename:"icons",url:"icons.html#icon-with-image-or-sprite"},{title:"Icon with image or sprite variables",filename:"icons",url:"icons.html#icon-with-image-or-sprite-variables"},{title:"Icon position for an icon with image or sprite",filename:"icons",url:"icons.html#icon-position-for-an-icon-with-image-or-sprite"},{title:"Position for icon with image or sprite mixin variables",filename:"icons",url:"icons.html#position-for-icon-with-image-or-sprite-mixin-variables"},{title:"Icon sprite position (with grid)",filename:"icons",url:"icons.html#icon-sprite-position-with-grid"},{title:"Icon sprite position variables",filename:"icons",url:"icons.html#icon-sprite-position-variables"},{title:"Image/sprite icon size",filename:"icons",url:"icons.html#imagesprite-icon-size"},{title:"Image/sprite icon size variables",filename:"icons",url:"icons.html#imagesprite-icon-size-variables"},{title:"Font icon",filename:"icons",url:"icons.html#font-icon"},{title:"Font icon variables",filename:"icons",url:"icons.html#font-icon-variables"},{title:"Change the size of font icon",filename:"icons",url:"icons.html#change-the-size-of-font-icon"},{title:"Change the size of font icon variables",filename:"icons",url:"icons.html#change-the-size-of-font-icon-variables"},{title:"Hide icon text",filename:"icons",url:"icons.html#hide-icon-text"},{title:"Sprite and font icons for Blank theme",filename:"icons",url:"icons.html#sprite-and-font-icons-for-blank-theme"},{title:"layout",filename:"layout",url:"layout.html"},{title:"Layout",filename:"layout",url:"layout.html#layout"},{title:"Layout global variables",filename:"layout",url:"layout.html#layout-global-variables"},{title:"Page layouts",filename:"layout",url:"layout.html#page-layouts"},{title:"Layout column",filename:"layout",url:"layout.html#layout-column"},{title:"Layout column variables",filename:"layout",url:"layout.html#layout-column-variables"},{title:"Layout width",filename:"layout",url:"layout.html#layout-width"},{title:"Layout width variables",filename:"layout",url:"layout.html#layout-width-variables"},{title:"lib",filename:"lib",url:"lib.html"},{title:"Including Magento UI library to your theme",filename:"lib",url:"lib.html#including-magento-ui-library-to-your-theme"},{title:"loaders",filename:"loaders",url:"loaders.html"},{title:"Loaders",filename:"loaders",url:"loaders.html#loaders"},{title:"Default loader variables",filename:"loaders",url:"loaders.html#default-loader-variables"},{title:"Loading",filename:"loaders",url:"loaders.html#loading"},{title:"Loading default variables",filename:"loaders",url:"loaders.html#loading-default-variables"},{title:"messages",filename:"messages",url:"messages.html"},{title:"Messages",filename:"messages",url:"messages.html#messages"},{title:"Information message",filename:"messages",url:"messages.html#information-message"},{title:"Warning message",filename:"messages",url:"messages.html#warning-message"},{title:"Error message",filename:"messages",url:"messages.html#error-message"},{title:"Success message",filename:"messages",url:"messages.html#success-message"},{title:"Notice message",filename:"messages",url:"messages.html#notice-message"},{title:"Message with inner icon",filename:"messages",url:"messages.html#message-with-inner-icon"},{title:"Message with lateral icon",filename:"messages",url:"messages.html#message-with-lateral-icon"},{title:"Custom message style",filename:"messages",url:"messages.html#custom-message-style"},{title:"Messages global variables",filename:"messages",url:"messages.html#messages-global-variables"},{title:"pages",filename:"pages",url:"pages.html"},{title:"Pagination HTML markup",filename:"pages",url:"pages.html#pagination-html-markup"},{title:"Pagination variables",filename:"pages",url:"pages.html#pagination-variables"},{title:"Pagination with label and gradient background on links",filename:"pages",url:"pages.html#pagination-with-label-and-gradient-background-on-links"},{title:'Pagination with "previous"..."next" text links and label',filename:"pages",url:"pages.html#pagination-with-previousnext-text-links-and-label"},{title:"Pagination without label, with solid background",filename:"pages",url:"pages.html#pagination-without-label-with-solid-background"},{title:"popups",filename:"popups",url:"popups.html"},{title:"Popups",filename:"popups",url:"popups.html#popups"},{title:"Popup variables",filename:"popups",url:"popups.html#popup-variables"},{title:"Window overlay mixin variables",filename:"popups",url:"popups.html#window-overlay-mixin-variables"},{title:"Fixed height popup",filename:"popups",url:"popups.html#fixed-height-popup"},{title:"Fixed content height popup",filename:"popups",url:"popups.html#fixed-content-height-popup"},{title:"Margins for header, content and footer block in popup",filename:"popups",url:"popups.html#margins-for-header-content-and-footer-block-in-popup"},{title:"Popup titles styled as theme headings",filename:"popups",url:"popups.html#popup-titles-styled-as-theme-headings"},{title:"Popup action toolbar",filename:"popups",url:"popups.html#popup-action-toolbar"},{title:"Popup Close button without an icon",filename:"popups",url:"popups.html#popup-close-button-without-an-icon"},{title:"Modify the icon of popup Close button",filename:"popups",url:"popups.html#modify-the-icon-of-popup-close-button"},{title:"Modify overlay styles",filename:"popups",url:"popups.html#modify-overlay-styles"},{title:"rating",filename:"rating",url:"rating.html"},{title:"Ratings",filename:"rating",url:"rating.html#ratings"},{title:"Global rating variables",filename:"rating",url:"rating.html#global-rating-variables"},{title:"Rating with vote",filename:"rating",url:"rating.html#rating-with-vote"},{title:"Rating with vote icons number customization",filename:"rating",url:"rating.html#rating-with-vote-icons-number-customization"},{title:"Rating with vote icons colors customization",filename:"rating",url:"rating.html#rating-with-vote-icons-colors-customization"},{title:"Rating with vote icons symbol customization",filename:"rating",url:"rating.html#rating-with-vote-icons-symbol-customization"},{title:"Accessible rating with vote",filename:"rating",url:"rating.html#accessible-rating-with-vote"},{title:"Rating summary",filename:"rating",url:"rating.html#rating-summary"},{title:"Rating summary icons number customization",filename:"rating",url:"rating.html#rating-summary-icons-number-customization"},{title:"Rating summary icons color customization",filename:"rating",url:"rating.html#rating-summary-icons-color-customization"},{title:"Rating summary icons symbol customization",filename:"rating",url:"rating.html#rating-summary-icons-symbol-customization"},{title:"Rating summary hide label",filename:"rating",url:"rating.html#rating-summary-hide-label"},{title:"Rating summary multiple ratings",filename:"rating",url:"rating.html#rating-summary-multiple-ratings"},{title:"Rating hide label mixin",filename:"rating",url:"rating.html#rating-hide-label-mixin"},{title:"resets",filename:"resets",url:"resets.html"},{title:"Resets",filename:"resets",url:"resets.html#resets"},{title:"responsive",filename:"responsive",url:"responsive.html"},{title:"Responsive",filename:"responsive",url:"responsive.html#responsive"},{title:"Responsive mixins usage",filename:"responsive",url:"responsive.html#responsive-mixins-usage"},{title:"Media query style groups separation variables",filename:"responsive",url:"responsive.html#media-query-style-groups-separation-variables"},{title:"Responsive breakpoints",filename:"responsive",url:"responsive.html#responsive-breakpoints"},{title:"sections",filename:"sections",url:"sections.html"},{title:"Tabs and accordions",filename:"sections",url:"sections.html#tabs-and-accordions"},{title:"Tabs",filename:"sections",url:"sections.html#tabs"},{title:"Tabs mixin variables",filename:"sections",url:"sections.html#tabs-mixin-variables"},{title:"Tabs with content top border",filename:"sections",url:"sections.html#tabs-with-content-top-border"},{title:"Accordion",filename:"sections",url:"sections.html#accordion"},{title:"Accordion mixin variables",filename:"sections",url:"sections.html#accordion-mixin-variables"},{title:"Responsive tabs",filename:"sections",url:"sections.html#responsive-tabs"},{title:"Tabs Base",filename:"sections",url:"sections.html#tabs-base"},{title:"Accordion Base",filename:"sections",url:"sections.html#accordion-base"},{title:"tables",filename:"tables",url:"tables.html"},{title:"Tables",filename:"tables",url:"tables.html#tables"},{title:"Table mixin variables",filename:"tables",url:"tables.html#table-mixin-variables"},{title:"Table typography",filename:"tables",url:"tables.html#table-typography"},{title:"Table typography mixin variables",filename:"tables",url:"tables.html#table-typography-mixin-variables"},{title:"Table caption",filename:"tables",url:"tables.html#table-caption"},{title:"Table caption mixin variables",filename:"tables",url:"tables.html#table-caption-mixin-variables"},{title:"Table cells resize",filename:"tables",url:"tables.html#table-cells-resize"},{title:"Table cells resize variables",filename:"tables",url:"tables.html#table-cells-resize-variables"},{title:"Table background customization",filename:"tables",url:"tables.html#table-background-customization"},{title:"Table background mixin variables",filename:"tables",url:"tables.html#table-background-mixin-variables"},{title:"Table borders customization",filename:"tables",url:"tables.html#table-borders-customization"},{title:"Table borders mixin variables",filename:"tables",url:"tables.html#table-borders-mixin-variables"},{title:"Table with horizontal borders",filename:"tables",url:"tables.html#table-with-horizontal-borders"},{title:"Table with vertical borders",filename:"tables",url:"tables.html#table-with-vertical-borders"},{title:"Table with light borders",filename:"tables",url:"tables.html#table-with-light-borders"},{title:"Table without borders",filename:"tables",url:"tables.html#table-without-borders"},{title:"Striped table",filename:"tables",url:"tables.html#striped-table"},{title:"Striped table mixin variables",filename:"tables",url:"tables.html#striped-table-mixin-variables"},{title:"Table with rows hover",filename:"tables",url:"tables.html#table-with-rows-hover"},{title:"Table with rows hover mixin variables",filename:"tables",url:"tables.html#table-with-rows-hover-mixin-variables"},{title:"Responsive table technics #1",filename:"tables",url:"tables.html#responsive-table-technics-1"},{title:"Responsive table technics #2",filename:"tables",url:"tables.html#responsive-table-technics-2"},{title:"Responsive table technics #2 mixin variables",filename:"tables",url:"tables.html#responsive-table-technics-2-mixin-variables"},{title:"tooltips",filename:"tooltips",url:"tooltips.html"},{title:"Tooltips",filename:"tooltips",url:"tooltips.html#tooltips"},{title:"Tooltips variables",filename:"tooltips",url:"tooltips.html#tooltips-variables"},{title:"typography",filename:"typography",url:"typography.html"},{title:"Typogrphy",filename:"typography",url:"typography.html#typogrphy"},{title:"Typography variables",filename:"typography",url:"typography.html#typography-variables"},{title:"Font-size mixin",filename:"typography",url:"typography.html#fontsize-mixin"},{title:"Line-height mixin",filename:"typography",url:"typography.html#lineheight-mixin"},{title:"Word breaking mixin",filename:"typography",url:"typography.html#word-breaking-mixin"},{title:"Font face mixin",filename:"typography",url:"typography.html#font-face-mixin"},{title:"Text overflow mixin",filename:"typography",url:"typography.html#text-overflow-mixin"},{title:"Text hide",filename:"typography",url:"typography.html#text-hide"},{title:"Hyphens",filename:"typography",url:"typography.html#hyphens"},{title:"Font style and color",filename:"typography",url:"typography.html#font-style-and-color"},{title:"Font style mixin variables",filename:"typography",url:"typography.html#font-style-mixin-variables"},{title:"Reset list styles",filename:"typography",url:"typography.html#reset-list-styles"},{title:"Reset list styles variables",filename:"typography",url:"typography.html#reset-list-styles-variables"},{title:"Inline-block list item styling",filename:"typography",url:"typography.html#inlineblock-list-item-styling"},{title:"Link styling mixin",filename:"typography",url:"typography.html#link-styling-mixin"},{title:"Link styling mixin variables",filename:"typography",url:"typography.html#link-styling-mixin-variables"},{title:"Heading styling mixin",filename:"typography",url:"typography.html#heading-styling-mixin"},{title:"Base typography mixins",filename:"typography",url:"typography.html#base-typography-mixins"},{title:"Headings typography mixin",filename:"typography",url:"typography.html#headings-typography-mixin"},{title:"Typography links mixin",filename:"typography",url:"typography.html#typography-links-mixin"},{title:"Typography lists mixin",filename:"typography",url:"typography.html#typography-lists-mixin"},{title:"Typography code elements mixin",filename:"typography",url:"typography.html#typography-code-elements-mixin"},{title:"Typography blockquote",filename:"typography",url:"typography.html#typography-blockquote"},{title:"utilities",filename:"utilities",url:"utilities.html"},{title:"Utilities",filename:"utilities",url:"utilities.html#utilities"},{title:".clearfix()",filename:"utilities",url:"utilities.html#clearfix"},{title:".visibility-hidden()",filename:"utilities",url:"utilities.html#visibilityhidden"},{title:".visually-hidden()",filename:"utilities",url:"utilities.html#visuallyhidden"},{title:".visually-hidden-reset()",filename:"utilities",url:"utilities.html#visuallyhiddenreset"},{title:".css()",filename:"utilities",url:"utilities.html#css"},{title:".css() variables",filename:"utilities",url:"utilities.html#css-variables"},{title:".rotate()",filename:"utilities",url:"utilities.html#rotate"},{title:".rotate() variables",filename:"utilities",url:"utilities.html#rotate-variables"},{title:".input-placeholder()",filename:"utilities",url:"utilities.html#inputplaceholder"},{title:".input-placeholder() variables",filename:"utilities",url:"utilities.html#inputplaceholder-variables"},{title:".background-gradient()",filename:"utilities",url:"utilities.html#backgroundgradient"},{title:".background-gradient() variables",filename:"utilities",url:"utilities.html#backgroundgradient-variables"},{title:"variables",filename:"variables",url:"variables.html"},{title:"List of Global Variables",filename:"variables",url:"variables.html#list-of-global-variables"},{title:"Table with rows hover mixin variables",filename:"variables",url:"variables.html#table-with-rows-hover-mixin-variables"}];(function(){"use strict";var b=function(a,b){return Array.prototype.indexOf.call(a,b)!==-1},c=function(a,b){return Array.prototype.filter.call(a,b)},d=function(a,b){return Array.prototype.forEach.call(a,b)},e=document.getElementsByTagName("body")[0];e.addEventListener("click",function(a){var b=a.target;b.tagName.toLowerCase()==="svg"&&(b=b.parentNode);var c=!1;b.dataset.toggle!=null&&(a.preventDefault(),b.classList.contains("is-active")||(c=!0)),d(e.querySelectorAll("[data-toggle]"),function(a){a.classList.remove("is-active"),document.getElementById(a.dataset.toggle).hidden=!0}),c&&(b.classList.add("is-active"),document.getElementById(b.dataset.toggle).hidden=!1)}),function(){var f=e.getElementsByClassName("nav")[0];if(!f)return;var g=document.createElement("ul");g.className="nav-results",g.id="nav-search",g.hidden=!0,d(a,function(a){var b,c,d;b=document.createElement("li"),b._title=a.title.toLowerCase(),b.hidden=!0,b.appendChild(c=document.createElement("a")),c.href=a.url,c.innerHTML=a.title,c.appendChild(d=document.createElement("span")),d.innerHTML=a.filename,d.className="nav-results-filename",g.appendChild(b)}),f.appendChild(g);var h=g.children,i=function(a){d(h,function(a){a.hidden=!0});var b=this.value.toLowerCase(),e=[];b!==""&&(e=c(h,function(a){return a._title.indexOf(b)!==-1})),e.length>0?(d(e,function(a){a.hidden=!1}),g.hidden=!1):g.hidden=!0},j=f.querySelector('input[type="search"]');j.addEventListener("keyup",i),j.addEventListener("focus",i),e.addEventListener("click",function(a){if(a.target.classList&&a.target.classList.contains("search"))return;g.hidden=!0}),g.addEventListener("click",function(a){j.value=""});var k=document.createElement("ul");k.id="nav-toc",k.hidden=!0,k.className="nav-results toc-list",c(e.getElementsByTagName("*"),function(a){return b(["h1","h2","h3"],a.tagName.toLowerCase())}).map(function(a){var b=document.createElement("li"),c=document.createElement("a"),d=a.tagName.toLowerCase()[1];c.classList.add("level-"+d),b.appendChild(c),c.href="#"+a.id,c.innerHTML=a.innerHTML,k.appendChild(b)}),f.appendChild(k)}()})(),function(){"use strict";if(location.hash==="#__preview__"||location.protocol==="data:")return;var a=function(a,b){return Array.prototype.forEach.call(a,b)},b=function(a,b){var e=Array.prototype.slice.call(arguments,2);return d(a,function(a){return(c(b)?b||a:a[b]).apply(a,e)})},c=function(a){return Object.prototype.toString.call(a)==="[object Function]"},d=function(a,b){return Array.prototype.map.call(a,b)},e=function(a,b){return d(a,function(a){return a[b]})},f=function(a){var b={},c=a.split(";");for(var d=0;c.length>d;d++){var e=c[d].trim().split("=");b[e[0]]=e[1]}return b},g=function(a,c){return b(e(a,"classList"),"remove",c)},h=function(a,b){a.contentDocument.defaultView.postMessage(b,"*")},i=document.getElementsByTagName("head")[0],j=document.getElementsByTagName("body")[0],k=e(i.querySelectorAll('style[type="text/preview"]'),"innerHTML").join(""),l=e(i.querySelectorAll('script[type="text/preview"]'),"innerHTML").join(""),m=location.href.split("#")[0]+"#__preview__",n=document.createElement("iframe");n.src="data:text/html,",j.appendChild(n),n.addEventListener("load",function(){var b={sameOriginDataUri:!0};try{this.contentDocument,this.contentDocument||(b.sameOriginDataUri=!1)}catch(c){b.sameOriginDataUri=!1}this.parentNode.removeChild(this),a(j.getElementsByTagName("textarea"),function(a,c){o(a,b,c),q(),p(a)})});var o=function(a,b,c){var d,e,f;d=document.createElement("div"),d.appendChild(e=document.createElement("div")),d.className="preview",e.appendChild(f=document.createElement("iframe")),e.className="resizeable",f.setAttribute("scrolling","no"),f.name="iframe"+c++,f.addEventListener("load",function(){var c,d,e,f,g,i,j;j=this.contentDocument;if(!b.sameOriginDataUri&&this.src!==m)return;this.src===m&&(c=j.createElement("html"),c.appendChild(j.createElement("head")),c.appendChild(d=j.createElement("body")),d.innerHTML=a.textContent,j.replaceChild(c,j.documentElement)),g=j.createElement("head"),g.appendChild(f=j.createElement("style")),g.appendChild(e=j.createElement("script")),e.textContent=l,f.textContent=k,i=j.getElementsByTagName("head")[0],i.parentNode.replaceChild(g,i),h(this,"getHeight")});var g;b.sameOriginDataUri?g="data:text/html;charset=utf-8,"+encodeURIComponent("<!doctype html><html><head></head></body>"+a.textContent):g=m,f.setAttribute("src",g);var i=function(){f.contentDocument.body.innerHTML=this.value,h(f,"getHeight")};a.addEventListener("keypress",i),a.addEventListener("keyup",i),a.parentNode.insertBefore(d,a)},p=function(a){var b=document.createElement("div");b.className="preview-code",b.style.position="absolute",b.style.left="-9999px",j.appendChild(b);var c=parseInt(window.getComputedStyle(a).getPropertyValue("max-height"),10),d=function(a){b.textContent=this.value+"\n";var d=b.offsetHeight+2;d>=c?this.style.overflow="auto":this.style.overflow="hidden",this.style.height=b.offsetHeight+2+"px"};a.addEventListener("keypress",d),a.addEventListener("keyup",d),d.call(a)},q=function(){var b=j.getElementsByClassName("settings")[0],c=j.getElementsByClassName("resizeable"),d=30,e=function(b){document.cookie="preview-width="+b,a(c,function(a){b==="auto"&&(b=a.parentNode.offsetWidth),a.style.width=b+"px",h(a.getElementsByTagName("iframe")[0],"getHeight")})},i=f(document.cookie)["preview-width"];if(i){e(i),g(b.getElementsByClassName("is-active"),"is-active");var k=b.querySelector('button[data-width="'+i+'"]');k&&k.classList.add("is-active")}window.addEventListener("message",function(a){if(a.data==null||!a.source)return;var b=a.data,c=document.getElementsByName(a.source.name)[0];b.height!=null&&c&&(c.parentNode.style.height=b.height+d+"px")},!1),b&&c.length>0&&(b.hidden=!1,b.addEventListener("click",function(a){var c=a.target.tagName.toLowerCase(),d;if(c==="button")d=a.target;else{if(c!=="svg")return;d=a.target.parentNode}a.preventDefault(),g(b.getElementsByClassName("is-active"),"is-active"),d.classList.add("is-active");var f=d.dataset.width;e(f)}))}}()})()</script></body></html><!-- Generated with StyleDocco (http://jacobrask.github.com/styledocco). --> +</div><div class="code"><pre><code>.icons-image-list { + list-style: none; + padding: 0; + li { + float: left; + width: 33%; + > span { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + } + .icon-search { + .icon-sprite-position(0, 0); + } + .icon-cart { + .icon-sprite-position(1, 0); + } + .icon-arrow-down { + .icon-sprite-position(2, 0); + } + .icon-arrow-up { + .icon-sprite-position(3, 0); + } + .icon-grid { + .icon-sprite-position(4, 0); + } + .icon-list { + .icon-sprite-position(5, 0); + } + .icon-remove { + .icon-sprite-position(6, 0); + } + .icon-star { + .icon-sprite-position(7, 0); + } + .icon-pointer-down { + .icon-sprite-position(8, 0); + } + .icon-pointer-up { + .icon-sprite-position(9, 0); + } + .icon-pointer-left { + .icon-sprite-position(10, 0); + } + .icon-pointer-right { + .icon-sprite-position(11, 0); + } + .icon-compare-empty { + .icon-sprite-position(0, 1); + } + .icon-compare-full { + .icon-sprite-position(1, 1); + } + .icon-wishlist-empty { + .icon-sprite-position(2, 1); + } + .icon-wishlist-full { + .icon-sprite-position(3, 1); + } + .icon-update { + .icon-sprite-position(4, 1); + } + .icon-collapse { + .icon-sprite-position(5, 1); + } + .icon-expand { + .icon-sprite-position(6, 1); + } + .icon-menu { + .icon-sprite-position(7, 1); + } + .icon-prev { + .icon-sprite-position(8, 1); + } + .icon-next { + .icon-sprite-position(9, 1); + } + .icon-settings { + .icon-sprite-position(10, 1); + } + .icon-info { + .icon-sprite-position(11, 1); + } + .icon-checkmark { + .icon-sprite-position(0, 2); + } + .icon-calendar { + .icon-sprite-position(1, 2); + } + .icon-comment { + .icon-sprite-position(2, 2); + } + .icon-comment-reflected { + .icon-sprite-position(3, 2); + } + .icon-envelope { + .icon-sprite-position(4, 2); + } + .icon-warning { + .icon-sprite-position(5, 2); + } + .icon-trash { + .icon-sprite-position(6, 2); + } + .icon-flag { + .icon-sprite-position(7, 2); + } + .icon-location { + .icon-sprite-position(8, 2); + } + .icon-up { + .icon-sprite-position(9, 2); + } + .icon-down { + .icon-sprite-position(10, 2); + } + } +} + +@icon-wishlist-full: '\e600'; +@icon-wishlist-empty: '\e601'; +@icon-warning: '\e602'; +@icon-update: '\e603'; +@icon-trash: '\e604'; +@icon-star: '\e605'; +@icon-settings: '\e606'; +@icon-pointer-down: '\e607'; +@icon-next: '\e608'; +@icon-menu: '\e609'; +@icon-location: '\e60a'; +@icon-list: '\e60b'; +@icon-info: '\e60c'; +@icon-grid: '\e60d'; +@icon-comment-reflected: '\e60e'; +@icon-collapse: '\e60f'; +@icon-checkmark: '\e610'; +@icon-cart: '\e611'; +@icon-calendar: '\e612'; +@icon-arrow-up: '\e613'; +@icon-arrow-down: '\e614'; +@icon-search: '\e615'; +@icon-remove: '\e616'; +@icon-prev: '\e617'; +@icon-pointer-up: '\e618'; +@icon-pointer-right: '\e619'; +@icon-pointer-left: '\e61a'; +@icon-flag: '\e61b'; +@icon-expand: '\e61c'; +@icon-envelope: '\e61d'; +@icon-compare-full: '\e61e'; +@icon-compare-empty: '\e61f'; +@icon-comment: '\e620'; +@icon-up: '\e621'; +@icon-down: '\e622'; +@icon-arrow-up-thin: '\e623'; +@icon-arrow-right-thin: '\e624'; +@icon-arrow-left-thin: '\e625'; +@icon-arrow-down-thin: '\e626'; + +.icons-font-list { + list-style: none; + padding: 0; + li { + float: left; + width: 25%; + margin-bottom: 35px; + text-align: center; + > span { + .icon-font('', @_icon-font-size: 34px); + &:before { + content: attr(data-icon); + margin: 0 auto; + display: block; + } + } + } +}</code></pre></div></article></section><div class="bar bottom"><div hidden class="settings container"><!-- Icons from http://iconmonstr.com--><button title="Desktop (1280)" data-width='1280'><svg viewBox="0 0 412 386" height="24" width="26" class="icon"><path d="m147.6,343.9c-4.5,15.9-26.2,37.6-42.1,42.1h201c-15.3,-4-38.1,-26.8-42.1,-42.1H147.6zM387,0.5H25c-13.8,0-25,11.2-25,25V294c0,13.8 11.2,25 25,25h362c13.8,0 25,-11.2 25,-25V25.5C412,11.7 400.8,0.5 387,0.5zM369.9,238.2H42.1L42.1,42.6 369.9,42.6V238.2z"></path></svg></button><button title="Laptop (1024)" data-width='1024'><svg viewBox="0 0 384 312" height="23" width="28" class="icon"><path d="m349.2,20.5c0,-11-9,-20-20,-20H53.6c-11,0-20,9-20,20v194H349.2v-194zm-27,167H60.6V27.5H322.2v160zm28,42H32.6L2.6,282.1c-3.5,6.2-3.5,13.8 0.1,19.9 3.6,6.2 10.2,9.9 17.3,9.9H363.1c7.1,0 13.7,-3.8 17.3,-10 3.6,-6.2 3.6,-13.8 0,-20l-30.2,-52.5zm-196.9,54 8,-23.5h60.5l8,23.5h-76.5z"></path></svg></button><button title="Tablet (768)" data-width='768'><svg viewBox="0 0 317 412" height="24" width="18" class="icon"><path d="M 316.5,380 V 32 c 0,-17.7 -14.3,-32 -32,-32 H 32 C 14.3,0 0,14.3 0,32 v 348 c 0,17.7 14.3,32 32,32 h 252.5 c 17.7,0 32,-14.3 32,-32 z M 40,367 V 45 H 276.5 V 367 H 40 z m 109.8,22.7 c 0,-4.7 3.8,-8.5 8.5,-8.5 4.7,0 8.5,3.8 8.5,8.5 0,4.7 -3.8,8.5 -8.5,8.5 -4.7,0 -8.5,-3.8 -8.5,-8.5 z"></path></svg></button><button title="Smart phone (320)" data-width='320'><svg viewBox="0 0 224 412" height="24" width="13" class="icon"><path d="M 190.7,0 H 33 C 14.8,0 0,14.8 0,33 v 346 c 0,18.2 14.8,33 33,33 h 157.7 c 18.2,0 33,-14.8 33,-33 V 33 c 0,-18.2 -14.8,-33 -33,-33 z M 94.3,30.2 h 37 c 2.2,0 4,1.8 4,4 0,2.2 -1.8,4 -4,4 h -37 c -2.2,0 -4,-1.8 -4,-4 0,-2.2 1.8,-4 4,-4 z m 18.5,362.8 c -8.8,0 -16,-7.2 -16,-16 0,-8.8 7.2,-16 16,-16 8.8,0 16,7.2 16,16 0,8.8 -7.2,16 -16,16 z M 198.6,343.8 H 25.1 V 68.2 h 173.5 v 275.5 z"></path></svg></button><button title="Feature phone (240)" data-width='240'><svg viewBox="0 0 201 412" height="24" width="12" class="icon"><path d="M 165.5,0.2 V 45 H 25 c -13.8,0 -25,11.2 -25,25 V 387 c 0,13.8 11.2,25 25,25 h 150.5 c 13.8,0 25,-11.2 25,-25 V 0.2 h -35 z M 65.2,366.5 H 34.2 v -24.5 h 31 v 24.5 z m 0,-44.3 H 34.2 v -24.5 h 31 v 24.5 z m 50.5,44.3 H 84.7 v -24.5 h 31 v 24.5 z m 0,-44.3 H 84.7 v -24.5 h 31 v 24.5 z m 50.5,44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-59.3 h -132 V 95.4 h 132 V 262.9 z"></path></svg></button><button title="Auto (100%)" data-width="auto" class="auto is-active">Auto</button></div></div><script>(function(){var a=[{title:"actions-toolbar",filename:"actions-toolbar",url:"actions-toolbar.html"},{title:"",filename:"actions-toolbar",url:"actions-toolbar.html#"},{title:"Actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar"},{title:"Actions toolbar mixin variables",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-mixin-variables"},{title:"Actions toolbar alignment",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-alignment"},{title:"Reverse primary and secondary blocks",filename:"actions-toolbar",url:"actions-toolbar.html#reverse-primary-and-secondary-blocks"},{title:"Actions toolbar indents customizations",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-indents-customizations"},{title:"Responsive actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#responsive-actions-toolbar"},{title:"breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html"},{title:"",filename:"breadcrumbs",url:"breadcrumbs.html#"},{title:"Breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs"},{title:"Breadcrumbs variables",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-variables"},{title:"Button-styled breadcrumbs with gradient background, border, and no separating symbol",filename:"breadcrumbs",url:"breadcrumbs.html#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol"},{title:"Breadcrumbs with solid background",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-with-solid-background"},{title:"buttons",filename:"buttons",url:"buttons.html"},{title:"",filename:"buttons",url:"buttons.html#"},{title:"Default button",filename:"buttons",url:"buttons.html#default-button"},{title:"Button variables",filename:"buttons",url:"buttons.html#button-variables"},{title:"Button as an icon",filename:"buttons",url:"buttons.html#button-as-an-icon"},{title:"Button with an icon on the left or right side of the text",filename:"buttons",url:"buttons.html#button-with-an-icon-on-the-left-or-right-side-of-the-text"},{title:"Button with fixed width",filename:"buttons",url:"buttons.html#button-with-fixed-width"},{title:"Primary button",filename:"buttons",url:"buttons.html#primary-button"},{title:"Primary button variables",filename:"buttons",url:"buttons.html#primary-button-variables"},{title:"Button with gradient background",filename:"buttons",url:"buttons.html#button-with-gradient-background"},{title:"Button as a link",filename:"buttons",url:"buttons.html#button-as-a-link"},{title:"Button as a link variables",filename:"buttons",url:"buttons.html#button-as-a-link-variables"},{title:"Link as a button",filename:"buttons",url:"buttons.html#link-as-a-button"},{title:"Button reset",filename:"buttons",url:"buttons.html#button-reset"},{title:"Button revert secondary color",filename:"buttons",url:"buttons.html#button-revert-secondary-color"},{title:"Button revert secondary color variables",filename:"buttons",url:"buttons.html#button-revert-secondary-color-variables"},{title:"Button revert secondary size",filename:"buttons",url:"buttons.html#button-revert-secondary-size"},{title:"Button revert secondary size variables",filename:"buttons",url:"buttons.html#button-revert-secondary-size-variables"},{title:"docs",filename:"docs",url:"docs.html"},{title:"",filename:"docs",url:"docs.html#"},{title:"Documentation",filename:"docs",url:"docs.html#documentation"},{title:"dropdowns",filename:"dropdowns",url:"dropdowns.html"},{title:"",filename:"dropdowns",url:"dropdowns.html#"},{title:"Drop-down and split buttons mixins",filename:"dropdowns",url:"dropdowns.html#dropdown-and-split-buttons-mixins"},{title:"Drop-down",filename:"dropdowns",url:"dropdowns.html#dropdown"},{title:"Drop-down variables",filename:"dropdowns",url:"dropdowns.html#dropdown-variables"},{title:"Drop-down with icon customization",filename:"dropdowns",url:"dropdowns.html#dropdown-with-icon-customization"},{title:"Modify dropdown list styles",filename:"dropdowns",url:"dropdowns.html#modify-dropdown-list-styles"},{title:"Split button",filename:"dropdowns",url:"dropdowns.html#split-button"},{title:"Split button variables",filename:"dropdowns",url:"dropdowns.html#split-button-variables"},{title:"Split button - button styling",filename:"dropdowns",url:"dropdowns.html#split-button-button-styling"},{title:"Split button icon customization",filename:"dropdowns",url:"dropdowns.html#split-button-icon-customization"},{title:"Split button drop-down list customization",filename:"dropdowns",url:"dropdowns.html#split-button-dropdown-list-customization"},{title:"forms",filename:"forms",url:"forms.html"},{title:"",filename:"forms",url:"forms.html#"},{title:"Forms mixins",filename:"forms",url:"forms.html#forms-mixins"},{title:"Global forms elements customization",filename:"forms",url:"forms.html#global-forms-elements-customization"},{title:"Fieldsets & fields customization",filename:"forms",url:"forms.html#fieldsets-fields-customization"},{title:"Fieldset and legend customization variables",filename:"forms",url:"forms.html#fieldset-and-legend-customization-variables"},{title:"Fields customization variables",filename:"forms",url:"forms.html#fields-customization-variables"},{title:"Required fields message customization variables",filename:"forms",url:"forms.html#required-fields-message-customization-variables"},{title:"Form element inputs customization",filename:"forms",url:"forms.html#form-element-inputs-customization"},{title:"Form element inputs customization variables",filename:"forms",url:"forms.html#form-element-inputs-customization-variables"},{title:"Form element choice",filename:"forms",url:"forms.html#form-element-choice"},{title:"Form element choice variables",filename:"forms",url:"forms.html#form-element-choice-variables"},{title:"Custom color",filename:"forms",url:"forms.html#custom-color"},{title:"Input number - input-text view",filename:"forms",url:"forms.html#input-number-inputtext-view"},{title:"Input search - input-text view",filename:"forms",url:"forms.html#input-search-inputtext-view"},{title:"Form validation",filename:"forms",url:"forms.html#form-validation"},{title:"Form validation variables// <pre>",filename:"forms",url:"forms.html#form-validation-variables-pre"},{title:"icons",filename:"icons",url:"icons.html"},{title:"Icons",filename:"icons",url:"icons.html#icons"},{title:"Icon with image or sprite",filename:"icons",url:"icons.html#icon-with-image-or-sprite"},{title:"Icon with image or sprite variables",filename:"icons",url:"icons.html#icon-with-image-or-sprite-variables"},{title:"Icon position for an icon with image or sprite",filename:"icons",url:"icons.html#icon-position-for-an-icon-with-image-or-sprite"},{title:"Position for icon with image or sprite mixin variables",filename:"icons",url:"icons.html#position-for-icon-with-image-or-sprite-mixin-variables"},{title:"Icon sprite position (with grid)",filename:"icons",url:"icons.html#icon-sprite-position-with-grid"},{title:"Icon sprite position variables",filename:"icons",url:"icons.html#icon-sprite-position-variables"},{title:"Image/sprite icon size",filename:"icons",url:"icons.html#imagesprite-icon-size"},{title:"Image/sprite icon size variables",filename:"icons",url:"icons.html#imagesprite-icon-size-variables"},{title:"Font icon",filename:"icons",url:"icons.html#font-icon"},{title:"Font icon variables",filename:"icons",url:"icons.html#font-icon-variables"},{title:"Change the size of font icon",filename:"icons",url:"icons.html#change-the-size-of-font-icon"},{title:"Change the size of font icon variables",filename:"icons",url:"icons.html#change-the-size-of-font-icon-variables"},{title:"Hide icon text",filename:"icons",url:"icons.html#hide-icon-text"},{title:"Sprite and font icons for Blank theme",filename:"icons",url:"icons.html#sprite-and-font-icons-for-blank-theme"},{title:"layout",filename:"layout",url:"layout.html"},{title:"",filename:"layout",url:"layout.html#"},{title:"Layout",filename:"layout",url:"layout.html#layout"},{title:"Layout global variables",filename:"layout",url:"layout.html#layout-global-variables"},{title:"Page layouts",filename:"layout",url:"layout.html#page-layouts"},{title:"Layout column",filename:"layout",url:"layout.html#layout-column"},{title:"Layout column variables",filename:"layout",url:"layout.html#layout-column-variables"},{title:"Layout width",filename:"layout",url:"layout.html#layout-width"},{title:"Layout width variables",filename:"layout",url:"layout.html#layout-width-variables"},{title:"lib",filename:"lib",url:"lib.html"},{title:"",filename:"lib",url:"lib.html#"},{title:"Including Magento UI library to your theme",filename:"lib",url:"lib.html#including-magento-ui-library-to-your-theme"},{title:"loaders",filename:"loaders",url:"loaders.html"},{title:"",filename:"loaders",url:"loaders.html#"},{title:"Loaders",filename:"loaders",url:"loaders.html#loaders"},{title:"Default loader variables",filename:"loaders",url:"loaders.html#default-loader-variables"},{title:"Loading",filename:"loaders",url:"loaders.html#loading"},{title:"Loading default variables",filename:"loaders",url:"loaders.html#loading-default-variables"},{title:"messages",filename:"messages",url:"messages.html"},{title:"",filename:"messages",url:"messages.html#"},{title:"Messages",filename:"messages",url:"messages.html#messages"},{title:"Information message",filename:"messages",url:"messages.html#information-message"},{title:"Warning message",filename:"messages",url:"messages.html#warning-message"},{title:"Error message",filename:"messages",url:"messages.html#error-message"},{title:"Success message",filename:"messages",url:"messages.html#success-message"},{title:"Notice message",filename:"messages",url:"messages.html#notice-message"},{title:"Message with inner icon",filename:"messages",url:"messages.html#message-with-inner-icon"},{title:"Message with lateral icon",filename:"messages",url:"messages.html#message-with-lateral-icon"},{title:"Custom message style",filename:"messages",url:"messages.html#custom-message-style"},{title:"Messages global variables",filename:"messages",url:"messages.html#messages-global-variables"},{title:"pages",filename:"pages",url:"pages.html"},{title:"",filename:"pages",url:"pages.html#"},{title:"Pagination HTML markup",filename:"pages",url:"pages.html#pagination-html-markup"},{title:"Pagination variables",filename:"pages",url:"pages.html#pagination-variables"},{title:"Pagination with label and gradient background on links",filename:"pages",url:"pages.html#pagination-with-label-and-gradient-background-on-links"},{title:'Pagination with "previous"..."next" text links and label',filename:"pages",url:"pages.html#pagination-with-previousnext-text-links-and-label"},{title:"Pagination without label, with solid background",filename:"pages",url:"pages.html#pagination-without-label-with-solid-background"},{title:"popups",filename:"popups",url:"popups.html"},{title:"",filename:"popups",url:"popups.html#"},{title:"Popups",filename:"popups",url:"popups.html#popups"},{title:"Popup variables",filename:"popups",url:"popups.html#popup-variables"},{title:"Window overlay mixin variables",filename:"popups",url:"popups.html#window-overlay-mixin-variables"},{title:"Fixed height popup",filename:"popups",url:"popups.html#fixed-height-popup"},{title:"Fixed content height popup",filename:"popups",url:"popups.html#fixed-content-height-popup"},{title:"Margins for header, content and footer block in popup",filename:"popups",url:"popups.html#margins-for-header-content-and-footer-block-in-popup"},{title:"Popup titles styled as theme headings",filename:"popups",url:"popups.html#popup-titles-styled-as-theme-headings"},{title:"Popup action toolbar",filename:"popups",url:"popups.html#popup-action-toolbar"},{title:"Popup Close button without an icon",filename:"popups",url:"popups.html#popup-close-button-without-an-icon"},{title:"Modify the icon of popup Close button",filename:"popups",url:"popups.html#modify-the-icon-of-popup-close-button"},{title:"Modify overlay styles",filename:"popups",url:"popups.html#modify-overlay-styles"},{title:"rating",filename:"rating",url:"rating.html"},{title:"",filename:"rating",url:"rating.html#"},{title:"Ratings",filename:"rating",url:"rating.html#ratings"},{title:"Global rating variables",filename:"rating",url:"rating.html#global-rating-variables"},{title:"Rating with vote",filename:"rating",url:"rating.html#rating-with-vote"},{title:"Rating with vote icons number customization",filename:"rating",url:"rating.html#rating-with-vote-icons-number-customization"},{title:"Rating with vote icons colors customization",filename:"rating",url:"rating.html#rating-with-vote-icons-colors-customization"},{title:"Rating with vote icons symbol customization",filename:"rating",url:"rating.html#rating-with-vote-icons-symbol-customization"},{title:"Accessible rating with vote",filename:"rating",url:"rating.html#accessible-rating-with-vote"},{title:"Rating summary",filename:"rating",url:"rating.html#rating-summary"},{title:"Rating summary icons number customization",filename:"rating",url:"rating.html#rating-summary-icons-number-customization"},{title:"Rating summary icons color customization",filename:"rating",url:"rating.html#rating-summary-icons-color-customization"},{title:"Rating summary icons symbol customization",filename:"rating",url:"rating.html#rating-summary-icons-symbol-customization"},{title:"Rating summary hide label",filename:"rating",url:"rating.html#rating-summary-hide-label"},{title:"Rating summary multiple ratings",filename:"rating",url:"rating.html#rating-summary-multiple-ratings"},{title:"Rating hide label mixin",filename:"rating",url:"rating.html#rating-hide-label-mixin"},{title:"resets",filename:"resets",url:"resets.html"},{title:"",filename:"resets",url:"resets.html#"},{title:"Resets",filename:"resets",url:"resets.html#resets"},{title:"responsive",filename:"responsive",url:"responsive.html"},{title:"",filename:"responsive",url:"responsive.html#"},{title:"Responsive",filename:"responsive",url:"responsive.html#responsive"},{title:"Responsive mixins usage",filename:"responsive",url:"responsive.html#responsive-mixins-usage"},{title:"Media query style groups separation variables",filename:"responsive",url:"responsive.html#media-query-style-groups-separation-variables"},{title:"Responsive breakpoints",filename:"responsive",url:"responsive.html#responsive-breakpoints"},{title:"sections",filename:"sections",url:"sections.html"},{title:"",filename:"sections",url:"sections.html#"},{title:"Tabs and accordions",filename:"sections",url:"sections.html#tabs-and-accordions"},{title:"Tabs",filename:"sections",url:"sections.html#tabs"},{title:"Tabs mixin variables",filename:"sections",url:"sections.html#tabs-mixin-variables"},{title:"Tabs with content top border",filename:"sections",url:"sections.html#tabs-with-content-top-border"},{title:"Accordion",filename:"sections",url:"sections.html#accordion"},{title:"Accordion mixin variables",filename:"sections",url:"sections.html#accordion-mixin-variables"},{title:"Responsive tabs",filename:"sections",url:"sections.html#responsive-tabs"},{title:"Tabs Base",filename:"sections",url:"sections.html#tabs-base"},{title:"Accordion Base",filename:"sections",url:"sections.html#accordion-base"},{title:"tables",filename:"tables",url:"tables.html"},{title:"",filename:"tables",url:"tables.html#"},{title:"Tables",filename:"tables",url:"tables.html#tables"},{title:"Table mixin variables",filename:"tables",url:"tables.html#table-mixin-variables"},{title:"Table typography",filename:"tables",url:"tables.html#table-typography"},{title:"Table typography mixin variables",filename:"tables",url:"tables.html#table-typography-mixin-variables"},{title:"Table caption",filename:"tables",url:"tables.html#table-caption"},{title:"Table caption mixin variables",filename:"tables",url:"tables.html#table-caption-mixin-variables"},{title:"Table cells resize",filename:"tables",url:"tables.html#table-cells-resize"},{title:"Table cells resize variables",filename:"tables",url:"tables.html#table-cells-resize-variables"},{title:"Table background customization",filename:"tables",url:"tables.html#table-background-customization"},{title:"Table background mixin variables",filename:"tables",url:"tables.html#table-background-mixin-variables"},{title:"Table borders customization",filename:"tables",url:"tables.html#table-borders-customization"},{title:"Table borders mixin variables",filename:"tables",url:"tables.html#table-borders-mixin-variables"},{title:"Table with horizontal borders",filename:"tables",url:"tables.html#table-with-horizontal-borders"},{title:"Table with vertical borders",filename:"tables",url:"tables.html#table-with-vertical-borders"},{title:"Table with light borders",filename:"tables",url:"tables.html#table-with-light-borders"},{title:"Table without borders",filename:"tables",url:"tables.html#table-without-borders"},{title:"Striped table",filename:"tables",url:"tables.html#striped-table"},{title:"Striped table mixin variables",filename:"tables",url:"tables.html#striped-table-mixin-variables"},{title:"Table with rows hover",filename:"tables",url:"tables.html#table-with-rows-hover"},{title:"Table with rows hover mixin variables",filename:"tables",url:"tables.html#table-with-rows-hover-mixin-variables"},{title:"Responsive table technics #1",filename:"tables",url:"tables.html#responsive-table-technics-1"},{title:"Responsive table technics #2",filename:"tables",url:"tables.html#responsive-table-technics-2"},{title:"Responsive table technics #2 mixin variables",filename:"tables",url:"tables.html#responsive-table-technics-2-mixin-variables"},{title:"tooltips",filename:"tooltips",url:"tooltips.html"},{title:"",filename:"tooltips",url:"tooltips.html#"},{title:"Tooltips",filename:"tooltips",url:"tooltips.html#tooltips"},{title:"Tooltips variables",filename:"tooltips",url:"tooltips.html#tooltips-variables"},{title:"typography",filename:"typography",url:"typography.html"},{title:"",filename:"typography",url:"typography.html#"},{title:"Typogrphy",filename:"typography",url:"typography.html#typogrphy"},{title:"Typography variables",filename:"typography",url:"typography.html#typography-variables"},{title:"Font-size mixin",filename:"typography",url:"typography.html#fontsize-mixin"},{title:"Line-height mixin",filename:"typography",url:"typography.html#lineheight-mixin"},{title:"Word breaking mixin",filename:"typography",url:"typography.html#word-breaking-mixin"},{title:"Font face mixin",filename:"typography",url:"typography.html#font-face-mixin"},{title:"Text overflow mixin",filename:"typography",url:"typography.html#text-overflow-mixin"},{title:"Text hide",filename:"typography",url:"typography.html#text-hide"},{title:"Hyphens",filename:"typography",url:"typography.html#hyphens"},{title:"Font style and color",filename:"typography",url:"typography.html#font-style-and-color"},{title:"Font style mixin variables",filename:"typography",url:"typography.html#font-style-mixin-variables"},{title:"Reset list styles",filename:"typography",url:"typography.html#reset-list-styles"},{title:"Reset list styles variables",filename:"typography",url:"typography.html#reset-list-styles-variables"},{title:"Inline-block list item styling",filename:"typography",url:"typography.html#inlineblock-list-item-styling"},{title:"Link styling mixin",filename:"typography",url:"typography.html#link-styling-mixin"},{title:"Link styling mixin variables",filename:"typography",url:"typography.html#link-styling-mixin-variables"},{title:"Heading styling mixin",filename:"typography",url:"typography.html#heading-styling-mixin"},{title:"Base typography mixins",filename:"typography",url:"typography.html#base-typography-mixins"},{title:"Headings typography mixin",filename:"typography",url:"typography.html#headings-typography-mixin"},{title:"Typography links mixin",filename:"typography",url:"typography.html#typography-links-mixin"},{title:"Typography lists mixin",filename:"typography",url:"typography.html#typography-lists-mixin"},{title:"Typography code elements mixin",filename:"typography",url:"typography.html#typography-code-elements-mixin"},{title:"Typography blockquote",filename:"typography",url:"typography.html#typography-blockquote"},{title:"utilities",filename:"utilities",url:"utilities.html"},{title:"",filename:"utilities",url:"utilities.html#"},{title:"Utilities",filename:"utilities",url:"utilities.html#utilities"},{title:".clearfix()",filename:"utilities",url:"utilities.html#clearfix"},{title:".visibility-hidden()",filename:"utilities",url:"utilities.html#visibilityhidden"},{title:".visually-hidden()",filename:"utilities",url:"utilities.html#visuallyhidden"},{title:".visually-hidden-reset()",filename:"utilities",url:"utilities.html#visuallyhiddenreset"},{title:".css()",filename:"utilities",url:"utilities.html#css"},{title:".css() variables",filename:"utilities",url:"utilities.html#css-variables"},{title:".rotate()",filename:"utilities",url:"utilities.html#rotate"},{title:".rotate() variables",filename:"utilities",url:"utilities.html#rotate-variables"},{title:".input-placeholder()",filename:"utilities",url:"utilities.html#inputplaceholder"},{title:".input-placeholder() variables",filename:"utilities",url:"utilities.html#inputplaceholder-variables"},{title:".background-gradient()",filename:"utilities",url:"utilities.html#backgroundgradient"},{title:".background-gradient() variables",filename:"utilities",url:"utilities.html#backgroundgradient-variables"},{title:"variables",filename:"variables",url:"variables.html"},{title:"",filename:"variables",url:"variables.html#"},{title:"List of Global Variables",filename:"variables",url:"variables.html#list-of-global-variables"},{title:"Table with rows hover mixin variables",filename:"variables",url:"variables.html#table-with-rows-hover-mixin-variables"}];(function(){"use strict";var b=function(a,b){return Array.prototype.indexOf.call(a,b)!==-1},c=function(a,b){return Array.prototype.filter.call(a,b)},d=function(a,b){return Array.prototype.forEach.call(a,b)},e=document.getElementsByTagName("body")[0];e.addEventListener("click",function(a){var b=a.target;b.tagName.toLowerCase()==="svg"&&(b=b.parentNode);var c=!1;b.dataset.toggle!=null&&(a.preventDefault(),b.classList.contains("is-active")||(c=!0)),d(e.querySelectorAll("[data-toggle]"),function(a){a.classList.remove("is-active"),document.getElementById(a.dataset.toggle).hidden=!0}),c&&(b.classList.add("is-active"),document.getElementById(b.dataset.toggle).hidden=!1)}),function(){var f=e.getElementsByClassName("nav")[0];if(!f)return;var g=document.createElement("ul");g.className="nav-results",g.id="nav-search",g.hidden=!0,d(a,function(a){var b,c,d;b=document.createElement("li"),b._title=a.title.toLowerCase(),b.hidden=!0,b.appendChild(c=document.createElement("a")),c.href=a.url,c.innerHTML=a.title,c.appendChild(d=document.createElement("span")),d.innerHTML=a.filename,d.className="nav-results-filename",g.appendChild(b)}),f.appendChild(g);var h=g.children,i=function(a){d(h,function(a){a.hidden=!0});var b=this.value.toLowerCase(),e=[];b!==""&&(e=c(h,function(a){return a._title.indexOf(b)!==-1})),e.length>0?(d(e,function(a){a.hidden=!1}),g.hidden=!1):g.hidden=!0},j=f.querySelector('input[type="search"]');j.addEventListener("keyup",i),j.addEventListener("focus",i),e.addEventListener("click",function(a){if(a.target.classList&&a.target.classList.contains("search"))return;g.hidden=!0}),g.addEventListener("click",function(a){j.value=""});var k=document.createElement("ul");k.id="nav-toc",k.hidden=!0,k.className="nav-results toc-list",c(e.getElementsByTagName("*"),function(a){return b(["h1","h2","h3"],a.tagName.toLowerCase())}).map(function(a){var b=document.createElement("li"),c=document.createElement("a"),d=a.tagName.toLowerCase()[1];c.classList.add("level-"+d),b.appendChild(c),c.href="#"+a.id,c.innerHTML=a.innerHTML,k.appendChild(b)}),f.appendChild(k)}()})(),function(){"use strict";if(location.hash==="#__preview__"||location.protocol==="data:")return;var a=function(a,b){return Array.prototype.forEach.call(a,b)},b=function(a,b){var e=Array.prototype.slice.call(arguments,2);return d(a,function(a){return(c(b)?b||a:a[b]).apply(a,e)})},c=function(a){return Object.prototype.toString.call(a)==="[object Function]"},d=function(a,b){return Array.prototype.map.call(a,b)},e=function(a,b){return d(a,function(a){return a[b]})},f=function(a){var b={},c=a.split(";");for(var d=0;c.length>d;d++){var e=c[d].trim().split("=");b[e[0]]=e[1]}return b},g=function(a,c){return b(e(a,"classList"),"remove",c)},h=function(a,b){a.contentDocument.defaultView.postMessage(b,"*")},i=document.getElementsByTagName("head")[0],j=document.getElementsByTagName("body")[0],k=e(i.querySelectorAll('style[type="text/preview"]'),"innerHTML").join(""),l=e(i.querySelectorAll('script[type="text/preview"]'),"innerHTML").join(""),m=location.href.split("#")[0]+"#__preview__",n=document.createElement("iframe");n.src="data:text/html,",j.appendChild(n),n.addEventListener("load",function(){var b={sameOriginDataUri:!0};try{this.contentDocument,this.contentDocument||(b.sameOriginDataUri=!1)}catch(c){b.sameOriginDataUri=!1}this.parentNode.removeChild(this),a(j.getElementsByTagName("textarea"),function(a,c){o(a,b,c),q(),p(a)})});var o=function(a,b,c){var d,e,f;d=document.createElement("div"),d.appendChild(e=document.createElement("div")),d.className="preview",e.appendChild(f=document.createElement("iframe")),e.className="resizeable",f.setAttribute("scrolling","no"),f.name="iframe"+c++,f.addEventListener("load",function(){var c,d,e,f,g,i,j;j=this.contentDocument;if(!b.sameOriginDataUri&&this.src!==m)return;this.src===m&&(c=j.createElement("html"),c.appendChild(j.createElement("head")),c.appendChild(d=j.createElement("body")),d.innerHTML=a.textContent,j.replaceChild(c,j.documentElement)),g=j.createElement("head"),g.appendChild(f=j.createElement("style")),g.appendChild(e=j.createElement("script")),e.textContent=l,f.textContent=k,i=j.getElementsByTagName("head")[0],i.parentNode.replaceChild(g,i),h(this,"getHeight")});var g;b.sameOriginDataUri?g="data:text/html;charset=utf-8,"+encodeURIComponent("<!doctype html><html><head></head></body>"+a.textContent):g=m,f.setAttribute("src",g);var i=function(){f.contentDocument.body.innerHTML=this.value,h(f,"getHeight")};a.addEventListener("keypress",i),a.addEventListener("keyup",i),a.parentNode.insertBefore(d,a)},p=function(a){var b=document.createElement("div");b.className="preview-code",b.style.position="absolute",b.style.left="-9999px",j.appendChild(b);var c=parseInt(window.getComputedStyle(a).getPropertyValue("max-height"),10),d=function(a){b.textContent=this.value+"\n";var d=b.offsetHeight+2;d>=c?this.style.overflow="auto":this.style.overflow="hidden",this.style.height=b.offsetHeight+2+"px"};a.addEventListener("keypress",d),a.addEventListener("keyup",d),d.call(a)},q=function(){var b=j.getElementsByClassName("settings")[0],c=j.getElementsByClassName("resizeable"),d=30,e=function(b){document.cookie="preview-width="+b,a(c,function(a){b==="auto"&&(b=a.parentNode.offsetWidth),a.style.width=b+"px",h(a.getElementsByTagName("iframe")[0],"getHeight")})},i=f(document.cookie)["preview-width"];if(i){e(i),g(b.getElementsByClassName("is-active"),"is-active");var k=b.querySelector('button[data-width="'+i+'"]');k&&k.classList.add("is-active")}window.addEventListener("message",function(a){if(a.data==null||!a.source)return;var b=a.data,c=document.getElementsByName(a.source.name)[0];b.height!=null&&c&&(c.parentNode.style.height=b.height+d+"px")},!1),b&&c.length>0&&(b.hidden=!1,b.addEventListener("click",function(a){var c=a.target.tagName.toLowerCase(),d;if(c==="button")d=a.target;else{if(c!=="svg")return;d=a.target.parentNode}a.preventDefault(),g(b.getElementsByClassName("is-active"),"is-active"),d.classList.add("is-active");var f=d.dataset.width;e(f)}))}}()})()</script></body></html><!-- Generated with StyleDocco (http://jacobrask.github.com/styledocco). --> diff --git a/lib/web/css/docs/source/forms.less b/lib/web/css/docs/source/forms.less index f3fd20c0c88c4dd0748c90677499b5d92121bdb9..ec9a19e5ce052d980541ea28d4b49755d645375a 100644 --- a/lib/web/css/docs/source/forms.less +++ b/lib/web/css/docs/source/forms.less @@ -27,7 +27,7 @@ // ```html // <form class="example-form-1"> // <fieldset class="example-form-1-fieldset" data-hasrequired="* Required Fields"> -// <legend class="legend"><span>Login Information</span></legend><br> +// <legend class="legend"><span>Sign-in Information</span></legend><br> // // <div class="field password required"> // <label for="password" class="label"><span>Password</span></label> diff --git a/lib/web/css/docs/source/icons.less b/lib/web/css/docs/source/icons.less index 97f05c59a017f916960128dceb9314f94e8dd93f..355ece1b150e82fd16b0534c4ed34ddb63bf10aa 100644 --- a/lib/web/css/docs/source/icons.less +++ b/lib/web/css/docs/source/icons.less @@ -685,6 +685,12 @@ // <li> // <span class="icon-arrow-down-thin" data-icon=""><span>@icon-arrow-down-thin</span></span> // </li> +// <li> +// <span class="icon-arrow-left-thin" data-icon=""><span>@icon-gift-registry</span></span> +// </li> +// <li> +// <span class="icon-arrow-down-thin" data-icon=""><span>@icon-present</span></span> +// </li> // </ul> // ``` diff --git a/lib/web/css/source/lib/variables/_icons.less b/lib/web/css/source/lib/variables/_icons.less index 443228833b6d87e93c4030cac230ad50f2c55ad6..999e9c2cf7922b5a9acb500e499ba271a116e992 100644 --- a/lib/web/css/source/lib/variables/_icons.less +++ b/lib/web/css/source/lib/variables/_icons.less @@ -80,3 +80,5 @@ @icon-arrow-left-thin: '\e625'; @icon-arrow-down-thin: '\e626'; @icon-account: '\e627'; +@icon-gift-registry: '\e628'; +@icon-present: '\e629'; diff --git a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot index 62bdd2789b80e4759cfb379c307f2186aafce389..9bc3197afaa63854e2a13d3f79f31488bf1fe4db 100644 Binary files a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot and b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.eot differ diff --git a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg index d92883dcfa582968714e1932df979ab965effc2f..85f6bf6ddeca82ba961382a061b92c7b6da011b7 100644 --- a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg +++ b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg"><defs><font horiz-adv-x="1024"><font-face units-per-em="1024" ascent="960" descent="-64"/><glyph horiz-adv-x="512"/><glyph unicode="" d="M676.57 637.696c-59.866 28.197-131.254 2.523-159.414-57.307-1.975-4.14-3.657-9.368-5.157-15.4-1.5 6.03-3.188 11.26-5.16 15.394-28.2 59.83-99.55 85.503-159.418 57.306-59.83-28.196-85.504-99.546-57.27-159.377 28.197-59.865 221.805-231.42 221.805-231.42s0 .22.036.584c.036-.37.036-.588.036-.588s193.65 171.555 221.81 231.423c28.23 59.83 2.595 131.182-57.27 159.378z"/><glyph unicode="î˜" d="M676.57 637.696c-59.83 28.197-131.217 2.523-159.45-57.307-1.938-4.14-3.657-9.368-5.157-15.4-1.463 6.03-3.182 11.26-5.157 15.394-28.16 59.83-99.547 85.503-159.378 57.306-59.83-28.196-85.467-99.546-57.27-159.377S511.963 246.89 511.963 246.89s0 .22.037.586v-.623s193.646 171.56 221.842 231.426c28.233 59.864 2.597 131.22-57.27 159.412zm13.643-158.464C664.796 435.456 516.206 294.51 516.206 294.51l-1.573 3S359.168 437.906 333.423 481.5c-30.61 51.822-7.754 108.946 38.948 128.44 43.52 18.175 101.89-27.32 123.508-73.144 1.5-3.182 17.627-1.463 18.798-6.107 1.135 4.64 12.728 2.92 14.227 6.1 21.577 45.825 81.04 93.99 128 72.41 46.007-21.136 66.926-72.153 33.317-129.973z"/><glyph unicode="" d="M512 704.11L215.15 191.854h593.7L512 704.11zm32.22-449.975h-62.76v49.92h62.757v-49.92zm-15.507 89.234h-31.27l-20.808 140.65-1.207 72.7h72.52v-72.7l-19.235-140.65z"/><glyph unicode="" d="M628.846 588.544c-34.085 28.343-75.63 42.24-116.773 42.24-47.47 0-94.757-18.578-130.085-54.382l-32.073 29.586-.585-102.693 110.994-.658L420.9 543.89c25.198 24.027 58.002 36.315 91.136 36.352 29.842-.037 59.72-9.947 84.517-30.574 31.488-26.222 47.69-63.744 47.726-101.815 0-5.45-.37-10.97-1.03-16.457l51.383 9.874c.073 2.23.146 4.425.146 6.62.037 52.37-22.49 104.52-65.938 140.653zm-25.052-235.776c-25.307-24.466-58.405-37.01-91.867-37.047-29.88.04-59.72 9.99-84.517 30.58-31.488 26.22-47.69 63.744-47.726 101.778 0 6.327.475 12.617 1.353 18.87l-51.602-9.69c-.146-3.072-.256-6.107-.256-9.18-.04-52.333 22.49-104.52 65.97-140.616 34.05-28.343 75.592-42.24 116.735-42.24h.11c47.8 0 95.377 18.907 130.742 55.223l33.937-33.83.22 106.096-112.054.29 38.95-40.23z"/><glyph unicode="" d="M696.942 624.933l-19.273 6.107h-74.5v38.583l-12.547 21.03-22.712 13.494H456.77l-23.333-13.495-12.58-21.03v-38.618H347.09l-18.76-6.656-17.19-14.153v-88.87h19.018v-.072h17.555V191.818h36.57v.293H639.7v-.29h36.57V521.26h18.287v.073h18.285v86.6l-15.91 17.007zm-239.507 42.642h109.13v-36.57h-109.13v36.57zm182.272-438.857H384.292v292.57h255.415V228.72zm36.572 329.216H347.72v36.498h328.56v-36.498zM457.43 483.51h-36.57V264.925h36.57V483.51zm73.143 0h-36.57V264.925h36.57V483.51zm73.143 0h-36.57V264.925h36.57V483.51z"/><glyph unicode="" d="M804.645 515.4c-1.5 4.682-5.888 7.9-10.79 7.9H586.9l-64.073 196.754c-1.536 4.645-5.888 7.826-10.825 7.826-4.9 0-9.29-3.182-10.825-7.863l-64.44-196.754h-206.59c-4.902 0-9.29-3.218-10.826-7.863-1.5-4.68.15-9.874 4.1-12.763l167.2-121.783-64.44-197.85c-1.534-4.682.148-9.84 4.135-12.728 3.95-2.89 9.4-2.89 13.35 0L512 292.46l167.937-122.148c2.01-1.463 4.315-2.23 6.693-2.23s4.68.767 6.693 2.23c4.023 2.89 5.67 8.01 4.133 12.727l-64.44 197.85 167.57 121.78c3.95 2.89 5.633 8.044 4.06 12.725z"/><glyph unicode="" d="M807.24 415.854V483l-9.508 3.144-71.936 23.442-19.2 46.373 36.937 78.08-47.506 47.5-8.923-4.498-67.438-34.304-46.373 19.2-29.11 81.3H477l-26.624-81.446-46.336-19.163-78.043 36.9-47.506-47.505 4.5-8.96 34.27-67.438-19.2-46.338-81.3-29.075V413l9.47-3.07 71.977-23.516 19.163-46.373-36.9-78.08 47.504-47.502 8.888 4.498 67.475 34.304 46.373-19.2 29.11-81.3H547l3.072 9.51 23.515 71.935 46.373 19.2 78.08-36.937 47.506 47.506-4.498 8.923-34.304 67.438 19.2 46.373 81.298 29.147zM512 353.938c-51.968 0-94.062 42.13-94.062 94.062 0 52.005 42.094 94.062 94.062 94.062 51.93 0 94.098-42.057 94.098-94.062-.037-51.93-42.167-94.062-94.098-94.062z"/><glyph unicode="" d="M339.602 539.94L512 356.06l172.398 183.88z"/><glyph unicode="" d="M606.94 449.938L448.547 612.79l-27.794-26.074L553.58 450.158l-136.52-140.36 27.173-26.588L597.43 440.76l-.145.146z"/><glyph unicode="" d="M127.634 740.57v-73.14h768.73v73.143h-768.73zm0-329.14h768.73v73.142h-768.73V411.43zm0-256h768.73v73.142h-768.73V155.43z"/><glyph unicode="" d="M512 742.217c-102.437 0-185.417-83.054-185.417-185.454C326.583 454.326 512 153.746 512 153.746s185.454 300.58 185.454 403.017C697.417 659.2 614.437 742.217 512 742.217zm0-241.774c-31.122 0-56.357 25.198-56.357 56.357 0 31.086 25.234 56.357 56.357 56.357 31.16 0 56.393-25.27 56.393-56.357-.037-31.16-25.27-56.357-56.393-56.357z"/><glyph unicode="" d="M219.43 485.595h255.926v254.793H219.43V485.595zM548.57 740.39V631.04h256v109.35h-256zM219.43 156.452h255.926v254.793H219.43V156.453zm329.14 328.3h256v109.35h-256v-109.35zm0-182.856h256v109.35h-256v-109.35zm0-146.286h256v109.35h-256V155.61z"/><glyph unicode="" d="M579.51 677.01c-30.792 0-57.38-25.16-57.38-55.954 0-28.635 18.907-47.58 47.58-47.58 31.414 0 58 23.772 58 55.992 0 28.71-20.223 47.543-48.2 47.543zm14.008-340.516c-9.8 0-48.31-59.502-69.266-59.502-5.595 0-8.375 4.937-8.375 9.8 0 11.228 7.68 28.71 11.85 39.206l50.32 136.375c25.2 67.84-6.984 86.016-37.046 86.016-40.552 0-76.94-20.3-104.88-46.85-9.107-9.07-39.864-38.44-39.864-51.058 0-4.133 4.17-9.07 9.107-9.07 12.544 0 46.153 60.855 72.01 60.855 5.594 0 11.885-6.29 6.984-18.87L435.46 360.225c-4.938-11.85-28.71-69.23-28.71-102.802 0-26.587 17.52-38.437 42.68-38.437 70.655 0 152.43 86.71 152.43 107.007 0 6.29-4.865 10.496-8.34 10.496z"/><glyph unicode="î˜" d="M219.063 593.92H366.08v147.017H219.063V593.92zm219.428 0h147.02v147.017H438.49V593.92zm219.43 147.017V593.92h147.02v147.017H657.92zM219.068 374.49H366.08v147.02H219.063V374.49zm219.428 0h147.02v147.02H438.49V374.49zm219.43 0H804.94v147.02H657.92V374.49zm-438.86-219.426H366.08V302.08H219.063V155.063zm219.43 0h147.02V302.08H438.49V155.063zm219.43 0H804.94V302.08H657.92V155.063z"/><glyph unicode="" d="M711.607 401.59l-5.486-5.52c21.07 27.793 32.88 60.196 32.22 94.72-1.97 99.217-106.68 177.626-233.87 175.14-127.23-2.487-228.79-84.992-226.815-184.21 1.94-99.182 106.68-177.554 233.91-175.067 28.637.585 50.434-5.815 75.63 2.12l159.234-78.7c-.038-.038-71.06 124.964-34.817 171.52z"/><glyph unicode="î˜" d="M236.946 466.286h550.107v-36.57H236.946v36.57z"/><glyph unicode="î˜" d="M749.13 663.698C597.027 570.44 486.655 452.79 437.064 393.764l-121.417 95.16-53.65-43.265 209.847-213.4c36.096 92.49 150.49 273.3 290.158 401.736l-12.873 29.696z"/><glyph unicode="" d="M434.87 259.95c-35.217 0-63.706-28.526-63.706-63.744 0-35.182 28.49-63.67 63.707-63.67 35.188 0 63.71 28.488 63.71 63.67 0 35.218-28.523 63.744-63.704 63.744zm219.978 0c-35.218 0-63.707-28.526-63.707-63.744 0-35.182 28.49-63.67 63.71-63.67 35.148 0 63.71 28.488 63.71 63.67 0 35.218-28.562 63.744-63.707 63.744zm129.426 356.79H357.047s-25.93 70.072-49.957 113.372c-24.027 43.227-57.893 32.037-57.893 32.037-26.843 0-39.314-16.06-39.314-42.977 0-26.843 16.457-48.64 43.337-48.64l16.603-14.848 121.93-330.534 356.424-.255s65.17 261.706 61.806 251.356c11.96 36.975-3.255 40.486-25.71 40.486zm-391.79-124.196c-18.724 0-33.9 15.177-33.9 33.902s15.176 33.902 33.9 33.902 33.903-15.177 33.903-33.902-15.177-33.902-33.902-33.902zm72.45-113.152c-18.726 0-33.903 15.177-33.903 33.902s15.18 33.902 33.908 33.902 33.902-15.177 33.902-33.902-15.178-33.902-33.903-33.902zM502.2 492.544c-18.727 0-33.904 15.177-33.904 33.902s15.177 33.902 33.902 33.902 33.9-15.177 33.9-33.902-15.176-33.902-33.9-33.902zm72.446-113.152c-18.725 0-33.865 15.177-33.865 33.902s15.18 33.902 33.87 33.902 33.938-15.177 33.938-33.902-15.214-33.902-33.938-33.902zm37.266 113.152c-18.725 0-33.938 15.177-33.938 33.902s15.214 33.902 33.938 33.902 33.865-15.177 33.865-33.902-15.14-33.902-33.865-33.902zm72.448-113.152c-18.724 0-33.864 15.177-33.864 33.902s15.14 33.902 33.865 33.902 33.94-15.177 33.94-33.902-15.21-33.902-33.94-33.902zm37.267 113.152c-18.725 0-33.938 15.177-33.938 33.902s15.21 33.902 33.932 33.902 33.865-15.177 33.865-33.902-15.14-33.902-33.865-33.902z"/><glyph unicode="" d="M642.487 578.304c11.96 0 21.65 9.69 21.65 21.65v77.934c0 11.96-9.69 21.65-21.65 21.65-11.922 0-21.65-9.69-21.65-21.65v-77.934c.037-11.96 9.728-21.65 21.65-21.65zm-260.645 0c11.922 0 21.65 9.69 21.65 21.65v77.934c0 11.96-9.728 21.65-21.65 21.65-11.96 0-21.65-9.69-21.65-21.65v-77.934c.037-11.96 9.69-21.65 21.65-21.65zm289.427 58.258v-.402c8.99-7.973 14.7-19.566 14.7-32.55 0-23.99-19.46-43.446-43.487-43.446-23.99 0-43.447 19.456-43.447 43.447 0 12.95 5.705 24.58 14.702 32.55v.407H410.59v-.402c8.996-7.972 14.7-19.565 14.7-32.55 0-23.99-19.455-43.445-43.446-43.445-24.027 0-43.447 19.455-43.447 43.446 0 12.947 5.67 24.577 14.665 32.55v.402h-96.84v-440.1h511.56v440.1H671.27zM732.08 234.57h-437.76v291.69h437.76V234.57zM619.3 407.11h-55.15V352h55.15v55.113zm0 82.908h-55.15v-55.11h55.15v55.113zm0-163.51h-55.15v-55.15h55.15v55.15zm77.642 163.51h-55.15v-55.11h55.15v55.113zm0-82.907h-55.15V352h55.15v55.113zm-310.675-80.6h-55.113v-55.15h55.113v55.15zm77.715 0h-55.15v-55.15h55.15v55.15zm0 80.606h-55.15V352h55.15v55.113zm-77.715 0h-55.113V352h55.113v55.113zm155.32 0h-55.114V352h55.113v55.113zm0 82.908h-55.114v-55.11h55.113v55.114zm-77.605 0h-55.15v-55.11h55.15v55.114zm77.604-163.51h-55.113v-55.15h55.113v55.15z"/><glyph unicode="" d="M512 677.742L302.994 424.485h136.338v-206.19H584.63v206.19h136.375z"/><glyph unicode="" d="M584.63 471.515V677.74H439.334V471.516h-136.34L512 218.296l209.007 253.22z"/><glyph unicode="" d="M836.462 183.918s-109.64 112.677-153.38 156.233c-19.055 19.02-32.074 31.93-32.074 31.93 14.848 21.21 26.405 44.36 34.633 69.34s12.367 51.24 12.367 78.85c0 35.62-6.802 69.083-20.334 100.46-13.57 31.306-32 58.698-55.406 82.03-23.37 23.44-50.725 41.875-82.066 55.407-31.304 13.605-64.767 20.37-100.39 20.37-35.582 0-69.045-6.802-100.423-20.37-31.305-13.53-58.55-31.963-81.664-55.406-23.08-23.297-41.437-50.69-54.97-81.994-13.566-31.378-20.332-64.84-20.332-100.462s6.8-69.083 20.334-100.39c13.534-31.304 31.89-58.66 54.97-82.102 23.114-23.33 50.323-41.8 81.665-55.37 31.377-13.564 64.84-20.293 100.424-20.293 27.647 0 53.942 4.022 78.884 12.287s48.09 19.858 69.303 34.706c0 0 11.923-11.96 29.697-29.805 48.422-48.603 155.027-159.16 155.027-159.16 16.02-6.984 41.73.44 54.456 11.338s19.857 33.683 9.29 52.408zM612.718 447.013c-9.838-22.747-23.223-42.57-40.155-59.43-16.933-16.932-36.718-30.353-59.43-40.19-22.637-9.875-46.847-14.776-72.52-14.776-26.258 0-50.688 4.937-73.362 14.775-22.67 9.838-42.49 23.26-59.423 40.192-16.896 16.86-30.354 36.68-40.155 59.43-9.84 22.6-14.74 47.103-14.74 73.288 0 25.673 4.9 50.03 14.74 72.997 9.837 22.93 23.26 42.892 40.154 59.79 16.933 16.97 36.754 30.352 59.43 40.153 22.673 9.91 47.103 14.738 73.36 14.738 25.674 0 49.884-4.863 72.522-14.737 22.674-9.8 42.496-23.186 59.43-40.155 16.932-16.933 30.317-36.9 40.154-59.83 9.872-22.968 14.736-47.324 14.736-72.998 0-26.15-4.9-50.65-14.738-73.253z"/><glyph unicode="" d="M695.845 602.66l-29.147 29.112L512 477.038 357.268 631.772l-29.11-29.11L482.89 447.926 328.266 293.303l29.11-29.074L512 418.81l154.664-154.58 29.038 29.073-154.586 154.624z"/><glyph unicode="" d="M470.418 450.158l132.79 136.558-27.793 26.075L417.06 449.94l9.62-9.033-.11-.146 153.233-157.55 27.137 26.59z"/><glyph unicode="" d="M512 539.94L339.602 356.06h344.795z"/><glyph unicode="" d="M392.12 622.043V273.956L631.844 448z"/><glyph unicode="" d="M392.12 448l239.725-174.043v348.087z"/><glyph unicode="" d="M237.714 191.16h73.728v513.68h-73.728V191.16zm548.572 511.926H346.003v-292.17h440.283l-148.078 144.13 148.078 148.04z"/><glyph unicode="" d="M787.054 466.36h-256.22v256.694h-36.57V466.36H236.947v-36.572h257.317v-256.84h36.57v256.84h256.22z"/><glyph unicode="î˜" d="M769.134 594.286v36.57h-513.17v-25.27l-1.097-1.097 1.097-1.1v-9.11h.622V301.71h-.622v-8.56l-1.097-1.095 1.097-1.098v-25.82h513.17v36.57h-.585v292.57h.58zM703.89 301.714H316.233l119.88 119.88-25.855 25.857L293.12 330.32v236.36L513.134 349.59l25.856 25.855-1.39 1.353 194.377 194.34v-245.87l-122.15 122.15-25.855-25.856L703.89 301.714zM317.22 594.286h386.16l-191.782-191.78-194.377 191.78z"/><glyph unicode="" d="M310.747 210.36h109.166v328.484H310.747V210.36zM604.05 355.583V210.36h109.202v145.224H604.05zM457.4 210.36h109.2v475.318H457.4v-475.32z"/><glyph unicode="" d="M310.747 210.36h109.166v328.484H310.747V210.36zm37.194 293.265h36.87V246.857h-36.87v256.768zm256.11-148.04V210.358h109.207v145.224H604.05zm73.29-108.874h-36.83v71.87h36.83v-71.87zM457.4 210.36h109.2v475.318H457.4v-475.32zm36.863 439.478h36.827V247.004h-36.827v402.834z"/><glyph unicode="î˜ " d="M519.57 665.893c-127.232 2.487-231.936-75.922-233.91-175.14-.696-34.488 11.153-66.927 32.218-94.72l-5.486 5.52c36.242-46.518-34.816-171.52-34.816-171.52l159.232 78.703c25.16-7.936 46.994-1.536 75.63-2.12 127.232-2.49 231.972 75.884 233.91 175.064 2.012 99.255-99.51 181.723-226.778 184.21z"/><glyph unicode="" d="M514.158 489.582l136.558-132.79 26.075 27.793L513.94 542.94 347.21 380.196l26.588-27.136z"/><glyph unicode="" d="M509.842 406.418l-136.558 132.79-26.075-27.793L510.06 353.06l166.73 162.744-26.588 27.136z"/><glyph unicode="" d="M938.824 426.028l-.504 106.238L512 958.588 85.678 532.266l-.504-106.238L474.618 815.47V-64.536h74.764V815.47z"/><glyph unicode="" d="M1.994 518.75h748.928L467.644 809.956h200.254L1022.006 446 667.898 82.044H467.644l283.278 291.174H1.994V518.75z"/><glyph unicode="" d="M1022.006 375.25H273.078L556.356 84.044H356.102L1.994 448l354.108 363.956h200.254L273.078 520.782h748.928V375.25z"/><glyph unicode="" d="M85.174 468.026l.504-106.238L512-64.536l426.32 426.324.504 106.238L549.38 78.582l.002 880.006h-74.764V78.584z"/><glyph unicode="" d="M511.963 831.086c-211.53 0-383.05-171.52-383.05-383.086S300.398 64.914 511.963 64.914C723.566 64.914 895.05 236.397 895.05 448S723.565 831.086 511.962 831.086zm0-36.572c191.086 0 346.514-155.43 346.514-346.514 0-79.91-27.43-153.344-73.07-212.04-5.486 1.974-11.008 3.84-16.274 6.106-34.926 14.63-73.8 31.78-108.654 46.153-9.917 2.7-19.937 5.41-29.848 8.15-11.85 8.154-23.59 35.364-29.915 48.932-6.29.914-12.654 1.792-19.017 2.633.915 20.99 13.935 22.125 19.018 38.07 4.5 14.08.514 32.44 7.57 45.495 4.94 9.07 16.13 9.07 21.65 16.934 5.085 6.984 8.41 19.272 9.986 27.94 2.853 15.8 5.34 37.34-2.158 53.03-4.28 8.96-6.985 9.873-8.23 20.735-1.425 13.274 3.914 56.43 4.134 65.754.513 24.21-.072 26.15-5.924 49.737 0 0-7.058 21.36-18.213 27.83l-22.272 3.805L573.55 710c-55.37 34.085-114.76 10.167-146.505-2.67-45.824-14.885-74.79-59.758-54.565-155.538 3.474-16.42-8.96-23.698-8.155-32.658 1.83-19.566 2.158-66.487 20.59-78.08 1.72-1.06 14.81-4.352 14.738-3.438 1.794-19.017 3.623-38.07 5.378-57.015 4.61-12.65 15.69-14.08 18.91-31.923l-14.152-3.438c-6.362-13.57-17.992-40.778-29.878-48.934-9.948-2.705-19.93-5.412-29.88-8.154-34.89-14.373-73.69-31.49-108.654-46.153-1.902-.77-3.877-1.39-5.815-2.16-43.775 58.11-70.07 130.01-70.07 208.165 0 191.086 155.43 346.514 346.478 346.514z"/></font></defs></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg"><defs><font id="Blank-Theme-Icons" horiz-adv-x="1024"><font-face units-per-em="1024" ascent="960" descent="-64"/><missing-glyph horiz-adv-x="1024"/><glyph unicode=" " d="" horiz-adv-x="512"/><glyph unicode="" d="M676.571 637.696c-59.867 28.197-131.255 2.523-159.415-57.307-1.975-4.133-3.657-9.362-5.157-15.397-1.499 6.034-3.182 11.264-5.157 15.397-28.197 59.831-99.547 85.504-159.415 57.307-59.831-28.197-85.504-99.547-57.271-159.378 28.197-59.867 221.806-231.424 221.806-231.424s0 0.219 0.037 0.585c0.037-0.366 0.037-0.585 0.037-0.585s193.646 171.557 221.806 231.424c28.233 59.831 2.597 131.182-57.271 159.378z"/><glyph unicode="" d="M676.571 637.696c-59.831 28.197-131.218 2.523-159.451-57.307-1.938-4.133-3.657-9.362-5.157-15.397-1.463 6.034-3.182 11.264-5.157 15.397-28.16 59.831-99.547 85.504-159.378 57.307s-85.467-99.547-57.271-159.378 221.806-231.424 221.806-231.424 0 0.219 0.037 0.585c0-0.402 0-0.622 0-0.622s193.646 171.557 221.842 231.424c28.233 59.867 2.597 131.218-57.271 159.415zM690.213 479.232c-25.417-43.776-174.007-184.722-174.007-184.722l-1.573 2.999c0 0-155.465 140.398-181.211 183.991-30.61 51.822-7.753 108.946 38.949 128.439 43.52 18.176 101.888-27.319 123.502-73.143 1.499-3.182 17.627-1.463 18.798-6.107 1.134 4.645 12.727 2.926 14.226 6.107 21.577 45.824 81.042 93.989 128 72.411 46.007-21.138 66.926-72.155 33.317-129.975z"/><glyph unicode="" d="M512 704.11l-296.85-512.256h593.701l-296.85 512.256zM544.219 254.135h-62.757v49.92h62.757v-49.92zM528.713 343.369h-31.269l-20.809 140.654-1.207 72.704h72.521v-72.704l-19.237-140.654z"/><glyph unicode="" d="M628.846 588.544c-34.085 28.343-75.63 42.24-116.773 42.24-47.47 0-94.757-18.578-130.085-54.382l-32.073 29.586-0.585-102.693 110.994-0.658-39.424 41.253c25.198 24.027 58.002 36.315 91.136 36.352 29.842-0.037 59.721-9.947 84.517-30.574 31.488-26.222 47.689-63.744 47.726-101.815 0-5.449-0.366-10.971-1.024-16.457l51.383 9.874c0.073 2.231 0.146 4.425 0.146 6.619 0.037 52.37-22.491 104.521-65.938 140.654zM603.794 352.768c-25.307-24.466-58.405-37.010-91.867-37.047-29.879 0.037-59.721 9.984-84.517 30.574-31.488 26.222-47.689 63.744-47.726 101.778 0 6.327 0.475 12.617 1.353 18.871l-51.602-9.691c-0.146-3.072-0.256-6.107-0.256-9.179-0.037-52.334 22.491-104.521 65.975-140.617 34.048-28.343 75.593-42.24 116.736-42.24h0.11c47.799 0 95.378 18.907 130.743 55.223l33.938-33.829 0.219 106.094-112.055 0.293 38.949-40.229z"/><glyph unicode="" d="M696.942 624.933l-19.273 6.107h-74.496v38.583l-12.544 21.029-22.711 13.495h-111.141l-23.333-13.495-12.581-21.029v-38.619h-73.765l-18.761-6.656-17.189-14.153v-88.869h19.017v-0.073h17.554v-329.435h36.571v0.293h255.415v-0.293h36.571v329.435h18.286v0.073h18.286v86.601l-15.909 17.006zM457.435 667.575h109.129v-36.571h-109.129v36.571zM639.707 228.718h-255.415v292.571h255.415v-292.571zM676.279 557.934h-328.558v36.498h328.558v-36.498zM457.435 483.511h-36.571v-218.587h36.571v218.587zM530.578 483.511h-36.571v-218.587h36.571v218.587zM603.721 483.511h-36.571v-218.587h36.571v218.587z"/><glyph unicode="" d="M804.645 515.401c-1.499 4.681-5.888 7.899-10.789 7.899h-206.958l-64.073 196.754c-1.536 4.645-5.888 7.826-10.825 7.826-4.901 0-9.289-3.182-10.825-7.863l-64.439-196.754h-206.592c-4.901 0-9.289-3.218-10.825-7.863-1.499-4.681 0.146-9.874 4.096-12.763l167.205-121.783-64.439-197.851c-1.536-4.681 0.146-9.838 4.133-12.727 3.95-2.889 9.399-2.889 13.349 0l168.338 122.185 167.936-122.149c2.011-1.463 4.315-2.231 6.693-2.231s4.681 0.768 6.693 2.231c4.023 2.889 5.669 8.009 4.133 12.727l-64.439 197.851 167.57 121.783c3.95 2.889 5.632 8.046 4.059 12.727z"/><glyph unicode="" d="M807.241 415.854v67.145l-9.509 3.145-71.936 23.442-19.2 46.373 36.937 78.080-47.506 47.506-8.923-4.498-67.438-34.304-46.373 19.2-29.111 81.298h-67.182l-26.624-81.445-46.336-19.163-78.043 36.901-47.506-47.506 4.498-8.96 34.267-67.438-19.2-46.336-81.298-29.074v-67.218l9.472-3.072 71.973-23.515 19.163-46.373-36.901-78.080 47.506-47.506 8.887 4.498 67.474 34.304 46.373-19.2 29.111-81.298h67.182l3.072 9.509 23.515 71.936 46.373 19.2 78.080-36.937 47.506 47.506-4.498 8.923-34.304 67.438 19.2 46.373 81.298 29.147zM512 353.938c-51.968 0-94.062 42.13-94.062 94.062 0 52.005 42.094 94.062 94.062 94.062 51.931 0 94.098-42.057 94.098-94.062-0.037-51.931-42.167-94.062-94.098-94.062z"/><glyph unicode="" d="M339.602 539.941l172.398-183.881 172.398 183.881z"/><glyph unicode="" d="M606.939 449.938l-158.391 162.853-27.794-26.075 132.827-136.558-136.521-140.361 27.173-26.587 153.198 157.55-0.146 0.146z"/><glyph unicode="" d="M127.634 740.571v-73.143h768.731v73.143h-768.731zM127.634 411.429h768.731v73.143h-768.731v-73.143zM127.634 155.429h768.731v73.143h-768.731v-73.143z"/><glyph unicode="" d="M512 742.217c-102.437 0-185.417-83.054-185.417-185.454 0-102.437 185.417-403.017 185.417-403.017s185.454 300.581 185.454 403.017c-0.037 102.437-83.017 185.454-185.454 185.454zM512 500.443c-31.122 0-56.357 25.198-56.357 56.357 0 31.086 25.234 56.357 56.357 56.357 31.159 0 56.393-25.271 56.393-56.357-0.037-31.159-25.271-56.357-56.393-56.357z"/><glyph unicode="" d="M219.429 485.595h255.927v254.793h-255.927v-254.793zM548.571 740.389v-109.349h256v109.349h-256zM219.429 156.453h255.927v254.793h-255.927v-254.793zM548.571 484.754h256v109.349h-256v-109.349zM548.571 301.897h256v109.349h-256v-109.349zM548.571 155.611h256v109.349h-256v-109.349z"/><glyph unicode="" d="M579.511 677.010c-30.793 0-57.381-25.161-57.381-55.954 0-28.635 18.907-47.579 47.579-47.579 31.415 0 58.002 23.771 58.002 55.991 0 28.709-20.224 47.543-48.201 47.543zM593.518 336.494c-9.801 0-48.311-59.502-69.266-59.502-5.595 0-8.375 4.937-8.375 9.801 0 11.227 7.68 28.709 11.849 39.205l50.322 136.375c25.198 67.84-6.985 86.016-37.047 86.016-40.558 0-76.946-20.297-104.887-46.848-9.106-9.070-39.863-38.437-39.863-51.054 0-4.133 4.169-9.070 9.106-9.070 12.544 0 46.153 60.855 72.009 60.855 5.595 0 11.886-6.29 6.985-18.871l-48.896-123.173c-4.937-11.849-28.709-69.23-28.709-102.802 0-26.587 17.518-38.437 42.679-38.437 70.656 0 152.43 86.711 152.43 107.008 0 6.29-4.864 10.496-8.338 10.496z"/><glyph unicode="" d="M219.063 593.92h147.017v147.017h-147.017v-147.017zM438.491 593.92h147.017v147.017h-147.017v-147.017zM657.92 740.937v-147.017h147.017v147.017h-147.017zM219.063 374.491h147.017v147.017h-147.017v-147.017zM438.491 374.491h147.017v147.017h-147.017v-147.017zM657.92 374.491h147.017v147.017h-147.017v-147.017zM219.063 155.063h147.017v147.017h-147.017v-147.017zM438.491 155.063h147.017v147.017h-147.017v-147.017zM657.92 155.063h147.017v147.017h-147.017v-147.017z"/><glyph unicode="" d="M711.607 401.591l-5.486-5.522c21.065 27.794 32.878 60.197 32.219 94.72-1.975 99.218-106.679 177.627-233.874 175.141-127.232-2.487-228.791-84.992-226.816-184.21 1.938-99.182 106.679-177.554 233.911-175.067 28.635 0.585 50.432-5.815 75.63 2.121l159.232-78.702c-0.037-0.037-71.058 124.965-34.816 171.52z"/><glyph unicode="" d="M236.946 466.286h550.107v-36.571h-550.107v36.571z"/><glyph unicode="" d="M749.129 663.698c-152.101-93.257-262.473-210.907-312.064-269.934l-121.417 95.159-53.65-43.264 209.847-213.394c36.096 92.489 150.491 273.298 290.158 401.737l-12.873 29.696z"/><glyph unicode="" d="M434.871 259.95c-35.218 0-63.707-28.526-63.707-63.744 0-35.182 28.489-63.671 63.707-63.671 35.182 0 63.707 28.489 63.707 63.671 0 35.218-28.526 63.744-63.707 63.744zM654.848 259.95c-35.218 0-63.707-28.526-63.707-63.744 0-35.182 28.489-63.671 63.707-63.671 35.145 0 63.707 28.489 63.707 63.671 0 35.218-28.562 63.744-63.707 63.744zM784.274 616.741c-163.511 0-427.227 0-427.227 0s-25.929 70.071-49.957 113.371c-24.027 43.227-57.893 32.037-57.893 32.037-26.843 0-39.314-16.055-39.314-42.971 0-26.843 16.457-48.64 43.337-48.64l16.603-14.848 121.929-330.533 356.425-0.256c0 0 65.17 261.705 61.806 251.355 11.959 36.974-3.255 40.485-25.71 40.485zM392.485 492.544c-18.725 0-33.902 15.177-33.902 33.902s15.177 33.902 33.902 33.902 33.902-15.177 33.902-33.902-15.177-33.902-33.902-33.902zM464.933 379.392c-18.725 0-33.902 15.177-33.902 33.902s15.177 33.902 33.902 33.902 33.902-15.177 33.902-33.902-15.177-33.902-33.902-33.902zM502.199 492.544c-18.725 0-33.902 15.177-33.902 33.902s15.177 33.902 33.902 33.902 33.902-15.177 33.902-33.902-15.177-33.902-33.902-33.902zM574.647 379.392c-18.725 0-33.865 15.177-33.865 33.902s15.177 33.902 33.865 33.902 33.938-15.177 33.938-33.902-15.214-33.902-33.938-33.902zM611.913 492.544c-18.725 0-33.938 15.177-33.938 33.902s15.214 33.902 33.938 33.902 33.865-15.177 33.865-33.902-15.141-33.902-33.865-33.902zM684.361 379.392c-18.725 0-33.865 15.177-33.865 33.902s15.141 33.902 33.865 33.902 33.938-15.177 33.938-33.902-15.214-33.902-33.938-33.902zM721.627 492.544c-18.725 0-33.938 15.177-33.938 33.902s15.214 33.902 33.938 33.902 33.865-15.177 33.865-33.902-15.141-33.902-33.865-33.902z"/><glyph unicode="" d="M642.487 578.304c11.959 0 21.65 9.691 21.65 21.65v77.934c0 11.959-9.691 21.65-21.65 21.65-11.922 0-21.65-9.691-21.65-21.65v-77.934c0.037-11.959 9.728-21.65 21.65-21.65zM381.842 578.304c11.922 0 21.65 9.691 21.65 21.65v77.934c0 11.959-9.728 21.65-21.65 21.65-11.959 0-21.65-9.691-21.65-21.65v-77.934c0.037-11.959 9.691-21.65 21.65-21.65zM671.269 636.562v-0.402c8.997-7.973 14.702-19.566 14.702-32.549 0-23.991-19.456-43.447-43.483-43.447-23.991 0-43.447 19.456-43.447 43.447 0 12.946 5.705 24.576 14.702 32.549v0.402h-203.154v-0.402c8.997-7.973 14.702-19.566 14.702-32.549 0-23.991-19.456-43.447-43.447-43.447-24.027 0-43.447 19.456-43.447 43.447 0 12.946 5.669 24.576 14.665 32.549v0.402h-96.841v-440.101h511.561v440.101h-96.512zM732.087 234.569h-437.76v291.694h437.76v-291.694zM619.301 407.113h-55.15v-55.113h55.15v55.113zM619.301 490.021h-55.15v-55.113h55.15v55.113zM619.301 326.51h-55.15v-55.15h55.15v55.15zM696.942 490.021h-55.15v-55.113h55.15v55.113zM696.942 407.113h-55.15v-55.113h55.15v55.113zM386.267 326.51h-55.113v-55.15h55.113v55.15zM463.982 326.51h-55.15v-55.15h55.15v55.15zM463.982 407.113h-55.15v-55.113h55.15v55.113zM386.267 407.113h-55.113v-55.113h55.113v55.113zM541.586 407.113h-55.113v-55.113h55.113v55.113zM541.586 490.021h-55.113v-55.113h55.113v55.113zM463.982 490.021h-55.15v-55.113h55.15v55.113zM541.586 326.51h-55.113v-55.15h55.113v55.15z"/><glyph unicode="" d="M512 677.742l-209.006-253.257h136.338v-206.19h145.298v206.19h136.375z"/><glyph unicode="" d="M584.631 471.515v206.226h-145.298v-206.226h-136.338l209.006-253.221 209.006 253.221z"/><glyph unicode="" d="M836.462 183.918c0 0-109.641 112.677-153.381 156.233-19.054 19.017-32.073 31.927-32.073 31.927 14.848 21.211 26.405 44.361 34.633 69.339s12.361 51.237 12.361 78.848c0 35.621-6.802 69.083-20.334 100.462-13.568 31.305-32 58.697-55.406 82.030-23.369 23.442-50.725 41.874-82.066 55.406-31.305 13.605-64.768 20.37-100.389 20.37-35.584 0-69.047-6.802-100.425-20.37-31.305-13.531-58.551-31.963-81.664-55.406-23.077-23.296-41.435-50.688-54.967-81.993-13.568-31.378-20.334-64.841-20.334-100.462s6.802-69.083 20.334-100.389c13.531-31.305 31.89-58.661 54.967-82.103 23.113-23.333 50.322-41.801 81.664-55.369 31.378-13.568 64.841-20.297 100.425-20.297 27.648 0 53.943 4.023 78.885 12.288s48.091 19.858 69.303 34.706c0 0 11.922-11.959 29.696-29.806 48.421-48.603 155.026-159.159 155.026-159.159 16.018-6.985 41.728 0.439 54.455 11.337s19.858 33.682 9.289 52.407zM612.718 447.013c-9.838-22.747-23.223-42.569-40.155-59.429-16.933-16.933-36.718-30.354-59.429-40.192-22.638-9.874-46.848-14.775-72.521-14.775-26.258 0-50.688 4.937-73.362 14.775s-42.496 23.259-59.429 40.192c-16.896 16.859-30.354 36.681-40.155 59.429-9.838 22.601-14.738 47.104-14.738 73.289 0 25.673 4.901 50.030 14.738 72.997 9.838 22.93 23.259 42.898 40.155 59.794 16.933 16.969 36.754 30.354 59.429 40.155 22.674 9.911 47.104 14.738 73.362 14.738 25.673 0 49.883-4.864 72.521-14.738 22.674-9.801 42.496-23.186 59.429-40.155 16.933-16.933 30.318-36.901 40.155-59.831 9.874-22.967 14.738-47.323 14.738-72.997 0-26.149-4.901-50.651-14.738-73.253z"/><glyph unicode="" d="M695.845 602.661l-29.147 29.111-154.697-154.734-154.734 154.734-29.111-29.111 154.734-154.734-154.624-154.624 29.111-29.074 154.624 154.587 154.661-154.587 29.038 29.074-154.587 154.624z"/><glyph unicode="" d="M470.418 450.158l132.791 136.558-27.794 26.075-158.354-162.853 9.618-9.033-0.11-0.146 153.234-157.55 27.136 26.587z"/><glyph unicode="" d="M512 539.941l-172.398-183.881h344.795z"/><glyph unicode="" d="M392.119 622.043v-348.087l239.726 174.043z"/><glyph unicode="" d="M392.119 448l239.726-174.043v348.087z"/><glyph unicode="" d="M237.714 191.159h73.728v513.682h-73.728v-513.682zM786.286 703.086h-440.283v-292.169h440.283l-148.078 144.128 148.078 148.041z"/><glyph unicode="" d="M787.054 466.359h-256.219v256.695h-36.571v-256.695h-257.317v-36.571h257.317v-256.841h36.571v256.841h256.219z"/><glyph unicode="" d="M769.134 594.286v36.571h-513.17v-25.271l-1.097-1.097 1.097-1.097v-9.106h0.622v-292.571h-0.622v-8.558l-1.097-1.097 1.097-1.097v-25.819h513.17v36.571h-0.585v292.571h0.585zM703.89 301.714h-387.657l119.881 119.881-25.856 25.856-117.138-117.138v236.361l220.014-217.088 25.856 25.856-1.39 1.353 194.377 194.341v-245.87l-122.149 122.149-25.856-25.856 119.918-119.845zM317.221 594.286h386.158l-191.781-191.781-194.377 191.781z"/><glyph unicode="" d="M310.747 210.359h109.166v328.485h-109.166v-328.485zM604.050 355.584v-145.225h109.202v145.225h-109.202zM457.399 210.359h109.202v475.319h-109.202v-475.319z"/><glyph unicode="" d="M310.747 210.359h109.166v328.485h-109.166v-328.485zM347.941 503.625h36.864v-256.768h-36.864v256.768zM604.050 355.584v-145.225h109.202v145.225h-109.202zM677.339 246.711h-36.827v71.863h36.827v-71.863zM457.399 210.359h109.202v475.319h-109.202v-475.319zM494.263 649.838h36.827v-402.834h-36.827v402.834z"/><glyph unicode="" d="M519.57 665.893c-127.232 2.487-231.936-75.922-233.911-175.141-0.695-34.487 11.154-66.926 32.219-94.72l-5.486 5.522c36.242-46.519-34.816-171.52-34.816-171.52l159.232 78.702c25.161-7.936 46.994-1.536 75.63-2.121 127.232-2.487 231.973 75.886 233.911 175.067 2.011 99.255-99.511 181.723-226.779 184.21z"/><glyph unicode="" d="M514.158 489.582l136.558-132.791 26.075 27.794-162.853 158.354-166.729-162.743 26.587-27.136z"/><glyph unicode="" d="M509.842 406.418l-136.558 132.791-26.075-27.794 162.853-158.354 166.729 162.743-26.587 27.136z"/><glyph unicode="" d="M938.824 426.028l-0.504 106.238-426.32 426.322-426.322-426.322-0.504-106.238 389.444 389.442v-880.006h74.764v880.006z"/><glyph unicode="" d="M1.994 518.75h748.928l-283.278 291.206h200.254l354.108-363.956-354.108-363.956h-200.254l283.278 291.174h-748.928v145.532z"/><glyph unicode="" d="M1022.006 375.25h-748.928l283.278-291.206h-200.254l-354.108 363.956 354.108 363.956h200.254l-283.278-291.174h748.928v-145.532z"/><glyph unicode="" d="M85.174 468.026l0.504-106.238 426.322-426.324 426.32 426.324 0.504 106.238-389.444-389.444 0.002 880.006h-74.764v-880.004z"/><glyph unicode="" d="M511.963 831.086c-211.529 0-383.049-171.52-383.049-383.086s171.483-383.086 383.049-383.086c211.602 0 383.086 171.483 383.086 383.086s-171.483 383.086-383.086 383.086zM511.963 794.514c191.086 0 346.514-155.429 346.514-346.514 0-79.909-27.429-153.344-73.070-212.041-5.486 1.975-11.008 3.84-16.274 6.107-34.926 14.629-73.801 31.781-108.654 46.153-9.911 2.706-19.931 5.413-29.842 8.155-11.849 8.155-23.589 35.365-29.915 48.933-6.29 0.914-12.654 1.792-19.017 2.633 0.914 20.992 13.934 22.126 19.017 38.071 4.498 14.080 0.512 32.439 7.57 45.495 4.937 9.070 16.128 9.070 21.65 16.933 5.083 6.985 8.411 19.273 9.984 27.941 2.853 15.799 5.339 37.339-2.158 53.029-4.279 8.96-6.985 9.874-8.229 20.736-1.426 13.275 3.913 56.43 4.133 65.755 0.512 24.21-0.073 26.149-5.925 49.737 0 0-7.058 21.358-18.213 27.831l-22.272 3.803-13.714 12.727c-55.369 34.085-114.761 10.167-146.505-2.67-45.824-14.885-74.789-59.758-54.565-155.538 3.474-16.421-8.96-23.698-8.155-32.658 1.829-19.566 2.158-66.487 20.59-78.080 1.719-1.061 14.811-4.352 14.738-3.438 1.792-19.017 3.621-38.071 5.376-57.015 4.608-12.654 15.689-14.080 18.907-31.927l-14.153-3.438c-6.363-13.568-17.993-40.777-29.879-48.933-9.947-2.706-19.931-5.413-29.879-8.155-34.889-14.373-73.691-31.488-108.654-46.153-1.902-0.768-3.877-1.39-5.815-2.158-43.776 58.112-70.071 130.011-70.071 208.165 0 191.086 155.429 346.514 346.478 346.514z"/><glyph unicode="" d="M427.703 653.019c0-10.569-8.558-19.090-19.090-19.090h-11.154c-10.533 0-19.090 8.521-19.090 19.090v68.462c0 10.533 8.594 19.090 19.090 19.090h11.154c10.533 0 19.090-8.558 19.090-19.090v-68.462zM645.778 653.019c0-10.569-8.521-19.090-19.054-19.090h-11.154c-10.533 0-19.054 8.521-19.054 19.090v68.462c-0.037 10.533 8.485 19.090 19.054 19.090h11.154c10.533 0 19.054-8.558 19.054-19.090v-68.462zM675.182 481.317l-38.729 31.598-152.795-187.282-81.518 64.805-28.891-36.242 120.21-95.634zM758.784 687.982h-71.351v-29.769c0-31.634-25.746-57.344-57.271-57.344h-11.227c-31.598 0-57.271 25.71-57.271 57.344v29.769h-97.682v-29.769c0-31.634-25.71-57.344-57.307-57.344h-11.154c-31.598 0-57.307 25.71-57.307 57.344v29.769h-72.96c-10.533 0-19.090-8.521-19.090-19.054v-494.373c-0.037-10.569 8.558-19.127 19.090-19.127h493.531c10.533 0 19.054 8.558 19.054 19.090v494.409c0 10.533-8.521 19.054-19.054 19.054zM720.567 240.677c0-10.569-8.558-19.090-19.090-19.090h-378.917c-10.569 0-19.090 8.521-19.090 19.090v288.11c0 10.569 8.521 19.054 19.090 19.054h378.88c10.533 0 19.090-8.485 19.090-19.054v-288.11z"/><glyph unicode="" d="M391.863 554.203h-128.219c-10.35 0-18.761-8.375-18.761-18.725v-91.429c0-10.35 8.375-18.725 18.761-18.725h128.219c10.35 0 18.761 8.375 18.761 18.725v91.429c0 10.386-8.375 18.725-18.761 18.725zM391.863 387.511h-90.734c-10.35 0-18.761-8.375-18.761-18.725v-194.633c0-10.35 8.411-18.725 18.761-18.725h90.734c10.35 0 18.761 8.375 18.761 18.725v194.633c0 10.35-8.375 18.725-18.761 18.725zM760.357 554.203h-279.845c-10.35 0-18.725-8.375-18.725-18.725v-91.429c0-10.35 8.375-18.725 18.725-18.725h279.845c10.313 0 18.725 8.375 18.725 18.725v91.429c-0.037 10.386-8.411 18.725-18.725 18.725zM721.701 385.573h-240.64c-10.313 0-18.725-8.375-18.725-18.761v-192.695c0-10.35 8.375-18.725 18.725-18.725h240.64c10.35 0 18.725 8.375 18.725 18.725v192.695c0 10.35-8.375 18.761-18.725 18.761zM507.355 575.634c21.87-3.986 42.971-6.327 62.647-6.327 99.072 0 152.832 53.248 153.088 103.387 0.183 32.293-23.698 67.291-78.117 67.84-72.923 0-118.089-51.493-141.605-89.71-23.918 38.107-69.266 88.576-142.373 88.576-52.882-0.549-76.763-35.547-76.581-67.84 0.256-50.139 54.016-103.424 153.088-103.424 0.037 0 0.037 0 0.037 0 21.394 0 44.398 2.414 68.425 7.241l1.39 0.256zM645.998 693.723c9.143-0.073 30.354-2.304 30.245-20.773-0.11-23.589-33.17-56.795-106.24-56.795-10.057 0-20.553 0.658-31.525 1.938 16.567 29.294 51.566 75.63 107.52 75.63zM437.504 614.985v0c-73.106 0-106.167 33.207-106.277 56.795-0.11 18.469 21.102 20.699 31.305 20.809 55.259 0 90.039-46.373 106.496-75.666-10.935-1.28-21.467-1.938-31.525-1.938z"/></font></defs></svg> diff --git a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf index 67e7a7f1588bfaee162257fda8b9526699071887..eaec02d1df42b6b0208db02f1da2a3fb3bcae7fd 100644 Binary files a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf and b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.ttf differ diff --git a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff index 809752bf8e5bb222801a256a45bcdcea3b03d190..e9e8395b2574bc6cfbb3c2606213ca204179bf51 100644 Binary files a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff and b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff differ diff --git a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2 b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2 index 438e128ae281b026f6fa1309ca2e78b17cf18a8b..1d60f2f95c0facb689b7a0079cfb2b2312bcab17 100644 Binary files a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2 and b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2 differ diff --git a/lib/web/fonts/Blank-Theme-Icons/selection.json b/lib/web/fonts/Blank-Theme-Icons/selection.json index 307b07ce972e4209487d81adfe63a86024ae2012..e3a71a30c6ae96426ed01b4041c20ae392e1e909 100644 --- a/lib/web/fonts/Blank-Theme-Icons/selection.json +++ b/lib/web/fonts/Blank-Theme-Icons/selection.json @@ -1,6 +1,83 @@ { "IcoMoonType": "selection", "icons": [ + { + "icon": { + "paths": [ + "M427.703 306.981c0 10.569-8.558 19.090-19.090 19.090h-11.154c-10.533 0-19.090-8.521-19.090-19.090v-68.462c0-10.533 8.594-19.090 19.090-19.090h11.154c10.533 0 19.090 8.558 19.090 19.090v68.462z", + "M645.778 306.981c0 10.569-8.521 19.090-19.054 19.090h-11.154c-10.533 0-19.054-8.521-19.054-19.090v-68.462c-0.037-10.533 8.485-19.090 19.054-19.090h11.154c10.533 0 19.054 8.558 19.054 19.090v68.462z", + "M675.182 478.683l-38.729-31.598-152.795 187.282-81.518-64.805-28.891 36.242 120.21 95.634z", + "M758.784 272.018h-71.351v29.769c0 31.634-25.746 57.344-57.271 57.344h-11.227c-31.598 0-57.271-25.71-57.271-57.344v-29.769h-97.682v29.769c0 31.634-25.71 57.344-57.307 57.344h-11.154c-31.598 0-57.307-25.71-57.307-57.344v-29.769h-72.96c-10.533 0-19.090 8.521-19.090 19.054v494.373c-0.037 10.569 8.558 19.127 19.090 19.127h493.531c10.533 0 19.054-8.558 19.054-19.090v-494.409c0-10.533-8.521-19.054-19.054-19.054zM720.567 719.323c0 10.569-8.558 19.090-19.090 19.090h-378.917c-10.569 0-19.090-8.521-19.090-19.090v-288.11c0-10.569 8.521-19.054 19.090-19.054h378.88c10.533 0 19.090 8.485 19.090 19.054v288.11z" + ], + "attrs": [ + {}, + {}, + {}, + {} + ], + "isMulticolor": false, + "grid": 0, + "tags": [ + "gift-registry" + ] + }, + "attrs": [ + {}, + {}, + {}, + {} + ], + "properties": { + "order": 41, + "id": 36, + "prevSize": 32, + "code": 58920, + "name": "gift-registry" + }, + "setIdx": 0, + "setId": 1, + "iconIdx": 0 + }, + { + "icon": { + "paths": [ + "M391.863 405.797h-128.219c-10.35 0-18.761 8.375-18.761 18.725v91.429c0 10.35 8.375 18.725 18.761 18.725h128.219c10.35 0 18.761-8.375 18.761-18.725v-91.429c0-10.386-8.375-18.725-18.761-18.725z", + "M391.863 572.489h-90.734c-10.35 0-18.761 8.375-18.761 18.725v194.633c0 10.35 8.411 18.725 18.761 18.725h90.734c10.35 0 18.761-8.375 18.761-18.725v-194.633c0-10.35-8.375-18.725-18.761-18.725z", + "M760.357 405.797h-279.845c-10.35 0-18.725 8.375-18.725 18.725v91.429c0 10.35 8.375 18.725 18.725 18.725h279.845c10.313 0 18.725-8.375 18.725-18.725v-91.429c-0.037-10.386-8.411-18.725-18.725-18.725z", + "M721.701 574.427h-240.64c-10.313 0-18.725 8.375-18.725 18.761v192.695c0 10.35 8.375 18.725 18.725 18.725h240.64c10.35 0 18.725-8.375 18.725-18.725v-192.695c-0-10.35-8.375-18.761-18.725-18.761z", + "M507.355 384.366c21.87 3.986 42.971 6.327 62.647 6.327 99.072 0 152.832-53.248 153.088-103.387 0.183-32.293-23.698-67.291-78.117-67.84-72.923 0-118.089 51.493-141.605 89.71-23.918-38.107-69.266-88.576-142.373-88.576-52.882 0.549-76.763 35.547-76.581 67.84 0.256 50.139 54.016 103.424 153.088 103.424 0.037 0 0.037 0 0.037 0 21.394 0 44.398-2.414 68.425-7.241l1.39-0.256zM645.998 266.277c9.143 0.073 30.354 2.304 30.245 20.773-0.11 23.589-33.17 56.795-106.24 56.795-10.057 0-20.553-0.658-31.525-1.938 16.567-29.294 51.566-75.63 107.52-75.63zM437.504 345.015v0c-73.106 0-106.167-33.207-106.277-56.795-0.11-18.469 21.102-20.699 31.305-20.809 55.259 0 90.039 46.373 106.496 75.666-10.935 1.28-21.467 1.938-31.525 1.938z" + ], + "attrs": [ + {}, + {}, + {}, + {}, + {} + ], + "isMulticolor": false, + "grid": 0, + "tags": [ + "present" + ] + }, + "attrs": [ + {}, + {}, + {}, + {}, + {} + ], + "properties": { + "order": 43, + "id": 35, + "prevSize": 32, + "code": 58921, + "name": "present" + }, + "setIdx": 0, + "setId": 1, + "iconIdx": 1 + }, { "icon": { "paths": [ @@ -9,8 +86,10 @@ "grid": 0, "tags": [ "account" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 40, "id": 4, @@ -20,7 +99,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 0 + "setId": 1, + "iconIdx": 2 }, { "icon": { @@ -30,8 +110,10 @@ "grid": 0, "tags": [ "arrow-up-thin" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 36, "id": 3, @@ -41,7 +123,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 1 + "setId": 1, + "iconIdx": 3 }, { "icon": { @@ -51,8 +134,10 @@ "grid": 0, "tags": [ "arrow-right-thin" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 37, "id": 2, @@ -62,7 +147,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 2 + "setId": 1, + "iconIdx": 4 }, { "icon": { @@ -72,8 +158,10 @@ "grid": 0, "tags": [ "arrow-left-thin" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 38, "id": 1, @@ -83,7 +171,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 3 + "setId": 1, + "iconIdx": 5 }, { "icon": { @@ -93,8 +182,10 @@ "grid": 0, "tags": [ "arrow-down-thin" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 39, "id": 0, @@ -104,7 +195,8 @@ "ligatures": "" }, "setIdx": 0, - "iconIdx": 4 + "setId": 1, + "iconIdx": 6 }, { "icon": { @@ -114,8 +206,10 @@ "grid": 0, "tags": [ "wishlist full" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 1, "id": 32, @@ -124,8 +218,9 @@ "name": "wishlist-full", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 0 + "setIdx": 0, + "setId": 1, + "iconIdx": 7 }, { "icon": { @@ -135,8 +230,10 @@ "grid": 0, "tags": [ "wishlist empty" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 2, "id": 31, @@ -145,8 +242,9 @@ "name": "wishlist-empty", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 1 + "setIdx": 0, + "setId": 1, + "iconIdx": 8 }, { "icon": { @@ -156,8 +254,10 @@ "grid": 0, "tags": [ "warning" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 3, "id": 30, @@ -166,8 +266,9 @@ "name": "warning", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 2 + "setIdx": 0, + "setId": 1, + "iconIdx": 9 }, { "icon": { @@ -177,8 +278,10 @@ "grid": 0, "tags": [ "update" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 4, "id": 29, @@ -187,8 +290,9 @@ "name": "update", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 3 + "setIdx": 0, + "setId": 1, + "iconIdx": 10 }, { "icon": { @@ -198,8 +302,10 @@ "grid": 0, "tags": [ "trash" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 5, "id": 28, @@ -208,8 +314,9 @@ "name": "trash", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 4 + "setIdx": 0, + "setId": 1, + "iconIdx": 11 }, { "icon": { @@ -219,8 +326,10 @@ "grid": 0, "tags": [ "star" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 6, "id": 27, @@ -229,8 +338,9 @@ "name": "star", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 5 + "setIdx": 0, + "setId": 1, + "iconIdx": 12 }, { "icon": { @@ -240,8 +350,10 @@ "grid": 0, "tags": [ "settings" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 7, "id": 26, @@ -250,8 +362,9 @@ "name": "settings", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 6 + "setIdx": 0, + "setId": 1, + "iconIdx": 13 }, { "icon": { @@ -261,8 +374,10 @@ "grid": 0, "tags": [ "pointer down" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 8, "id": 19, @@ -271,8 +386,9 @@ "name": "pointer-down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 7 + "setIdx": 0, + "setId": 1, + "iconIdx": 14 }, { "icon": { @@ -282,8 +398,10 @@ "grid": 0, "tags": [ "next" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 9, "id": 18, @@ -292,8 +410,9 @@ "name": "next", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 8 + "setIdx": 0, + "setId": 1, + "iconIdx": 15 }, { "icon": { @@ -303,8 +422,10 @@ "grid": 0, "tags": [ "menu" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 10, "id": 17, @@ -313,8 +434,9 @@ "name": "menu", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 9 + "setIdx": 0, + "setId": 1, + "iconIdx": 16 }, { "icon": { @@ -324,8 +446,10 @@ "grid": 0, "tags": [ "location" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 11, "id": 16, @@ -334,8 +458,9 @@ "name": "location", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 10 + "setIdx": 0, + "setId": 1, + "iconIdx": 17 }, { "icon": { @@ -345,8 +470,10 @@ "grid": 0, "tags": [ "list" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 12, "id": 15, @@ -355,8 +482,9 @@ "name": "list", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 11 + "setIdx": 0, + "setId": 1, + "iconIdx": 18 }, { "icon": { @@ -366,8 +494,10 @@ "grid": 0, "tags": [ "info" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 13, "id": 14, @@ -376,8 +506,9 @@ "name": "info", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 12 + "setIdx": 0, + "setId": 1, + "iconIdx": 19 }, { "icon": { @@ -387,8 +518,10 @@ "grid": 0, "tags": [ "grid" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 14, "id": 13, @@ -397,8 +530,9 @@ "name": "grid", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 13 + "setIdx": 0, + "setId": 1, + "iconIdx": 20 }, { "icon": { @@ -408,8 +542,10 @@ "grid": 0, "tags": [ "comment reflected" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 15, "id": 6, @@ -418,8 +554,9 @@ "name": "comment-reflected", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 14 + "setIdx": 0, + "setId": 1, + "iconIdx": 21 }, { "icon": { @@ -429,8 +566,10 @@ "grid": 0, "tags": [ "collapse" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 16, "id": 5, @@ -439,8 +578,9 @@ "name": "collapse", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 15 + "setIdx": 0, + "setId": 1, + "iconIdx": 22 }, { "icon": { @@ -450,8 +590,10 @@ "grid": 0, "tags": [ "checkmark" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 17, "id": 4, @@ -460,8 +602,9 @@ "name": "checkmark", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 16 + "setIdx": 0, + "setId": 1, + "iconIdx": 23 }, { "icon": { @@ -471,8 +614,10 @@ "grid": 0, "tags": [ "cart" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 18, "id": 3, @@ -481,8 +626,9 @@ "name": "cart", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 17 + "setIdx": 0, + "setId": 1, + "iconIdx": 24 }, { "icon": { @@ -492,8 +638,10 @@ "grid": 0, "tags": [ "calendar" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 19, "id": 2, @@ -502,8 +650,9 @@ "name": "calendar", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 18 + "setIdx": 0, + "setId": 1, + "iconIdx": 25 }, { "icon": { @@ -513,8 +662,10 @@ "grid": 0, "tags": [ "arrow up" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 20, "id": 1, @@ -523,8 +674,9 @@ "name": "arrow-up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 19 + "setIdx": 0, + "setId": 1, + "iconIdx": 26 }, { "icon": { @@ -534,8 +686,10 @@ "grid": 0, "tags": [ "arrow down" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 21, "id": 0, @@ -544,8 +698,9 @@ "name": "arrow-down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 20 + "setIdx": 0, + "setId": 1, + "iconIdx": 27 }, { "icon": { @@ -555,8 +710,10 @@ "grid": 0, "tags": [ "search" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 22, "id": 25, @@ -565,8 +722,9 @@ "name": "search", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 21 + "setIdx": 0, + "setId": 1, + "iconIdx": 28 }, { "icon": { @@ -576,8 +734,10 @@ "grid": 0, "tags": [ "remove" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 23, "id": 24, @@ -586,8 +746,9 @@ "name": "remove", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 22 + "setIdx": 0, + "setId": 1, + "iconIdx": 29 }, { "icon": { @@ -597,8 +758,10 @@ "grid": 0, "tags": [ "prev" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 24, "id": 23, @@ -607,8 +770,9 @@ "name": "prev", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 23 + "setIdx": 0, + "setId": 1, + "iconIdx": 30 }, { "icon": { @@ -618,8 +782,10 @@ "grid": 0, "tags": [ "pointer up" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 25, "id": 22, @@ -628,8 +794,9 @@ "name": "pointer-up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 24 + "setIdx": 0, + "setId": 1, + "iconIdx": 31 }, { "icon": { @@ -639,8 +806,10 @@ "grid": 0, "tags": [ "pointer right" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 26, "id": 21, @@ -649,8 +818,9 @@ "name": "pointer-right", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 25 + "setIdx": 0, + "setId": 1, + "iconIdx": 32 }, { "icon": { @@ -660,8 +830,10 @@ "grid": 0, "tags": [ "pointer left" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 27, "id": 20, @@ -670,8 +842,9 @@ "name": "pointer-left", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 26 + "setIdx": 0, + "setId": 1, + "iconIdx": 33 }, { "icon": { @@ -681,8 +854,10 @@ "grid": 0, "tags": [ "flag" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 28, "id": 12, @@ -691,8 +866,9 @@ "name": "flag", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 27 + "setIdx": 0, + "setId": 1, + "iconIdx": 34 }, { "icon": { @@ -702,8 +878,10 @@ "grid": 0, "tags": [ "expand" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 29, "id": 11, @@ -712,8 +890,9 @@ "name": "expand", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 28 + "setIdx": 0, + "setId": 1, + "iconIdx": 35 }, { "icon": { @@ -723,8 +902,10 @@ "grid": 0, "tags": [ "envelope" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 30, "id": 10, @@ -733,8 +914,9 @@ "name": "envelope", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 29 + "setIdx": 0, + "setId": 1, + "iconIdx": 36 }, { "icon": { @@ -744,8 +926,10 @@ "grid": 0, "tags": [ "compare full" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 31, "id": 9, @@ -754,8 +938,9 @@ "name": "compare-full", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 30 + "setIdx": 0, + "setId": 1, + "iconIdx": 37 }, { "icon": { @@ -765,8 +950,10 @@ "grid": 0, "tags": [ "compare empty" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 32, "id": 8, @@ -775,8 +962,9 @@ "name": "compare-empty", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 31 + "setIdx": 0, + "setId": 1, + "iconIdx": 38 }, { "icon": { @@ -786,8 +974,10 @@ "grid": 0, "tags": [ "comment" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 33, "id": 7, @@ -796,8 +986,9 @@ "name": "comment", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 32 + "setIdx": 0, + "setId": 1, + "iconIdx": 39 }, { "icon": { @@ -807,8 +998,10 @@ "grid": 0, "tags": [ "up" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 34, "id": 34, @@ -817,8 +1010,9 @@ "name": "up", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 33 + "setIdx": 0, + "setId": 1, + "iconIdx": 40 }, { "icon": { @@ -828,8 +1022,10 @@ "grid": 0, "tags": [ "down" - ] + ], + "attrs": [] }, + "attrs": [], "properties": { "order": 35, "id": 33, @@ -838,8 +1034,9 @@ "name": "down", "ligatures": "" }, - "setIdx": 1, - "iconIdx": 34 + "setIdx": 0, + "setId": 1, + "iconIdx": 41 } ], "height": 1024, @@ -870,6 +1067,8 @@ "gridSize": 16, "showLiga": false, "search": "", - "showGrid": false + "showGrid": false, + "showQuickUse2": true, + "showSVGs": true } } \ No newline at end of file diff --git a/lib/web/mage/validation.js b/lib/web/mage/validation.js index 1bc9729b4dad2c266e3d24406b960f35945fb0a1..a32bd5026d829202ddd2709ec8b1955e1d0f7cdc 100644 --- a/lib/web/mage/validation.js +++ b/lib/web/mage/validation.js @@ -901,7 +901,7 @@ } return hasWithValue ^ hasWithNoValue; }, - 'Field is not complete.' + 'The field isn\'t complete.' ], "validate-required-datetime": [ function(v, elm, param) { diff --git a/pub/errors/processor.php b/pub/errors/processor.php index 73d1925e8a300f47d534a682aecd224a152f3f23..edbbb4dd6020481a5ee403a88ada146c30332f17 100755 --- a/pub/errors/processor.php +++ b/pub/errors/processor.php @@ -511,7 +511,7 @@ class Processor . "IP Address: {$this->_getClientIp()}\n" . "First Name: {$this->postData['firstName']}\n" . "Last Name: {$this->postData['lastName']}\n" - . "E-mail Address: {$this->postData['email']}\n"; + . "Email Address: {$this->postData['email']}\n"; if ($this->postData['telephone']) { $msg .= "Telephone: {$this->postData['telephone']}\n"; } diff --git a/setup/pub/angular/angular.js b/setup/pub/angular/angular.js index 66b1d2569b7b7c174055db5672c574ee64ee809b..f53b5280f8647b6f382dd133858440fbfc91b75f 100644 --- a/setup/pub/angular/angular.js +++ b/setup/pub/angular/angular.js @@ -809,7 +809,7 @@ <div ng-controller="Controller"> <form novalidate class="simple-form"> Name: <input type="text" ng-model="user.name" /><br /> - E-mail: <input type="email" ng-model="user.email" /><br /> + Email: <input type="email" ng-model="user.email" /><br /> Gender: <input type="radio" ng-model="user.gender" value="male" />male <input type="radio" ng-model="user.gender" value="female" />female<br /> <button ng-click="reset()">RESET</button> diff --git a/setup/src/Magento/Setup/Model/ConfigGenerator.php b/setup/src/Magento/Setup/Model/ConfigGenerator.php index a1a07d52e20bd78e6542f82aa6c8534913ae19b6..fba3107325ecd8175126775cbf4d5ad4eac14cf9 100644 --- a/setup/src/Magento/Setup/Model/ConfigGenerator.php +++ b/setup/src/Magento/Setup/Model/ConfigGenerator.php @@ -210,4 +210,18 @@ class ConfigGenerator return $configData; } + + /** + * Creates x-frame-options header config data + * + * @return ConfigData + */ + public function createXFrameConfig() + { + $configData = new ConfigData(ConfigFilePool::APP_ENV); + if ($this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT) === null) { + $configData->set(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT, 'SAMEORIGIN'); + } + return $configData; + } } diff --git a/setup/src/Magento/Setup/Model/ConfigOptionsList.php b/setup/src/Magento/Setup/Model/ConfigOptionsList.php index 64f2a58515eca8addc153c5a8e6151b6b2a5bbfc..ee76fbf6d4ee9851c4b46052fbad10ea6f274a9c 100644 --- a/setup/src/Magento/Setup/Model/ConfigOptionsList.php +++ b/setup/src/Magento/Setup/Model/ConfigOptionsList.php @@ -158,6 +158,7 @@ class ConfigOptionsList implements ConfigOptionsListInterface } $configData[] = $this->configGenerator->createDbConfig($data); $configData[] = $this->configGenerator->createResourceConfig(); + $configData[] = $this->configGenerator->createXFrameConfig(); return $configData; } diff --git a/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php b/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..12ce5af79e7dcd35dab1954cdc71020ce1cb1502 --- /dev/null +++ b/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php @@ -0,0 +1,41 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Setup\Test\Unit\Model; + + +use Magento\Framework\Config\ConfigOptionsListConstants; + +class ConfigGeneratorTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Framework\App\DeploymentConfig | \PHPUnit_Framework_MockObject_MockObject */ + private $deploymentConfigMock; + /** @var \Magento\Setup\Model\ConfigGenerator | \PHPUnit_Framework_MockObject_MockObject */ + private $model; + + public function setUp() + { + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $this->deploymentConfigMock = $this->getMockBuilder('Magento\Framework\App\DeploymentConfig') + ->disableOriginalConstructor() + ->getMock(); + $this->model = $objectManager->getObject( + 'Magento\Setup\Model\ConfigGenerator', + ['deploymentConfig' => $this->deploymentConfigMock] + ); + } + + public function testCreateXFrameConfig() + { + $this->deploymentConfigMock->expects($this->atLeastOnce()) + ->method('get') + ->with(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT) + ->willReturn(null); + $configData = $this->model->createXFrameConfig(); + $this->assertSame('SAMEORIGIN', $configData->getData()[ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT]); + } +} diff --git a/setup/src/Magento/Setup/Test/Unit/Module/ConfigOptionsListTest.php b/setup/src/Magento/Setup/Test/Unit/Module/ConfigOptionsListTest.php index f972d2e802b46b9a0bbd5b900fc421536a98b4f1..d1281f7c30c550a55188a3ebb0c3754620d8cb38 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/ConfigOptionsListTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Module/ConfigOptionsListTest.php @@ -82,8 +82,9 @@ class ConfigOptionsListTest extends \PHPUnit_Framework_TestCase $this->generator->expects($this->once())->method('createDefinitionsConfig')->willReturn($configDataMock); $this->generator->expects($this->once())->method('createDbConfig')->willReturn($configDataMock); $this->generator->expects($this->once())->method('createResourceConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createXFrameConfig')->willReturn($configDataMock); $configData = $this->object->createConfig([], $this->deploymentConfig); - $this->assertEquals(6, count($configData)); + $this->assertEquals(7, count($configData)); } public function testCreateOptionsWithOptionalNull() @@ -95,7 +96,8 @@ class ConfigOptionsListTest extends \PHPUnit_Framework_TestCase $this->generator->expects($this->once())->method('createDefinitionsConfig')->willReturn(null); $this->generator->expects($this->once())->method('createDbConfig')->willReturn($configDataMock); $this->generator->expects($this->once())->method('createResourceConfig')->willReturn($configDataMock); + $this->generator->expects($this->once())->method('createXFrameConfig')->willReturn($configDataMock); $configData = $this->object->createConfig([], $this->deploymentConfig); - $this->assertEquals(5, count($configData)); + $this->assertEquals(6, count($configData)); } } diff --git a/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php b/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php index b7697813590c90cd3845ef83ad5936ce5fb5a110..e0550e1f37097054d8d5d9ccc4d113665f9a6055 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/ServiceDataAttributesScannerTest.php @@ -34,12 +34,7 @@ class ServiceDataAttributesScannerTest extends \PHPUnit_Framework_TestCase 'Magento\Sales\Api\Data\OrderExtension', 'Magento\Sales\Api\Data\OrderItemExtensionInterface', 'Magento\Sales\Api\Data\OrderItemExtension', - 'Magento\GiftMessage\Api\Data\MessageExtensionInterface', - 'Magento\GiftMessage\Api\Data\MessageExtension', - 'Magento\Quote\Api\Data\TotalsAdditionalDataExtensionInterface', - 'Magento\Quote\Api\Data\TotalsAdditionalDataExtension' ]; - $this->assertSame($expectedResult, $this->model->collectEntities($files)); } } diff --git a/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml b/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml index 604ebb9dc9ab6850e9e98729f20a2ac9b9bfb5e1..336d89dd4ecc727b5a382ecb0e03878fef50dfaa 100644 --- a/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml +++ b/setup/src/Magento/Setup/Test/Unit/Module/Di/_files/extension_attributes.xml @@ -12,11 +12,4 @@ <extension_attributes for="Magento\Sales\Api\Data\OrderItemInterface"> <attribute code="gift_message" type="Magento\GiftMessage\Api\Data\MessageInterface" /> </extension_attributes> - <extension_attributes for="Magento\GiftMessage\Api\Data\MessageInterface"> - <attribute code="entity_id" type="string" /> - <attribute code="entity_type" type="string" /> - </extension_attributes> - <extension_attributes for="Magento\Quote\Api\Data\TotalsAdditionalDataInterface"> - <attribute code="gift_messages" type="Magento\GiftMessage\Api\Data\MessageInterface[]" /> - </extension_attributes> </config> diff --git a/setup/view/magento/setup/create-admin-account.phtml b/setup/view/magento/setup/create-admin-account.phtml index cb6b54e2c631d1b13a4bf2a181e2bf8522804275..08c4177416829f2ea7822388032cc21f3319ca1e 100644 --- a/setup/view/magento/setup/create-admin-account.phtml +++ b/setup/view/magento/setup/create-admin-account.phtml @@ -91,14 +91,14 @@ $passwordWizard = sprintf( ng-class="{'has-error': account.adminEmail.$invalid && account.submitted}" > <div class="col-m-3"> - <label class="form-label required" for="adminEmail">New E-Mail</label> + <label class="form-label required" for="adminEmail">New Email</label> </div> <div class="col-m-4"> <input id="adminEmail" class="form-el-input" tooltip-placement="right" - tooltip="Must be a correct e-mail." + tooltip="Must be a correct email." tooltip-trigger="focus" tooltip-append-to-body="true" type="email" @@ -109,10 +109,10 @@ $passwordWizard = sprintf( > <div class="error-container"> <span ng-show="account.adminEmail.$error.required"> - Please enter your new e-mail. + Please enter your new email. </span> <span ng-show="account.adminEmail.$error.email"> - Please enter a correct e-mail. + Please enter a correct email. </span> </div> </div> diff --git a/setup/view/magento/setup/success.phtml b/setup/view/magento/setup/success.phtml index f0c2867f9b727cb26da330096abccd5ce88f5a17..c75cacc1a28516be1606d480a1938a0483f4be91 100644 --- a/setup/view/magento/setup/success.phtml +++ b/setup/view/magento/setup/success.phtml @@ -22,7 +22,7 @@ <dt>Username:</dt> <dd>{{admin.username}}</dd> - <dt>E-Mail:</dt> + <dt>Email:</dt> <dd>{{admin.email}}</dd> <dt>Password:</dt>